
오버로딩과 오버라이딩은 객체지향 프로그래밍의 다형성을 구현하는 방법 중 하나입니다. 하지만 동작 방식, 목적, 사용되는 위치가 다릅니다.
다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.
이를 통해 같은 타입의 변수로 다양한 객체를 참조하거나, 동일한 메서드 호출로 다양한 동작을 실행할 수 있습니다.
오버로딩은 하나의 클래스 내에서 이름이 같은 메서드를 여러 개 정의하는 것을 의미합니다. 메서드의 이름은 동일하지만, 매개변수의 개수, 타입, 또는 순서가 달라야 합니다.
class Calculator {
// 정수 두 개를 더하는 메서드
int add(int a, int b) {
return a + b;
}
// 정수 세 개를 더하는 메서드 (오버로딩)
int add(int a, int b, int c) {
return a + b + c;
}
// 실수 두 개를 더하는 메서드 (오버로딩)
double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println("정수 2개 덧셈: " + calc.add(10, 20));
System.out.println("정수 3개 덧셈: " + calc.add(10, 20, 30));
System.out.println("실수 2개 덧셈: " + calc.add(10.5, 20.5));
}
}
오버라이딩은 상속 관계에 있는 자식 클래스가 부모 클래스로부터 상속받은 메서드를 재정의하는 것을 의미합니다. 즉, 부모의 메서드를 자식 클래스의 상황에 맞게 변경하여 사용하는 것입니다.
protected -> public은 가능, public -> private은 불가능)@Override 어노테이션을 사용하여 컴파일러가 오버라이딩 규칙을 올바르게 따랐는지 검사하도록 권장됩니다.// 부모 클래스
class Animal {
void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// 자식 클래스
class Dog extends Animal {
@Override // makeSound() 메서드를 오버라이딩
void makeSound() {
System.out.println("멍멍!");
}
}
// 자식 클래스
class Cat extends Animal {
@Override // makeSound() 메서드를 오버라이딩
void makeSound() {
System.out.println("야옹~");
}
}
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.makeSound(); // "멍멍!" 출력
myCat.makeSound(); // "야옹~" 출력
}
}
| 구분 | 오버로딩 (Overloading) | 오버라이딩 (Overriding) |
|---|---|---|
| 정의 | 같은 이름, 다른 매개변수를 가진 새로운 메서드 추가 | 상속받은 메서드의 내용을 재정의 |
| 위치 | 같은 클래스 내 | 상속 관계의 부모-자식 클래스 간 |
| 메서드 시그니처 | 메서드 이름은 같지만, 매개변수 목록은 달라야 함 | 메서드 이름, 매개변수, 반환 타입이 모두 같아야 함 |
| 적용 시점 | 컴파일 시점 (Static Binding) | 런타임 시점 (Dynamic Binding) |
| 핵심 | 새로운 메서드를 만드는 것 | 기존 메서드를 재정의하는 것 |