자바 프로그래밍에서 메서드 오버로딩과 오버라이딩은 객체지향 프로그래밍의 중요한 개념 중 하나입니다. 이 두 가지 개념은 메서드의 다형성을 구현하는 방법으로, 코드의 재사용성과 유연성을 높이는 데 기여합니다. 이번 포스팅에서는 각 개념을 설명하고, 실제 예시 코드를 통해 그 작동 원리를 살펴보겠습니다.
1. 메서드 오버로딩 (Method Overloading)
메서드 오버로딩은 같은 이름의 메서드를 여러 개 정의하는 것을 말합니다. 이때 메서드들은 매개변수의 타입, 개수, 순서가 서로 달라야 합니다. 메서드 오버로딩은 컴파일러가 전달되는 인자를 기반으로 어떤 메서드를 호출할지 결정합니다.
예시 코드
class Parent {
void print(int x) {
System.out.println("Parent - int: " + x);
}
void print(double x) {
System.out.println("Parent - double: " + x);
}
void print(String x) {
System.out.println("Parent - String: " + x);
}
}
class Child extends Parent {
void print(int x, int y) {
System.out.println("Child - int, int: " + x + ", " + y);
}
}
public class MethodOverloadingExample {
public static void main(String[] args) {
Parent parent = new Parent();
Child child = new Child();
parent.print(10); // Parent - int: 10
parent.print(3.14); // Parent - double: 3.14
parent.print("Hello"); // Parent - String: Hello
child.print(2, 3); // Child - int, int: 2, 3
}
}
2. 메서드 오버라이딩 (Method Overriding)
메서드 오버라이딩은 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 동일한 시그니처(메서드 이름, 매개변수 목록, 리턴 타입)로 다시 정의하는 것입니다. 이렇게 하면 자식 클래스의 인스턴스에서 부모 클래스의 메서드 대신 자식 클래스에서 정의한 메서드가 호출됩니다. 오버라이딩을 통해 다형성을 구현할 수 있습니다.
예시 코드
class Parent {
void display() {
System.out.println("Parent's display method");
}
}
class Child extends Parent {
@Override
void display() {
System.out.println("Child's display method");
}
}
public class MethodOverridingExample {
public static void main(String[] args) {
Parent parent = new Parent();
Child child = new Child();
parent.display(); // Parent's display method
child.display(); // Child's display method
// 다형성을 이용한 예시
Parent polymorphicReference = new Child();
polymorphicReference.display(); // Child's display method (runtime에 결정됨)
}
}
결론
메서드 오버로딩과 오버라이딩은 객체지향 프로그래밍의 핵심 개념 중 하나로, 코드의 유연성과 재사용성을 높이는 데 중요한 역할을 합니다. 메서드 오버로딩은 같은 이름의 메서드를 다양한 매개변수로 정의하여 다양한 상황에 대응할 수 있게 합니다. 반면에 메서드 오버라이딩은 상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 재정의하여 다형성을 실현합니다. 이를 통해 객체지향 프로그래밍의 주요 개념들을 활용하여 코드를 보다 유연하고 효율적으로 작성할 수 있습니다.