9장 다형성
Last updated
Last updated
다형성(Polymorphism) 이란 하나의 객체가 여러 형태를 가질 수 있는 성질을 의미합니다. !! 중요 !!
다형성의 특징으로 인해 자바에서는 부모 타입의 참조변수로 자식 타입의 객체를 참조할 수 있습니다.
자바에서는 클래스의 형변환(업캐스팅/다운캐스팅)을 통해 다형성을 구현하였습니다.
Animal 타입 참조변수 myAnimal1
에 저장된 객체는 Dog 객체를 가리키고 있어, Dog의 sound()
가 호출됩니다. 마찬가지로 myAnimal2
에 저장된 객체는 Cat객체를 가리키고 있으므로 Cat의 sound()
가 호출됩니다. 이처럼 하나의 부모타입 참조변수로 자식타입의 객체들을 다룰 수 있으므로 코드를 유연하고, 확장성 있게 기술할 수 있습니다.
자식 타입 객체를 부모 타입 참조변수로 참조하는 것.
자동 변환되며 명시적 형변환이 필요 없습니다.
다형성을 가능하게 하는 핵심 메커니즘입니다.
부모 타입 참조변수를 자식 타입으로 변환하는 것.
명시적 형변환이 필요하며, 잘못된 다운캐스팅은 런타임 오류(ClassCastException)를 발생시킬 수 있습니다.
자식에만 있는 메서드나 필드를 사용하고 싶을 때 필요합니다.
다형성의 작동원리를 이해하기 위해서는 다형성과 메모리의 관계를 파악하는게 중요합니다.
참조 타입과 객체 타입은 다를 수 있습니다.
메모리 구조:
참조변수는 스택(stack) 메모리에 저장됩니다.
객체(인스턴스)는 힙(heap) 메모리에 생성됩니다.
즉, 참조는 Animal 타입이지만, 진짜 객체는 Dog 이기 때문에, 코드실행 전인 컴파일단계에서는 Animal 클래스의 sound메서드를 가리키고 있고, 메서드를 호출할 때는 힙 메모리상의 실제 객체(Dog)의 메서드가 실행되는 것입니다.
동적 바인딩(Dynamic Binding) 이란, 프로그램 실행 중에 호출할 메서드가 결정되는 것을 말합니다.
클래스의 메서드들은 컴파일 시점에서 어떤 메서드가 호출될지 결정되지 않습니다.(상속이 불가능한 메서드 제외)
자바에서는 상속의 기능으로 부모타입의 메서드를 오버라이딩 할 수 있고, 다형성의 특징으로 인해 실제 코드 실행시 이 오버라이딩된 메서드가 실행될 수 있기 때문에, 상속이 불가능한 경우를 제외한 모든 메서드 들은 실행 시점(runtime)에 실제 객체 타입을 기준으로 메서드가 연결됩니다.
정리
다형성 덕분에 하나의 타입(Animal)으로 다양한 객체(Dog, Cat 등)를 처리할 수 있다.(업캐스팅)
동적 바인딩 덕분에 실제 객체 타입에 맞는 메서드가 호출된다.
만약 호출하고자 하는 메서드가 자식 클래스에만 존재하는 메서드라면 다운캐스팅 필요
다형성
하나의 타입으로 여러 객체를 가리킬 수 있음
메모리 관계
참조변수는 스택, 객체는 힙에 저장됨
동적 바인딩
실행 중 실제 객체 타입에 따라 메서드가 호출됨
업캐스팅/다운캐스팅ㅈ
자식 객