본문 바로가기

Java

자동타입변환2 필드의 당형성

다형성에서 필드의 다형성을 이번에는 코드로 살펴보자 항상 말하지만 이것이 자바다의 예제와 설명을 참고한다.

자동타입변환 앞에서 정리하면서 대충 어떤건지는 감이 왔다. 근데 이거 왜 쓰는건가?/

기술적 방법 때문이라고 한다. 다형성이란 동일한 타입을 사용하면서 다양한 값이 나오는 것을 말한다. 부모 클래스와 자식 클래스를 매개 변수, 필드로 사용할 때는 코드상으로는 다른 타입이다. 이것을 통일화 시켜주는 것이라고 생각한다. 

이것을 통일함으로서 실행클래스에서는 코드의 수정없이 자식 클래스, 부모클래스만 수정 함으로서 다양한 값을 출력할수있게 하기때문이다.

앞과 마찬가지로 자동차로 예를 들어보자 승용차는 승용차 규격의 타이어를 가지고 있다. 만약 기존에 사용하던 승용차 규격의 타이어가 문제가 생긴다면>? 우리는 언제든 다른 승용차 규격의 타이어라면 한국타이어든 , 금호 타이어든 바꿔 사용할수있고 그에따라 성능의 차이도 생길것이다.

여기서 자동차를 실행클래스, 승용차 규격을 부모클래스라고 보자 자동차에는 "승용차 규격" 만을 사용할 수 있게 되있다.

우리는 금호타이어를 "승용차 규격"으로 바꾼 뒤 자동차에 장착시키는것이다.

그리고 이것을 하는 과정에서 자동타입변환, 상속, 오버라이딩이 사용되는 것이다.   

부모 클래스를 상속받은 자식클래스는 부모클래스의 내용을 상속받기 때문에 사용방법이 똑같을 것이다. 이 상태에서 자동타입변환으로 클래스 타입까지 부모와 동일하게 바꾸어 줌으로서 기존에 부모클래스 타입을 사용하는 실행 클래스를 수정 할 필요없이 사용할수있게 된다. 

그리고 오버라이딩으로 자식메소드를 호출 할 수있게 한다면 자식메소드의 새로은 값을 출력할수있게된다.

코드로 예를 들어보자

class Car{

Tire frontLeftTire = new Tire();

Tire frontRightTire = new Tire();

Tire backLeftTire = new Tire();

Tire backRightTire = new Tire();

void run(){.....}

}


Car클래스에는 Tire타입의 필드가 4개 있다. 

Tire타입이 있는 만큼 Tire 클래스가 있고 그안에 기본 성능의 내용이 들어가있을것이다. 

Car 객체를 만드는 순간 Tire타입의 객체 4개가 생성된다 

나중에 필드 중에 frontRight/ backLeft 타이어를 HankookTire, KumhoTire 로 바꿔야 하는 상황이 온다면??

일단 HankookTire와 KumhoTire 라는 클래스를 만들고 새로운 성능의 내용으로 오버라이딩 해 준뒤

실행클래스에서 Car객체를 만든다.

Car myCar = new Car();

그리고 교체가 필요한 타이어에 대입만 해주면된다. 

myCar.frontRightTire = new HankookTire();

myCar.backLeftTire = new KumhoTire();

myCar.run();


이런 식으로 Tire클래스를 상속받는 새로운 타이어클래스를 자동타입변환으로 넣어주면 

굳이 Car클래스의 필드를 수정하지 않고도 자식클래스를 사용할수있다.

Run메소드를 살펴보자

void run(){

frontLeftTire.roll();

frontRightTire.roll(); 

backLeftTire.roll();

backRightTire.roll();

}

run메소드는 각각의 타이어를 움직이게 하는 메소드이다. 

실행된다면 각각의 필드에서 roll()메소드를 실행시키도록 되어있다

위에서처럼 자동타입변환으로 타이어를 교체한다면 어떨까?? 교체한 타이어를 수정해야할까??

정답은 아니다 이다.

굳이 run메소드를 수정하지 않더라도 자식클래스에서 roll()와같은 메소드가 오버라이딩 되어있다면 

Run메소드는 자식 클래스의 roll()메소드를 실행시킨다.

계속해서 말했듯 큰 수정없이 같은 클래스 타입으로 여러가지 성능, 결과를 호출할수있는것 이것이 

필드의 다형성이다.


'Java' 카테고리의 다른 글

매개변수의 다형성  (0) 2018.12.21
배열로 객체관리하기  (0) 2018.12.21
자동타입변환(Promotion)  (0) 2018.12.20
타입변환. 다형성  (0) 2018.12.20
메소드 재정의(Override)와 몇가지..  (0) 2018.12.12