1. 오버로딩 (Overloading): 과적하기
"같은 이름의 함수를 여러 개 만드는 것"입니다. 트럭에 짐을 많이 싣는(Overload) 것처럼, 하나의 이름에 여러 기능을 껴 넣는다고 생각하세요.
- 핵심 : 이름은 같지만, 매개변수(개수나 타입)가 달라야 함.
- 비유 : 식당의 '주문하기' 기능. 주문하기라는 함수(메서드)는 같지만 매개변수인 메뉴명, 수량, 옵션이 다름.
주문하기(메뉴명) -> "김치찌개 하나요!"
주문하기(메뉴명, 수량) -> "김치찌개 세 개요!"
주문하기(메뉴명, 옵션) -> "김치찌개 맵게 하나요!" - 목적 : 같은 성격의 기능을 이름 하나로 편하게 쓰기 위해 사용합니다.
2. 오버라이딩 (Overriding): 덮어쓰기
"부모에게 물려받은 기능을 내 식으로 재정의하는 것"입니다. 기존의 것을 무시하고 그 위에 올라타서(Override) 새로운 내용을 쓰는 것이죠.
- 핵심 : 이름, 매개변수, 결과 타입이 부모의 것과 완전히 똑같아야 함. (내용물만 바꿈)
- 비유 : 가업 잇기
부모 클래스 (요리사): 요리하다() -> "평범한 라면을 끓인다."
자식 클래스 (스타 요리사): 요리하다() -> "트러플 오일을 넣은 고급 라면을 끓인다." - 목적 : 상속받은 기능을 자식 클래스에 맞게 바꾸기 위해 사용합니다.
3. 한눈에 비교하기
| 구분 | 오버로딩 (Overloading) | 오버라이딩 (Overriding) |
| 핵심 키워드 | 확장 / 다양화 | 재정의 / 교체 |
| 관계 | 한 클래스 내부 | 부모-자식 클래스 간 (상속) |
| 메서드 이름 | 동일함 | 동일함 |
| 매개변수 | 반드시 달라야 함 | 반드시 같아야 함 |
| 리턴 타입 | 상관없음 | 반드시 같아야 함 |
4. 오버로딩 (Overloading) 예제
오버로딩은 한 클래스 안에서 매개변수 조합만 바꿔서 여러 기능을 만드는 것입니다.
class Calculator {
// 1. 정수 두 개를 더하는 메서드
int add(int a, int b) {
return a + b;
}
// 2. 매개변수의 개수가 다른 경우 (오버로딩)
int add(int a, int b, int c) {
return a + b + c;
}
// 3. 매개변수의 타입이 다른 경우 (오버로딩)
double add(double a, double b) {
return a + b;
}
}
핵심 : add라는 이름은 같지만, 입력받는 값(int, double, 개수 등)에 따라 자바가 알아서 적절한 메서드를 골라 실행합니다.
5. 오버라이딩 (Overriding) 예제
오버라이딩은 부모의 메서드를 자식이 그대로 가져와서 내용(Body)만 싹 바꾸는 것입니다.
class Animal {
void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
// 부모의 메서드를 재정의 (오버라이딩)
@Override // 이 어노테이션은 "부모 걸 덮어쓰고 있어요!"라고 알려주는 표시입니다.
void makeSound() {
System.out.println("멍멍! 짖습니다.");
}
}
class Cat extends Animal {
@Override
void makeSound() {
System.out.println("야옹~ 우네요.");
}
}
핵심 : Dog나 Cat 객체에서 makeSound()를 호출하면, 부모의 "소리를 냅니다"가 아니라 자신이 덮어쓴 "멍멍"이나 "야옹"이 출력됩니다.
6. 한 번에 사용하는 모습
실제로 어떻게 동작하는지 메인 메서드에서 확인해 볼까요?
public class Main {
public static void main(String[] args) {
// 오버로딩 테스트
Calculator cal = new Calculator();
System.out.println(cal.add(5, 10)); // 15
System.out.println(cal.add(1.2, 3.4)); // 4.6
// 오버라이딩 테스트
Animal myDog = new Dog();
myDog.makeSound(); // 출력: 멍멍! 짖습니다. (부모 타입이지만 자식 기능이 실행됨)
}
}
💡 주의할 점 (복습)
오버로딩에서 만약 이름과 매개변수는 똑같은데 리턴 타입(int vs double)만 다르게 만들면 어떻게 될까요? 자바는 "어떤 걸 써야 할지 모르겠어!"라며 컴파일 에러를 냅니다. 반드시 매개변수 구성이 달라야 해요. 오버라이딩을 할 때는 @Override라는 글자를 써주는 게 좋습니다. 실수로 매개변수를 하나 더 넣어서 오버로딩이 되어버리는 사고를 방지해주거든요.
추가적인 읽을거리 : https://hyoje420.tistory.com/14