안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
자동 타입 변환이 필요한 이유 : 다형성을 구현하는 기술적 방법 때문.
다형성 : 동일한 타입을 사용하지만 다양한 결과가 나오는 성질.
주로 필드의 값을 다양화함으로써 실행 결과가 다르게 나오도록 구현하는데 ,
필드 타입은 변함이 없지만, 실행 도중 어떤 객체를 필드로 저장햐는냐에 따라 실행결과가 달라질 수 있습니다.
이것이 필드의 다양성입니다.
프로그램은 수많은 객체들이 서로 연결되고 각자의 역할을 하게 되는데
이 객체들은 다른 객체로 교환될 수 있어야합니다.
예를 들어 자동차 클래스를 처음 설계할 때 사용한 타이어 객체는
언제든지 성능이 더 뛰어난 다른 타이어 객체로 바꿀 수 있어야 합니다.
새로 교체된 타이어 객체는 기존 타이어와 사용 방법은 동일하지만
더 우수한 실행 결과를 도출해야 합니다.
이것을 프로그램으로 구현하기위해서는 상속,오버라이딩, 그리고 타입 변환을 이용하는 것입니다.
부모 클래스를 상속하는 자식 클래스는 부모가 가지고 있는 필드와 메서드를 가지고 있으니
사용 방법이 동일하고, 자식 클래스는 부모의 메서드를 오버라이딩해서
메서드의 실행 내용을 변경함으로써 더 좋은 실행결과를 나오게 할 수 있습니다.
그리고 자식 타입을 부모 타입으로 변환할 수 있습니다.
예제로 알아보겠습니다.
Tire 클래스
public class Tire {
//필드
public int maxRotation; //최대 회전수(최대 수명)
public int accumulatedRotation; //누적 회전수
public String location; //타이어의 위치
//생성자
public Tire(String location, int maxRotation) {
this.location = location;
this.maxRotation = maxRotation;
}
//메소드
public boolean roll() {
++accumulatedRotation;
if(accumulatedRotation<maxRotation) {
System.out.println(location + " Tire 수명: " + (maxRotation-accumulatedRotation) + "회");
return true;
} else {
System.out.println("*** " + location + " Tire 펑크 ***");
return false;
}
}
}
Tire 를 부품으로 가지는 Car 클래스
public class Car {
//필드
Tire frontLeftTire = new Tire("앞왼쪽", 6);
Tire frontRightTire = new Tire("앞오른쪽", 2);
Tire backLeftTire = new Tire("뒤왼쪽", 3);
Tire backRightTire = new Tire("뒤오른쪽", 4);
//생성자
//메소드
int run() {
System.out.println("[자동차가 달립니다.]");
if(frontLeftTire.roll()==false) { stop(); return 1; };
if(frontRightTire.roll()==false) { stop(); return 2; };
if(backLeftTire.roll()==false) { stop(); return 3; };
if(backRightTire.roll()==false) { stop(); return 4; };
return 0;
}
void stop() {
System.out.println("[자동차가 멈춥니다.]");
}
}
Tire 의 자식 클래스 HankookTire
public class HankookTire extends Tire {
//필드
//생성자
public HankookTire(String location, int maxRotation) {
super(location, maxRotation);
}
//메소드
@Override
public boolean roll() {
++accumulatedRotation;
if(accumulatedRotation<maxRotation) {
System.out.println(location + " HankookTire 수명: " + (maxRotation-accumulatedRotation) + "회");
return true;
} else {
System.out.println("*** " + location + " HankookTire 펑크 ***");
return false;
}
}
}
실행 클래스
public class Example {
public static void main(String[] args) {
Car car = new Car();
for(int i=1; i<=5; i++) {
int problemLocation = car.run();
switch(problemLocation) {
case 1:
System.out.println("앞왼쪽 HankookTire로 교체");
car.frontLeftTire = new HankookTire("앞왼쪽", 15);
break;
case 2:
System.out.println("뒤왼쪽 HankookTire로 교체");
car.backLeftTire = new HankookTire("뒤왼쪽", 14);
break;
System.out.println("----------------------------------------");
}
}
}
'자바' 카테고리의 다른 글
JAVA 자바 매개 변수의 다형성 (0) | 2017.03.12 |
---|---|
JAVA 자바 하나의 배열로 객체 관리 (0) | 2017.03.12 |
JAVA 자바 타입 변환과 다형성 자동 타입 변환(Promotion) (0) | 2017.03.12 |
JAVA 자바 protected 접근 제한자 (0) | 2017.03.12 |
JAVA 자바 final 클래스와 final 메서드 (0) | 2017.03.12 |