1. 참조변수의 타입변환
- 자동 타입변환 : 부모타입 변수 = 자식타입 객체; 는 자동으로 부모타입으로 변환이 일어남.
- 자식 객체는 부모 객체의 멤버를 상속받기 때문에 부모와 동일하게 취급될 수 있음.
- 강제 타입변환 : 자식타입 변수 = (자식타입) 부모타입 객체;
- 부모타입 객체는 자식타입 변수로 자동으로 타입변환되지 않음
- 다만 자식타입 객체가 부모타입으로 자동 타입변환된 후 다시 자식타입으로 변환될 때만 강제 타입변환이 가능하다.
- 부모타입 변수로는 자식타입객체의 고유한 멤버를 사용할 수 없기 때문에 사용이 필요한 경우가 생겼을 때 장제 타입변환을 사용한다.
// 자식타입객체가 자동 타입변환된 부모타입의 변수
Mammal mammal = new Whale();
mammal.feeding();
// 자식객체 고래의 수영 기능을 사용하고 싶다면
// 다시 자식타입으로 강제 타입변환을 하면된다.
Whale whale = (Whale) mammal;
whale.swimming();
Mammal newMammal = new Mammal();
Whale newWhale = (Whale) newMammal; // ClassCastException 발생
2. 다형성이란?
- '여러 가지 형태를 가질 수 있는 능력' 소프트웨어 또한 구성하고 있는 객체를 바꿨을 때 소프트웨어의 실행 성능 및 결과물이 다르게 나올 수 있다.
- 즉 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다.
//조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 없다.
//반대로 자손타입의 참조변수로 조상타입의 인스턴스를 참조할 수는 없다.
// 부모 클래스
public class Tire {
String company; // 타이어 회사
public Tire(String company) {
this.company = company;
}
public void rideComfort() {
System.out.println(company + " 타이어 승차감은?");
}
}
// 자식 클래스
public class KiaTire extends Tire{
public KiaTire(String company) {
super(company);
}
@Override
public void rideComfort() {
System.out.println(super.company + " 타이어 승차감은 " + 60);
}
}
public class HankookTire extends Tire {
public HankookTire(String company) {
super(company);
}
@Override
public void rideComfort() {
System.out.println(super.company + " 타이어 승차감은 " + 100);
}
}
//main
public class Main {
public static void main(String[] args) {
// 매개변수 다형성 확인!
Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));
// 반환타입 다형성 확인!
Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire();
// 오버라이딩된 메서드 호출
car1.tire.rideComfort(); // KIA 타이어 승차감은 60
car2.tire.rideComfort(); // HANKOOK 타이어 승차감은 100
}
}
3. instanceof
- 다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는 것이 필요한데 이때 사용할 수 있는 명령어이다.
- 이 명령어를 통해 해당 객체가 내가 의도하는 클래스의 객체인지 확인할 수 있다.
- {대상 객체} instance of {클래스 이름} 와 같은 형태로 사용하면 응답값은 boolean 타입으로 나온다.
// 다형성
class Parent { }
class Child extends Parent { }
class Brother extends Parent { }
public class Main {
public static void main(String[] args) {
Parent pc = new Child(); // 다형성 허용 (자식 -> 부모)
Parent p = new Parent();
System.out.println(p instanceof Object); // true 출력
System.out.println(p instanceof Parent); // true 출력
System.out.println(p instanceof Child); // false 출력
Parent c = new Child();
System.out.println(c instanceof Object); // true 출력
System.out.println(c instanceof Parent); // true 출력
System.out.println(c instanceof Child); // true 출력
}
}