
이슈 수정을 위해 생성자 오버로딩을 사용할 필요가 생겼다. 이를 잊지 않기 위해 오버로딩에 대해 정리하려고 한다.
그 과정에서 오버라이딩과의 비교가 자주 나오기 때문에, 이 두 개념을 함께 정리하고자 한다.
오버로딩과 오버라이딩은 비록 서로 다른 목적과 작동 방식을 가지고 있지만,
이들은 메소드 재정의의 중요한 형태로, 객체 지향 프로그래밍에서 메소드의 다형성을 구현하는 데 필수적인 기술이다.
오버로딩(Overloading)
오버로딩은 메서드 오버로딩과 생성자 오버로딩 두가지 형태로 나뉜다.
오버로딩은 같은 이름을 가진 메소드나 생성자를 여러 개 정의할 수 있게 하며, 매개변수의 타입, 개수, 순서에 따라 구분된다.
이를 통해 메소드나 생성자에 다양한 입력을 처리할 수 있는 유연성을 제공한다.
1. 메소드 오버로딩(Method Overloading)
오버로딩은 같은 이름의 메소드를 클래스 내에 여러 개 정의하는 것을 의미한다.
하지만 각 메소드는 매개변수의 타입, 개수, 순서가 달라야 한다.
오버로딩을 사용하는 주된 목적은 같은 기능을 하는 메소드에 대해 다양한 타입이나 개수의 매개변수를 제공할 수 있게 하여, 메소드 사용의 유연성을 높이는 것이다.
오버로딩의 조건:
- 메소드의 이름이 같아야 한다.
- 매개변수의 타입, 개수, 순서가 달라야 한다.
- 반환 타입이나 접근 제어자는 오버로딩을 구분하는 데 사용되지 않는다.
메소드 오버로딩 예시:
class MathOperation {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
2. 생성자 오버로딩(Constructor Overloading)
생성자 오버로딩은 같은 클래스 내에서 여러 개의 생성자를 정의하되, 각 생성자가 다른 매개변수의 목록을 가지게 하는 것이다.
이를 통해 객체를 생성할 때 다양한 방법으로 초기화할 수 있다.
생성자 오버로딩은 객체를 다양한 상태로 쉽게 초기화하고, 객체 생성 과정에 유연성을 제공한다.
생성자 오버로딩 예시:
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
private ItemTouchHelperListener listener;
private ItemTouchHelperExListener completionListener;
// 첫 번째 생성자: ItemTouchHelperListener 타입의 인자 하나를 받습니다.
public ItemTouchHelperCallback(ItemTouchHelperListener listener) {
this.listener = listener;
}
// 두 번째 생성자: ItemTouchHelperListener 타입과 ItemTouchHelperExListener 타입의 인자 두 개를 받습니다.
public ItemTouchHelperCallback(ItemTouchHelperListener listener, ItemTouchHelperExListener completionListener) {
this.listener = listener;
this.completionListener = completionListener;
}
.
.
.
.
}
기존에 사용되던 ItemTouchHelperCallback 클래스의 생성자는 아이템 터치에 대한 기본적인 기능을 지원하고 있었다.
이후, 드래그 앤 드롭 후 추가적인 기능이 필요하게 되었고, 이를 위해 기존 생성자에 completionListener라는 새로운 인자를 추가할 필요성이 생겼다.
그러나 ItemTouchHelperCallback을 사용하는 기존 코드가 많았기 때문에, 모든 곳에서 새로운 인자를 추가하는 것은 큰 작업이 될 것이라는 문제가 있었다.
이 문제를 해결하기 위해, 생성자 오버로딩을 사용했다. 기존에는 ItemTouchHelperListener 타입의 인자 하나만 받던 ItemTouchHelperCallback 클래스에, 이제는 ItemTouchHelperListener와 ItemTouchHelperExListener 두 타입의 인자를 모두 받을 수 있는 새로운 생성자를 추가했다.
이렇게 함으로써, 드래그 앤 드롭 후의 추가적인 기능이 필요한 경우에는 새로운 생성자를 사용하여 두 인자를 모두 전달할 수 있게 되었다.
결과적으로, 생성자 오버로딩을 사용하는 방법을 통해 기존 코드를 크게 변경하지 않으면서도 새로운 기능을 효율적으로 추가할 수 있는 방법을 제공하게 되었다. 이는 기존의 코드를 유지하면서도 필요에 따라 추가 기능을 쉽게 확장할 수 있는 유연한 해결책이 되었다.
오버라이딩 (Overriding)
오버라이딩은 상속 관계에 있는 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것을 의미한다.
오버라이딩을 통해 자식 클래스는 상속받은 메소드의 구현을 자신의 상황에 맞게 변경할 수 있다.
오버라이딩을 사용하는 주된 목적은 상속받은 메소드의 동작을 자식 클래스에 맞게 수정하여 다형성을 구현하는 것이다.
오버라이딩의 조건:
- 메소드의 이름, 매개변수의 타입과 개수, 반환 타입이 부모 클래스의 메소드와 동일해야 한다.
- 접근 제어자는 부모 클래스의 메소드보다 더 제한적이어서는 안 됩니다. 예를 들어, 부모 클래스의 메소드가 protected라면, 자식 클래스에서는 protected 또는 public으로 오버라이딩할 수 있다.
- @Override 어노테이션을 사용하여 컴파일러에게 명시적으로 오버라이딩임을 알릴 수 있다.
오버라이딩 예시:
class Animal {
void eat() {
System.out.println("Animal is eating.");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("Dog is eating.");
}
}
오버로딩(Overloading)과 오버라이딩(Overriding) 성립조건
구분 | 오버로딩 | 오버라이딩 |
메서드 이름 | 동일 | 동일 |
매개변수, 타입 | 다름 | 동일 |
리턴 타입 | 상관없음 | 동일 |
출처: https://private.tistory.com/25 [오토봇팩토리:티스토리]
참고 :
https://www.tcpschool.com/java/java_usingMethod_overloading
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
'Android > Java' 카테고리의 다른 글
[Java] Map 인터페이스와 HashMap 구분과 Map 인터페이스를 통해 HashMap을 사용하는 것이 좋은 이유 (0) | 2024.04.09 |
---|---|
[Java] 자바 빌더 패턴: 복잡한 객체 생성의 단순화와 한계점 탐구 (0) | 2024.04.09 |
[ Java ] 인터페이스(interface)의 핵심 이해: 주요 특징과 사용 예시 (0) | 2024.04.01 |
[ Java ] Java에서 문자열 처리의 효율성을 높이는 방법: StringBuilder 활용하기 (0) | 2024.03.22 |
[ Java ] Integer.parseInt(String s, int radix)를 활용한 자바에서의 진법 변환 기술 (0) | 2024.03.20 |