본문 바로가기
개발/JAVA

03. 자바 상속과 다형성 (개념 설명 & 예제)

by pastry 2014. 11. 25.

일딴 코드를 이해해 보자.

 

※변수나 메소드나 상속의 개념은 크게 다른게 없기 때문에 메소드만으로 설명하려 한다.

 

이해를 편하게 하기 위해 동물 - 포유류 - 사람 설정해 놓았다.

 

사람은 포유류를 상속 받았고 포유류는 동물을 상속 받았다.

따라서 가장 하단에 있는 사람은 상속 받은 모든 메소드를 사용 할 수 있게된다.

객체를 생성하는 방법을 보면

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

댓글