728x90
오버로딩과 오버라이딩 모두 다형성과 관련 있지만 다른 개념이다.
✅ 정리
- 오버로딩(Overloading) → 같은 클래스에서 같은 이름의 메서드를 여러 개 정의 (매개변수 다르게)
- 오버라이딩(Overriding) → 상속받은 부모 클래스의 메서드를 자식 클래스에서 재정의 (메서드 이름, 매개변수, 반환 타입 동일)
즉, 오버로딩은 같은 이름의 메서드 여러 개, 오버라이딩은 상속받은 메서드를 새롭게 정의하는 것
1. 오버로딩(Overloading)
👉 같은 클래스 내에서 같은 이름의 메서드를 매개변수의 개수나 타입을 다르게 해서 여러 개 정의하는 것
특징
- 같은 클래스 안에서 이루어짐
- 메서드 이름은 동일하지만 매개변수의 개수, 타입, 순서가 달라야 함
- 반환 타입(return type)은 오버로딩에 영향을 주지 않음
- 컴파일러가 매개변수를 보고 호출할 메서드를 결정(컴파일 타임 결정 → 정적 바인딩)
- 메서드의 기능을 유사하게 유지하면서 다양한 입력을 받을 수 있도록 함
예제 (Java)
class MathUtil {
// 오버로딩: 메서드 이름은 동일하지만 매개변수의 타입이 다름
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;
}
}
public class Main {
public static void main(String[] args) {
MathUtil mu = new MathUtil();
System.out.println(mu.add(2, 3)); // int 버전 호출
System.out.println(mu.add(2.5, 3.5)); // double 버전 호출
System.out.println(mu.add(1, 2, 3)); // 3개 인자 버전 호출
}
}
📌 정리: 같은 이름의 메서드를 다양한 매개변수 형태로 정의하여 코드의 가독성을 높이고 편리하게 사용할 수 있음.
2. 오버라이딩(Overriding)
👉 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의하는 것
특징
- 상속 관계에서 부모 클래스의 메서드를 자식 클래스가 재정의하는 것
- 메서드 이름, 매개변수, 반환 타입이 동일해야 함
- 접근 제한자는 부모 메서드보다 더 강한 수준으로 설정할 수 없음 (예: 부모가 public이면 자식도 public이어야 함)
- 동적 바인딩(dynamic binding) → 런타임 시 실제 객체의 타입에 따라 메서드가 결정됨
예제 (Java)
class Animal {
void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override // 오버라이딩: 부모의 메서드를 재정의
void makeSound() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
myDog.makeSound(); // "멍멍!" 출력 (자식 클래스의 메서드가 실행됨)
}
}
📌 정리: 부모 클래스로부터 상속받은 메서드를 자식 클래스가 필요에 맞게 재정의하여 다형성을 구현할 수 있음.
3. 오버로딩 vs 오버라이딩 비교 정리
구분오버로딩(Overloading)오버라이딩(Overriding)
적용 대상 | 같은 클래스 내 | 상속 관계 (부모-자식 클래스) |
메서드 이름 | 동일 | 동일 |
매개변수 | 다르게 정의해야 함 | 완전히 동일해야 함 |
반환 타입 | 상관없음 | 부모와 동일해야 함 (일부 경우 covariant return 가능) |
접근 제한자 | 영향 없음 | 부모보다 좁아질 수 없음 |
실행 시점 | 컴파일 타임(정적 바인딩) | 런타임(동적 바인딩) |
4. 언제 사용하면 좋을까?
- 오버로딩: 같은 기능을 하되, 다양한 입력을 받을 수 있도록 유연하게 메서드를 설계할 때
- 오버라이딩: 부모 클래스로부터 상속받은 기능을 자식 클래스에 맞게 수정하여 다형성을 구현할 때
🔥 결론
- 오버로딩은 "같은 클래스 내에서" 같은 이름의 메서드를 여러 개 정의하는 것.
- 오버라이딩은 **"부모 클래스의 메서드를 자식 클래스에서 재정의"**하는 것.
- 오버로딩은 컴파일 타임에 결정, 오버라이딩은 런타임에 결정.