더북(TheBook)

동적 메서드 조회 덕분에 empl.getSalary() 호출은 empl이 참조하는 객체에 속한 getSalary 메서드(Employee.getSalary, Manager.getSalary, Janitor.getSalary)를 호출한다.

icon Caution

자바에서 슈퍼클래스 할당은 배열에도 적용된다. 다시 말해 Manager[ ] 배열을 Employee[ ] 변수에 할당할 수 있다(기술적인 용어로 표현하면 자바 배열은 공변(covariant)3한다). 편리한 규칙이지만 타입 오류를 일으킬 가능성이 있으므로 적절하지는 않다. 다음 예를 보자.


Manager[ ] bosses = new Manager[10];

Employee[ ] empls = bosses; // 자바 규칙에 맞다.

empls[0] = new Employee(...); // 실행 시간 오류


Employee[ ]Employee를 저장할 수 있으므로 컴파일러는 마지막 문장을 올바른 문장으로 받아들인다. 하지만 emplsbossesEmployee를 저장할 수 없는 Manager[ ]를 참조한다. 이런 실수는 실행 시간에 가상 머신이 ArrayStoreException을 던지는 순간에나 발견된다.


3 이것은 6.4 타입 가변성과 와일드카드에서 설명하는 타입 가변성(type variance)의 한 형태다. 구성 요소 사이에 서브타이핑(즉, 슈퍼타입에 작용하는 연산이 서브타입에도 작용) 관계를 유지함을 의미한다. 타입 가변성은 복합 구조(복합 타입, 함수 등) 사이의 서브타이핑(subtyping)이 구성 요소 사이의 서브타이핑과 어떤 관계를 유지하는지 나타내는 개념이다. 서브타이핑 관계는 유지(공변), 역전(반공변), 무시(불변) 중 하나가 된다. 자세한 내용은 http://goo.gl/j19XGL을 참고한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.