728x90
오버로딩(Overloading)과 오버라이딩(Overriding)의 차이점
| 구분 | 오버로딩(Overloading) | 오버라이딩(Overriding) |
| 정의 | 같은 이름의 메서드를 매개변수의 타입, 개수, 순서를 다르게 하여 여러 개 정의하는 것 | 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것 |
| 클래스 관계 | 같은 클래스 내에서 발생 | 상속 관계(부모-자식 클래스)에서 발생 |
| 메서드 이름 | 동일 | 동일 |
| 매개변수 | 다르게 정의 (타입, 개수, 순서) | 동일해야 함 |
| 반환 타입 | 다를 수도 있음 | 부모 클래스와 동일해야 함 (JDK 5 이후에는 Covariant return type 허용) |
| 접근 제한자 | 제한 없음 | 부모 클래스보다 더 강한 제한자는 사용 불가 (public → protected 가능, protected → private 불가) |
| 사용 목적 | 같은 기능이지만 다른 방식으로 사용할 때 | 부모 클래스의 기능을 자식 클래스에서 변경할 때 |
| 컴파일 시점 체크 | 컴파일러가 메서드의 시그니처를 검사하여 결정 | 런타임 시 다형성으로 결정 |
📌 오버로딩(Overloading) 예제
class Calculator {
// 정수 두 개 덧셈
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 OverloadingExample {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(2, 3)); // 정수 덧셈
System.out.println(calc.add(2.5, 3.5)); // 실수 덧셈
System.out.println(calc.add(1, 2, 3)); // 정수 3개 덧셈
}
}
🔹 오버로딩 특징
✔️ 메서드 이름이 동일하지만, 매개변수의 타입 또는 개수가 다름
✔️ 반환 타입이 다르더라도 매개변수가 같으면 오버로딩 불가능 (add(int) 와 add(int): double은 불가)
✔️ 컴파일러가 메서드 호출 시점에서 적절한 메서드를 선택
📌 오버라이딩(Overriding) 예제
// 부모 클래스
class Animal {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// 자식 클래스 - 오버라이딩
class Dog extends Animal {
@Override
void sound() { // 부모 메서드 재정의
System.out.println("멍멍!");
}
}
// 자식 클래스 - 오버라이딩
class Cat extends Animal {
@Override
void sound() { // 부모 메서드 재정의
System.out.println("야옹!");
}
}
public class OverridingExample {
public static void main(String[] args) {
Animal myAnimal = new Animal();
myAnimal.sound(); // 동물이 소리를 냅니다.
Animal myDog = new Dog();
myDog.sound(); // 멍멍! (오버라이딩된 메서드 호출)
Animal myCat = new Cat();
myCat.sound(); // 야옹! (오버라이딩된 메서드 호출)
}
}
🔹 오버라이딩 특징
✔️ 부모 클래스의 메서드를 자식 클래스에서 재정의
✔️ 부모 클래스의 메서드와 메서드 이름, 매개변수 타입, 개수가 동일해야 함
✔️ 부모 메서드보다 더 강한 접근 제한자를 사용할 수 없음 (public → private 불가)
✔️ @Override 어노테이션을 사용하여 컴파일러가 올바르게 오버라이딩했는지 체크 가능
✔️ 다형성(Polymorphism)을 통해 부모 타입 변수로 자식 클래스의 메서드를 호출할 수 있음
📌 오버로딩 vs 오버라이딩 요약
- 오버로딩: 같은 클래스 내에서 같은 이름의 메서드를 여러 개 정의 (매개변수 다름)
- 오버라이딩: 부모 클래스의 메서드를 자식 클래스에서 재정의 (상속 필수)
- 오버로딩은 컴파일 시 결정, 오버라이딩은 런타임 시 다형성 적용
💡 정리
✔ 오버로딩 → 메서드의 시그니처(매개변수)를 다르게 하여 같은 이름으로 여러 개 선언
✔ 오버라이딩 → 부모 클래스의 메서드를 자식 클래스에서 재정의 (상속 필요)
✔ 오버라이딩은 다형성을 활용한 동적 바인딩을 가능하게 함
728x90
'개발 > 자바' 카테고리의 다른 글
| Collections 클래스 (0) | 2025.02.20 |
|---|---|
| 컬렉션 사용의 필요성 (0) | 2025.02.20 |
| Java Enum을 활용한 전략 패턴(Strategy Pattern) 구현 (0) | 2025.02.20 |
| Java Enum에서 인터페이스 구현하기 (0) | 2025.02.20 |
| 쇼핑몰 주문 정보를 추상 클래스를 이용한 구현 예제 (0) | 2025.02.19 |