728x90
다형성 활용
Animal이 부모, Dog, Cat, Cow 가 자식인 상황
soundAnimal 매개변수가 부모인 Animal 타입이지만 다형적 참조로 가능!
코드를 분석해보자
- soundAnimal(dog) 호출 시
- soundAnimal(Animal animal) 에 Dog 인스턴스가 전달
- Animal animal = dog로 이해하면 된다. 부모는 자식을 담을 수 있다.
- 메서드 안에서 animal.sound() 메서드를 호출한다.
- animal 변수 타입은 Animal이므로 Dog 인스턴스에 있는 Animal 클래스 부분을 찾아서 sound() 메서드를 실행한다.
- 그런데 하위 클래스인 Dog에서 sound() 메서드를 오버라이딩 했다.
- 따라서 메서드가 우선권을 가진다.
- Dog class의 sound() 메서드가 호출되고 멍멍이 출력된다.
핵심이 인자 Animal animal 부분이다.
- 다형적 참조
- animal 변수는 자식인 Dog, Cat, Cow의 인스턴스를 참조할 수 있다.
- 메서드 오버라이딩
- animal.sound()를 호출해도 Dog, Cat, Cow 인스턴스 각각의 sound()를 호출할 수 있다.
- 만약 JAVA에 메서드 오버라이딩이 없었다면 모두 Animal의 sound가 호출되었을 것이다.
추가 질문 내용 기록
다형적 참조 내용 다시 정리 (Parent poly = new Child())
- 메서드 오버라이딩은 런타임에 동작
- 컴파일 타임에는 인스턴스 정보를 알 수 없지만, 런타임에는 인스턴스 정보를 알 수 있음
- poly가 참조하는 것은 Child 인스턴스
- Child 인스턴스는 Parent를 상속하기 때문에 내부에 Parent와 Child 둘 다 존재
- 어디서부터 탐색할지는 런타임에 결정
- 이 경우엔 Parent부터 탐색
- method의 경우 override 되어있어 자식의 method를 실행 (일반적인 child -> parent 방향의 역방향)
- 이 경우엔 Parent부터 탐색
지금까지 설명한 코드에는 2가지 문제가 존재
- Animal 클래스를 생성할 수 있는 문제
- 고양이, 소와 달리 동물의 인스턴스를 만드는 것은 이상함
- Animal 클래스를 상속 받는 곳에서 sound() 메서드 오버라이딩을 하지 않을 가능성(구현 x)
728x90
'프로그래밍 > Java' 카테고리의 다른 글
[실전 자바-기본편] 인터페이스 (1) | 2024.02.24 |
---|---|
[실전 자바-기본편] 추상 클래스 (0) | 2024.02.24 |
[실전 자바-기본편] 다형성 (0) | 2024.02.21 |
[실전 자바-기본편] 상속 (0) | 2024.02.15 |
[실전 자바-기본편] final (0) | 2024.02.14 |
댓글