Java 다형성의 동작 원리와 활용

다형성(Polymorphism)은 동일한 메시지에 대해 객체의 실제 타입에 따라 서로 다른 방식으로 응답하는 객체지향의 핵심 특성입니다. 같은 인터페이스나 메서드 호출이 구현체에 따라 다양한 동작을 수행할 수 있는 능력을 의미합니다.

다형성의 실제 의미

일상생활에서 다형성은 흔히 발견됩니다. 예를 들어 '교통수단'이라는 개념은 버스, 지하철, 택시 등 구체적인 형태로 존재합니다. Java에서도 마찬가지로 Vehicle 타입의 참조변수가 Bus 인스턴스를 가리킬 수 있으며, 이는 하나의 객체가 여러 타입의 성격을 동시에 지님을 표현합니다.

업캐스팅(Upcasting) 구문

Base ref = new Derived();

다형성이 작동하기 위한 3가지 조건

  • 상속 관계: 기반 클래스와 파생 클래스 간의 계층 구조가 필수적입니다.
  • 메서드 오버라이딩: 파생 클래스에서 기반 클래스의 메서드를 재정의하여 자신만의 구현을 제공합니다.
  • 업캐스팅: 파생 클래스의 인스턴스를 기반 클래스 타입의 참조변수에 할당합니다.

메서드 호출의 핵심 원칙

다형적 방식으로 메서드를 호출할 때, 컴파일러는 참조변수의 선언 타입(기반 클래스)에 해당 메서드의 존재 여부를 확인합니다. 존재하지 않으면 컴파일 에러가 발생합니다. 존재하면 런타임에 실제 참조하는 객체의 타입(파생 클래스)에서 오버라이딩된 메서드를 실행합니다.

다형성의 두 가지 분류

종류시점메커니즘
정적 다형성컴파일 타임메서드 오버로딩 - 매개변수 시그니처로 메서드 선택
동적 다형성런타임메서드 오버라이딩 + 동적 바인딩 - 실제 객체 타입으로 메서드 결정

다형성 환경에서 멤버 접근 규칙

1. 필드 접근: 선언 타입 기준

필드는 참조변수의 선언 타입에 정적으로 바인딩됩니다.

class Base {
    int value = 100;
}

class Derived extends Base {
    int value = 200;
}

Base obj = new Derived();
System.out.println(obj.value);  // 출력: 100 (Base의 필드)

2. 메서드 호출: 실제 객체 타입 기준

인스턴스 메서드는 런타임에 실제 객체의 타입에 따라 동적으로 바인딩됩니다.

class Base {
    String display() { return "Base method"; }
}

class Derived extends Base {
    @Override
    String display() { return "Derived method"; }
}

Base obj = new Derived();
System.out.println(obj.display());  // 출력: Derived method

3. 생성자 실행 순서

파생 클래스 인스턴스 생성 시 기반 클래스의 생성자가 먼저 실행되어 상위 클래스의 상태를 초기화한 후, 파생 클래스의 생성자가 실행됩니다.

실전 활용 예시

abstract class Payment {
    abstract void process();
}

class CardPayment extends Payment {
    @Override
    void process() {
        System.out.println("카드 결제 처리");
    }
}

class MobilePayment extends Payment {
    @Override
    void process() {
        System.out.println("모바일 결제 처리");
    }
}

// 클라이언트 코드
void executePayment(Payment payment) {
    payment.process();  // 실제 전달된 객체의 타입에 따라 다른 동작
}

executePayment(new CardPayment());    // 카드 결제 처리
executePayment(new MobilePayment());  // 모바일 결제 처리

이러한 설계는 새로운 결제 수단이 추가되어도 클라이언트 코드를 수정하지 않고 확장할 수 있는 유연한 구조를 제공합니다.

태그: java Polymorphism Method Overriding Dynamic Binding Upcasting

7월 8일 18:48에 게시됨