오버로딩(Overloading)과 오버라이딩(Overriding)
1. 오버로딩(Overloading)
- 같은 클래스 내에서 메서드 이름은 동일하지만, 매개변수의 타입, 개수, 순서를 다르게 정의하여 메서드를 재사용하는 방식.
- 컴파일 시점에서 호출할 메서드가 결정되므로 정적 바인딩(Static Binding)에 해당.
특징
- 메서드 이름은 동일.
- 매개변수의 타입, 개수, 순서가 달라야 함.
- 리턴 타입은 오버로딩과 관계가 없음.
- 컴파일러가 메서드를 호출하기 전에 매개변수 시그니처를 기준으로 호출할 메서드를 결정.
예제 코드
class OverloadingExample {
void print(String message) {
System.out.println("Message: " + message);
}
void print(String message, int count) {
for (int i = 0; i < count; i++) {
System.out.println("Message: " + message);
}
}
void print(int number) {
System.out.println("Number: " + number);
}
}
public class Main {
public static void main(String[] args) {
OverloadingExample example = new OverloadingExample();
example.print("Hello");
example.print("Hi", 3);
example.print(42);
}
}
2. 오버라이딩(Overriding)
- 상속 관계에서 자식 클래스가 부모 클래스의 메서드를 재정의하는 방식
- 런타임 시점에 호출할 메서드가 결정되므로 동적 바인딩(Dynamic Binding)에 해당
특징
- 부모 클래스의 메서드와 이름, 매개변수 시그니처, 리턴 타입이 동일해야 함
- 접근 제어자는 부모 메서드와 같거나 더 넓은 범위를 가져야 함
- @Override 어노테이션을 사용해 재정의를 명시할 수 있음
- 부모 클래스의 메서드를 호출하려면 super 키워드를 사용
예제코드
class Parent {
void show() {
System.out.println("Parent class method");
}
}
class Child extends Parent {
@Override
void show() {
System.out.println("Child class method");
}
}
public class Main {
public static void main(String[] args) {
Parent parent = new Parent();
Parent child = new Child();
parent.show();
child.show();
}
}
3. 주요 사용 사례
오버로딩 사용 사례
- 메서드의 이름은 유지하면서 다양한 매개변수 조합에 대응할 때 사용.
- 예시 : 입력값에 따라 다른 처리를 해야 하는 경우
void add(int a, int b);
void add(double a, double b);
void add(int a, int b, int c);
오버라이딩 사용 사례
- 부모 클래스의 기본 동작을 재정의하고 싶을 때 사용.
- 예시 : 다형성을 활용해 부모 메서드를 호출하지만 자식 클래스에서 서로 다른 동작을 구현할 때
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("Dog barks");
}
}