하위링크들

자바 다형성

Quill 2015. 5. 22. 10:17

자바 기본 문법 개념 핸드북 Main


예시


다형성

타입(=클래스, 자료형)은 다형성을 이용하여 더 풍부하고 강력해진다.

  마차라는 서양에서 먼저 등장했다고 치자. 타고 다니던 말에 바퀴를 붙이고 칸을 하나 더 달아서 사람과 짐을 안정적으로 실을 수 있는 좋은 운송 수단으로 실을 수 있다는 아이디어가 생겼고 목적에 따라서 다양한 마차가 생겨나게 된다.

마차자료형 {

    말의 종류 = 보통 말 ;
동력원 = 말;
유지비용 = 여물;
필요운전자 = 1명;

    생성자(string 필요한 말의 종류){
    this.말의 종류 = 필요한 말의 종류
}

마차자료형 여객용_마차 = new 마차자료형("보통 말");
마차자료형 운수용_마차 = new 마차자료형("힘센 말");
마차자료형 행사용_마차 = new 마차자료형("멋진 말");

  위에서 각각의 마차는 목적에 따라 그게 걸 맞는 말을 필요로 하게 된다. 그래서 생성자에 필요한 말을 넣어보았다.

  그런데 그것을 보고 온 조선의 어떤 사람이 "우리 나라에는 말은 없고 소가 있으니 소로 바꾸어 이 기구를 사용해보면 농업에 도움이 되겠다" 생각을 한 것이다. 자 그렇게 되면 마차라는 것은 이제 애매해진다. 애초에 말을 안쓰면 마차라는 개념은 쓸 수 없기 때문이다. 하지만 원리는 거의 비슷하다. 사실 거의 같다. 소 달구지를 만들기 위해 아주 새로운 자료형을 개발할 필요는 없는 것이다. 다만 약간의 변형이 필요할 뿐이다.
 

 소달구지자료형 {
 동력원 = 소;  
 }

 new 소달구지자료형 누런소달구지 = new 마차자료형("없음")

  자 이렇게 하면 소달구지자료형을 만들기 위해서 여러 말을 하지 않고 바뀐 요소만 딱 덮어 써도 소달구지는 완성이 된다. 바뀐것은 동력원 뿐이기 때문이다. 나머지는 그냥 상속을 받기 때문에 그대로 사용가능하다.
  이때 바뀐 부분만 덮어 써서 사용하는 것을 오버라이딩이라고 한다.

  그럼 이렇게 되었을 때 단점은 무엇이 있을까. 애초에 마차자료형에 없었던 함수나 필드는 새로 만들 수 없다는 것이다. 예를 들어 소달구지자료형에 [운송용 소의 농사 경험]을 숫자로 받는 필드가 필요하다고 생각해보자. 3년동안 농사를 짓다가 온 소와 10년동안 농사를 짓다가 온 소의 배치를 다르게 하기 위해서라는 말도 안되는 이유를 위해서 그렇게 한다고 치자. 애초에 마차 클래스에서는 말을 배치할 때 농사 경험을 그 기준으로 삼지 않았기 때문에 이러한 필드가 필요하지 않았다. 자 그럼 지금은 소달구지 배치에 그게 필요하니까 소달구지 클래스에 농사 경험 필드를 만들면 되지 않느냐 싶지만 그게 안된다.

  재활용을 도와준다는 점에서 매우 만족일뻔 했는데 거참 번거로운 일이 아닐 수 없다. 그런데 이것이 바로 장점이 되기도한다. 소달구지의 인스턴스가 마자자료형을 상속 받았음을 알게 된 순간 소달구지의 요소들을 모두 파악할 수 있게 되는 것이다. 이러한 제약 요소는 오히려 안정성에 기여하게 된다. 

  예를 들어 버튼이 2개인 간단리모콘클래스를 생성했다고 치자. 이 간단리모콘클래스는 전등을 켜고 끄는데도 사용 할 수 있고, 차문을 열고 닫는 것에도 사용할 수 있다. "그러면 버튼이 두개이니 이 곳에 어떤 기능을 집어 넣을지는 너희들이 알아서 하라"라는 용도의 클래스를 생성 할 수 있고 이 클래스를 바로 "인터페이스"라고 부른다. 

  new 작은방전등온오프리모콘 = new 간단리모콘인터페이스();

  자 이렇게 하면 작은방전등온오프리모콘을 만들기 위해서 버튼을 만들고 어쩌고 하는 작업들을 다 생락하고 버튼을 누르면 어떤 일이 일어나게 할지만 오버라이딩하여 결정하여 사용하면 되는 것이다. 대신 앞서 말한 것처럼 상위 인터페이스에 없던 내용을 가져올 수는 없다. 이 단점은 대신에 중복 상속이나 다중 상속을 통해 해결하기도한다. 


요약명

 * 클래스의 다형성은 보통 부모 클래스의 자료형으로 생성 된 자식클래스의 인스턴스를  만드는 형태로 진행되며 이렇게 만든 인스턴스는 부모 클래스에서 오버라이딩 되지 않은 자식 클래스의 필드를 사용 할 수 없게 만든다. 부모 클래스에서 물려받거나 물어받은 후 다른 걸로 바꾼 (오버라이딩) 것만 사용 할 수 있는 것이다.

 

반응형