본문 바로가기

개발 코딩 정보 공유/안드로이드 자바 코틀린

다형성의 쉬워 보이는 이해^^;

 

 

 

다형성의 쉬워 보이는 이해^^;

 

 

 

골 판지 상자 / 이미지 / pixabay

 

 

 

 

oop 의 이해 : 다형성

 

자바에는 많은 특징이 있고 그것들을 통해 자바는 객체지향적 프로그래밍이 가능하게 됩니다.

그 중에 이번장 에서는 다형성에 대해 알아보겠습니다.

 

다형성(polymorphism) 은 쉽게 말해 한가지의 형태로 다양한 각자의 행동을 취하는것을 말합니다.

 

예를 들면!

자동차 연구소가 있다고 칩니다.

그곳에는 H자동차, K자동차, B자동차 가 있다고 하죠.

다형성을 위해 아래와 같이 상속관계를 구현하는것입니다.

 

[자동차] (인터페이스)     <-     [H자동차] (클래스)

(+가속)   (+가속)

(+멈춤)   (+멈춤)

 

 

K, B 자동차도 마찬가지로 구현합니다.

이런관계를 통해서 우리가 얻는 이점이 있습니다. 

바로 특정 파생타입에만 쓸수 있는 소스를 배제할수 있다는 것입니다.

예를 들어 아래와 같은 메서드가 있다고 하죠.

 

public void myCarGoGo(자동차 myCar){

 myCar.가속();

 myCar.멈춤();

}

 

위와 같은 메서드를 통해 우리는 특정 자동차형식(K자동차냐 B자동차냐)으로 호출 해야 하는지? 

걱정할 필요가 없습니다.

왜냐? is a 의 관계가 성립되기 때문이죠. 

확인해 볼까요?

 

H자동차는 자동차 입니다. OK

K자동차는 자동차 입니까? OK

B자동차는 자동차 입니까? OK

 

정말 사실이었군요. 그렇다면 좋습니다. 믿고 저 메서드를 호출해 봅시다.

 

 

H자동차 hCar = new H자동차();

K자동차 kCar = new K자동차();

B자동차 bCar = new B자동차();

 

myCarGoGo(hCar);

myCarGoGo(kCar);

myCarGoGo(bCar);

 

 

어떤가요? 한가지형태 (자동차 type)을 통해 우리는 3가지 자동차 회사의 기능을 수행하였습니다. 

그것도 자동으로 말입니다.이는 내부적으로 late 바인딩과, 업캐스팅이 이루어지기 때문에 가능한데요. 실제로 컴파일 단계에서는 컴파일러는 단순히 이 객체가 베이스 타입이구나 하는 부분만 알지 파생타입이 뭔지는 알지 못합니다. 그래서 실행(런타임)시점에서 바인딩되어 그 타입의 메서드를 호출 하게 되는 것입니다. 이와 같은 형태가 가능한 이유는 자바가 late 바인딩을 지원하는 언어이기 때문입니다. (런타임 시점에서 바인딩) 이 경우 좋은 점은 뭘까 생각해봅니다. 

 

자동차가 어떤 자동차이던 간에 그저 myCar.가속(); 를 호출하면 되는것이죠.

컴파일러 입장에서는 무슨차인지 알필요 없습니다. 그저 베이스 타입이구나 하면 되죠.

실제로는 런타임시에 파생타입의 myCar.가속(); 가 호출되는 것이지요.

 

또한 기존의 자동차 뼈대로 확장하여 A 자동차를 만든다고 생각해 봅시다. 

 

Class A extends 자동차{

...

}

 

 

 

그러거나 말거나 A자동차 또한 myCarGoGo();를 호출하면

자동으로 자신의 myCar.가속(); myCar.멈춤(); 가 호출됩니다.

 

여기서 또한가지 내부적으로 업캐스팅이 일어나게 되는데 myCarGoGo(자동차 myCar)에서 자동차 타입을 매개변수로 받고 있다.

그러나 우리는 각각의 파생타입으로 인자를 전달하였지 않은가?

별다른 작성없이 이와 같은 캐스팅이 가능한 이유는 우리의 자바는 업캐스팅(상위타입으로 캐스팅) 을 자동 허용하기 때문이다.

(is a 관계가 성립하는 것을 생각해보면 쉽다.)

 

그럼 이만!