Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 런타임 다형성(Runtime Polymorphism) 개념과 예제로 쉽게 이해하기

자바에서 메서드 오버라이딩(Method Overriding)런타임 다형성(Runtime Polymorphism)의 대표적인 예입니다. 메서드 오버라이딩이란 하위 클래스(서브클래스)가 상위 클래스(슈퍼클래스)에 정의된 메서드와 동일한 시그니처(메서드 이름, 매개변수, 반환 타입)를 가진 메서드를 재정의하는 것을 말합니다.

여기서 중요한 점은 컴파일 시점과 실행 시점의 동작 방식이 다르다는 것입니다.

  • 컴파일 타임(Compile Time): 컴파일러는 참조 변수의 타입을 기준으로 메서드 호출이 유효한지 검사합니다.
  • 런타임(Runtime): JVM(자바 가상 머신)이 실제 객체의 타입을 판단하고, 해당 객체에 속한 메서드를 실행합니다.

즉, 참조 변수가 상위 클래스 타입이더라도 실제 생성된 객체가 하위 클래스라면, 실행 시점에는 하위 클래스에서 오버라이딩된 메서드가 호출됩니다. 이것이 바로 런타임 다형성(동적 메서드 디스패치, Dynamic Method Dispatch)입니다.

예제 코드

다음 예제를 통해 런타임 다형성의 개념을 확인해 보겠습니다.

class Animal {
    public void move() {
        System.out.println("Animals can move");
    }
}

class Dog extends Animal {
    public void move() {
        System.out.println("Dogs can walk and run");
    }
}

public class TestDog {
    public static void main(String args[]) {
        Animal a = new Animal(); // Animal 참조 변수, Animal 객체
        Animal b = new Dog();    // Animal 참조 변수, Dog 객체

        a.move(); // Animal 클래스의 move() 메서드 실행
        b.move(); // Dog 클래스의 move() 메서드 실행
    }
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Animals can move
Dogs can walk and run

결과 분석

변수 a는 Animal 타입의 참조 변수이며 Animal 객체를 가리키므로, Animal 클래스의 move() 메서드가 호출됩니다.

반면 변수 b는 Animal 타입으로 선언되었지만 실제로는 Dog 객체를 참조하고 있습니다. 컴파일 시점에는 Animal 타입에 move() 메서드가 존재하는지만 확인하고, 실행 시점에는 JVM이 실제 객체인 Dog의 오버라이딩된 move() 메서드를 실행합니다.

이처럼 하나의 메서드 호출이 객체의 실제 타입에 따라 서로 다른 동작을 수행하는 것이 자바 런타임 다형성의 핵심입니다. 이를 활용하면 코드의 유연성과 확장성을 크게 높일 수 있습니다.