본문 바로가기
프로그래밍/Java

[실전 자바-기본편] 다형성 활용

by Dean30 2024. 2. 24.
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 방향의 역방향)

 

 

 

지금까지 설명한 코드에는 2가지 문제가 존재

  • Animal 클래스를 생성할 수 있는 문제
    • 고양이, 소와 달리 동물의 인스턴스를 만드는 것은 이상함
  • Animal 클래스를 상속 받는 곳에서 sound() 메서드 오버라이딩을 하지 않을 가능성(구현 x)

 

728x90

댓글