Development/Java

(JAVA)다형성의 개념

duckworth 2016. 3. 16. 13:39


#1.다형성

오늘은 다형성에 관하여 글을 써보겠습니다.

다형성은 extends로 사용하는 상속과 더불어 객체지향에서 가장 중요한 특징입니다.(다형성을 이해하기 위해서는 상속에 대한 개념이 필수적입니다!)

다형성은 여러 가지의 형태를 가질 수 있는 능력이라 하며, 한 타입의 참조변수로 

여러 타입의 객체를 참조할 수 있도록 한다는 개념이라 볼 수 있습니다.


더 나아간다면 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수

있도록 한다는 것입니다.

예를 들자면, 

1
2
3
4
 
pencilcase pc = new pencil(); 
/* class pencil이 class pencilcase를 .
    상속받아서 class pencil extends pencilcase 상태이다 */
cs

감이 오시나요? 부모인 pencilcase 클래스가 참조변수 pc로 자손 클래스의 인스턴

인 pencil 클래스를 참조하도록 하였습니다. 

현재쓰는 문법이 모순적이라 생각하시는 분들도 있을수 있겠지만 이 방식은 정말 

자바에 있어서 중요한 개념이고 납득이 가는 설명은 뒤로 진행하다보시면 납득 

실수 있으실것 같습니다.


일반적으로 우리가 인스턴스를 참조 변수로 사용할때 같은 타입으로 합니다 

예를들면

1
2
3
pencilcase pc = new pencilcase();
pencil p = new pencil();
 

cs

이런식으로 표현을 합니다.

이번에는 더 나아가서, 같은 인스턴스 참조와 다른 인스턴스 참조를 비교하여 보겠습니다.

1
2
3
pencil p = new pencil();
pencilcase pc = new pencil();
 

cs

예시 2번째 줄의 참조변수 pc로 실제 인스턴스인 pencil을 쓴다할지라도 참조변수 

인 pc로는 pencil 의 기능을 전부 사용할수 없습니다.

이론적으로 설명을 드리자면 상속에서 자손타입 클래스가 부모 클래스보다 더 많

은 멤버를 가지는데 자손클래스는 부모클래스의 확장판이므로 

이전버전인 부모클래스는 업그레이드된 버전인 자식클래스의 멤버를 전부 사용할

수가 없습니다. 구식이니까요. 



그렇다면 반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조하는건 어떨까요?

1
2
pencil p = new pencilcase();
 
cs

하지만 이런식으로 컴파일을 한다면 에러가 발생합니다.

더많은 멤버 개수를 가진 자손인 pencil p는 

같거나 더 적은 멤버 개수를 가질수 밖에 없는 부모클래스 pencilcase를 참조해버리

므로 오류가 발생합니다.(장난감 7개를 뭘해도 5개밖에 들어가지 않는상자에 쑤

넣어도 들어가지 않는 개념이라 보시면 편합니다.) 


마지막으로 참조변수의 중요한 특징들과 익힌 것들을 정리해보겠습니다.

1.클래스는 상속을 통해서 확장될수있지만 축소될 수는 없다.(그러므로 조상 인스턴스 멤버개수는 자손 인스턴스 멤버개수보다 항상 적거나 같다.)

2.참조변수의 타입이 참조변수가 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 개수를 결정한다.

3.모든 참조변수는 4 Byte의 주소값을 가진다.

4.조상타입의 참조변수로 자손타입의 인스턴스를 참조할수 있다.

5.하지만 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.