시작하기 앞서
정처기에도 나왔고 장학재단에도 나왔고 경대병원에도 나온
상속과 다형성문제 매번 나올때마다 유형이 살짝씩 달라서
한번씩 다 틀린걸로 기억한다.
그러므로 오늘 제대로 코딩 돌려보고 종결내도록 하자.
자바 상속 다형성 #1
출력
Dog says Bark
수컷
풀이
이 부분은 Java의 다형성과 필드 접근 방식 차이 때문이다.
Java에서는 메서드는 다형성을 따르지만 필드는 그렇지 않기 때문이다.
animal.Sound()
를 호출하면 Java는 런타임 다형성을 적용해 Dog의 Sound()를 실행한다.
이를 메서드 오버라이딩이라고한다.
하지만 필드 접근은 컴파일 시점에 결정된다.
animal.gender를 참조할 때 Java는 animal의 선언타입인 ANimal을 기준으로 gender를 가져온다.
그럼 animal을 (Dog)를 통해 캐스팅 되지않느냐?
캐스팅은 객체의 타입을 변환시키는 데 사용된다. 이는 메서드나 변수 전체에 대해 적용되지만
특정 필드에만은 적용할 수 없기에 (Dog)animal.gender
를 하게 되면 구문 오류를 발생시킨다.
만약 하고싶다면 animal 객체 자체를 묶어 ((Dog)animal).gender
를 하게된다면
Dog로 캐스팅되어 암컷
을 출력할 수 있다.
물론 Dog animal = new Dog()
로 선언되었다면 Dog class 필드를 가져온다.
출력
Dog says Bark
수컷
풀이
Java에서는 다중상속을 지원하지않기에 interface를 활용하기도 한다.
그래서인지 interface로 구현되있는 문제도 출제가 되는데
interface 특성상 필드는 작성할 수 있지만 메서드 구현은 안된다.
구조만 제공하는 껍데기인셈
그래서 어떠한 방식으로 animal says..
는 출력 할 수 없다.
Aniaml dog = new Animal()
같은 형식은 Class가 아닌 interface를 선언하는거라 당연히 오류난다
이도 Dog로 선언하면 Dog class를 가져오기에 암컷이 출력이된다.
여기서 다른점은 클래스 상속의 경우, 부모클래스에서 public이 아닌
protected 또는 default로 선언된 메서드를 자식클래스에서 그대로 유지가능하지만
인터페이스는 모든 메서드가 public이므로, 이를 구현하는 클래스는 반드시 public 접근 제어자를 명시해야만
메서드를 호출할 수 있다.
Dog클래스에 void Sound()라면 오류가 난다는 뜻
출력
Dog says Bark
수컷
풀이
Class 상속과 abstract 상속의 차이는 크게 미완성 클래스이냐 완성클래스이냐 차이일뿐이다
Animal dog = new Animal()은 Animal 클래스가 완성클래스여야만 가능하기에
위의 코드에서는 오류가 난다.
이하 동일 참고로 abstract는 필드에는 사용할 수 없다.