일딴 코드를 이해해 보자.
※변수나 메소드나 상속의 개념은 크게 다른게 없기 때문에 메소드만으로 설명하려 한다.
이해를 편하게 하기 위해 동물 - 포유류 - 사람 설정해 놓았다.
사람은 포유류를 상속 받았고 포유류는 동물을 상속 받았다.
따라서 가장 하단에 있는 사람은 상속 받은 모든 메소드를 사용 할 수 있게된다.
객체를 생성하는 방법을 보면
Animal animal = new Animal();
이런식으로 생성을 하게 되는데, 부모 객체에 자식을 담을 수 있으므로 여기서 문제가 발생하게 된다.
Animal human = new Human(); 가능
Human animal = new Animal(); 불가능
한글로 빗대어 표현하자면..
동물은 사람이다 X 사람은 동물이다 O
동물이 사람을 포함(사람이 동물을 상속 받았으니)하고 있기 때문에 Animal에 Human을 담는것은 가능하지만 그 반대는 불가능 하다.
그럼 아래의 코드의 결과값을 한번 추측해보자.
똑같은 (class)형에 담았기 때문에 오버라이딩만 유의하면 쉽게 유추할 수 있다.
결과값
움직일 수 있다.
울부 짖을 수 있다.
동물 답게 움직일 수 있다.
울부 짖을 수 있다.
정교하게 움직일 수 있다.
울부 짖을 수 있다.
말할 수 있다.
그럼 다른 형에 메모리를 할당에서 생성한 아래 코드의 결과값을 추측해보자.
결과값
동물 답게 움직일 수 있다.
울부 짖을 수 있다.
정교하게 움직일 수 있다.
울부 짖을 수 있다.
※speak메소드 실행 불가
왜 이런 결과가 나올까?
다시 객체를 생성하는 코드를 자세히 살펴보면
Animal animal;
animal = new Animal();
이 코드를
reference class 타입의 Animal를 로드해와서 그 형태의 데이타를 담을 animal을 만들고 - 첫번째 줄
animal이란 변수에 Animal의 생성자를 실행해서 객체를 담는다. - 두번째 줄
라고 이해해야한다.
그렇기 때문에 Animal human = new Human();이런식으로 생성된 객체는 overiding된 method는 적용이 되어있지만, Human class에서 새로 생성한 speak()에는 접근 할 수가 없다. Animal이란 그릇에 담아 놨으니 Human에서 생성한 speak()이 존재하는지 안하는지 알 방법이 없기 때문이다.
물론
Animal human = new Human();
(Human)human.speak() 이렇게 type cast를 하면 사용 가능하다. heap영역 메모리에는 올라가 있기 때문이다.
'개발 > JAVA' 카테고리의 다른 글
HashMap으로 보는 Iterator의 유용성 (2) | 2014.11.26 |
---|---|
GUI programming (0) | 2014.11.26 |
02. 상속을 이해하기 위한 기본 개념설명 (0) | 2014.11.25 |
upload list (0) | 2014.11.25 |
JDBC를 이용해 Oracle DB와 연동하기 - 2 (예제) (2) | 2014.11.25 |
댓글