JAVA나 C++과 같은 객체지향언어를 공부하는데 첫 번째로 중요하다고 할 수 있는 개념은 클래스와 상속 입니다.

실제로 프로그램을 짜기에 앞서 클래스와 상속을 얼마나 효율적으로 잘 설계하느냐에 따라 앞으로의 개발난이도가 좌우된다고 해도 과언이 아닌데요.

이제 막 자바를 공부하기 시작한 초보자들 기준으로 클래스와 상속 개념에 익숙해졌다면 그 다음으로 공부해야 할 개념은 바로 다형성(polymorphism)입니다.

 

 


 

Q. 다형성이란

 

 

 

다형성이란, 쉽게 말해서 "조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다"는 개념입니다.

이해를 돕기위해 '사람' 클래스를 만들어보았습니다.

 

class People{

    String name;

    int age;

   void working();  

   void sleeping();

}

 

 이 사람 클래스는 노동하고 잠자는 것말고는 딱히 정해진 것이 없습니다.(뭔가 슬프네요...) 

그래서 H백화점 VIP 고객으로 만들어주었습니다.

 

class HDepartmentStoreVip extends People{

    int purchasingAmount; //구매실적

    void purchasing();

}

 

(1) People p = new HDepartmentStoreVip(); 

-> 위에서 말한대로 조상클래스People의 참조변수 p자손클래스HDepartmentStoreVip의 인스턴스참조하는 것은 가능합니다. 

 

같은 타입의 클래스의 인스턴스를 참조하는 것도 물론 가능합니다.

(2) HDepartmentStoreVip h = new HDepartmentStoreVip(); 

 

하지만 당연히 차이가 존재하는데요, (2)와 같이 같은 타입의 클래스의 인스턴스를 참조할 때 참조변수는 모든 멤버를 사용할 수 있지만, (1)과 같은 경우는 애초에 People클래스에 존재하지 않는 purchasingAmount나 purchasing()과 같은 멤버는 사용할 수가 없습니다.

 

위의 개념을 이해했다면 자손클래스의 참조변수는 조상클래스의 인스턴스를 참조할 때는 어떻게 되는지 궁금할 것입니다. 정답은 "안된다" 입니다~! 애초에 자손클래스의 참조변수는 조상클래스의 멤버개수 이상이기 때문에 내가 참조하고자 하는 멤버가 없을 경우가 항상 존재합니다(그러지 않으면 굳이 만들 필요가...) .따라서 이런 경우는 프로그램 상에서 컴파일에러를 띄웁니다.

 

 


 

Q. 참조변수 형변환

 

 

기본변수와 마찬가지로 참조변수도 물론 형변환이 가능합니다. 상속관계에 있는 클래스 사이에서만 가능하고,

(1)자손->조상 (=upcasting이라고도 합니다.)

(2)조상->자손 (=downcasting)

위의 두 가지 케이스 모두 가능합니다.

 

(1)의 경우는 심지어는 조상의 조상의 조상... 까지도 형변환이 가능합니다. 하지만 여기서 두 케이스의 차이점은(1)의 경우에는 형변환이 생략가능하나, (2)의 조상에서 자손타입으로의 형변환은 생략이 불가하다는 점입니다. 간단하게 기본형 변수의 형변환만 떠올려봐도 큰 자료형에서 작은 자료형의 형변환은 생략이 불가했던 것처럼, 참조변수도 같은 원리로 적용된다고 보시면 될 것 같습니다.

 

위의 People과 HDepartmentVip 클래스로 예시를 들자면,

{

People p= null;

HDepartmentVip h1=null;

HDepartmentVip h2=new HDepartmentVip();

 

p=h2;  //->다음과 같은 경우에는 p=(People)h2; 에서 (People)형변환이 생략가능하지만,

h1=p;  //-> "error"!!!!

         //  이처럼 조상클래스 People에서 자손클래스 HDepartmentVip로 형변환할 때는

         //  무조건 h1=(HDepartmentVip)p; 과 같이 형변환을 명시해주어야 합니다.!!

}

 


오늘은 자바의 다형성개념과 참조변수의 형변환에 대해 정리하였습니다.

다음 포스팅에는 다형성의 세부개념에 대해 설명하겠습니다. 즐코하세요!

+ Recent posts