부모타입 변수 = 자식타입객체;
➡️ 자동으로 부모타입으로 변환된다.
class Mammal {
// 포유류는 새끼를 낳고 모유수유를 한다.
public void feeding() {
System.out.println("모유수유를 합니다.");
}
}
---
class Whale extends Mammal {
// 고래는 포유류 이면서 바다에 살며 수영이 가능하다.
public void swimming() {
System.out.println("수영하다.");
}
@Override
public void feeding() {
System.out.println("고래는 모유수유를 합니다.");
}
}
---
public class Main {
public static void main(String[] args) {
Mammal mammal = new Whale();
mammal.swimming(); // 오류 발생
Whale whale = new Mammal(); // 오류 발생
mammal.feeding();
}
}
Mammal mammal = new Whale();
: 고래는 포유류이기 때문에 포유류 타입으로 변환될 수 있다.
mammal.swimming();
: 부모 클래스에 swimming
이 선언되어있지 않아서 사용 불가능하다 ➡️ 모든 포유류가 수영을 할 수 있는 것은 아니기 때문에 실행불가
Whale whale = new Mammal();
: 부모타입의 객체는 자식타입의 변수로 변환될 수 없다 ➡️ 모든 포유류가 전부 고래처럼 수영이 가능한 것은 아니 때문에 타입변환이 불가능하다.
자식타입 변수 = (자식타입) 부모타입객체;
➡️ 부모타입 객체는 자식타입의 변수로 자동으로 타입변환이 되지 않기 때문에 (자식타입)
, 타입연산자를 사용해 강제로 타입변환이 가능하다.
// 자동형변환
Mammal mammal = new Whale();
mammal.feeding();
// 강제형변환
Whale whale = (Whale) mammal;
whale.swimming();
자식객체 고래의 수영기능을 사용하고 싶다면 자식타입으로 강제 타입변환을 할 수 있다.
🚨 주 의 🚨
무조건 강제 타입변환을 할 수 있는 것은 아니다
Mammal newMammal = new Mammal();
Whale newWhale = (Whale) newMammal; // 오류 발생!!
자동 타입변환이 된 변수가 아닌 부모객체를 자식타입의 변수로 강제 타입변환하려고 하면 오류가 발생한다.
여러 가지 형태를 가질 수 있는 능력 💪🏻
public Car(Tire tire) {
this.tire = tire;
}
(...)
Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));
---
Tire getHankookTire() {
return new HankookTire("HANKOOK");
}
Tire getKiaTire() {
return new KiaTire("KIA");
}
(...)
Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire();
Car
클래스에는 무조건 Tire
가 들어가야 생성을 해줄 수 있다.
하지만 Tire
가 아닌 new KiaTire("KIA")
와 new HankookTire("HANKOOK")
가 들어갔다.
Tire tire = new HankookTire("HANKOOK");
Tire tire = new KiaTire("KIA");
이렇게 생각하면 쉽다.
new KiaTire("KIA")
와 new HankookTire("HANKOOK")
가 Tire
로 자동타입변환이 되었기 때문이다.
요것이 바로 다형성
instanceof
객체의 원래 클래스명을 체크할 수 있는 명령어 ➡️ Boolean
{대상 객체} instance of {클래스 이름}
class Parent { }
class Child extends Parent { }
class Brother extends Parent { }
---
Parent p = new Parent();
System.out.println(p instanceof Object); // #1 : True
System.out.println(p instanceof Parent); // #2 : True
System.out.println(p instanceof Child); // #3 : False
Parent c = new Child();
System.out.println(c instanceof Object); // #4 : True
System.out.println(c instanceof Parent); // #5 : True
System.out.println(c instanceof Child); // #6 : True
#1 p instanceof Object
: Object
는 모든 클래스의 부모클래스인 최상위 클래스이기 때문에 True
#2 p instanceof Parent
: p
는 Parent
로 만들어진 객체이기 때문에 True
#3 p instanceof Child
: p
는 Parent
로 만들어진 객체이기 때문에 Child
의 인스턴스가 될 수 없다. False
#4 c instanceof Object
: Object
는 모든 클래스의 부모클래스인 최상위 클래스이기 때문에 True
#5 c instanceof Parent
: c
는 Child
로 만들었지만 타입이 Parent
이기 때문에 True
#6 c instanceof Child
: instanceof
의 기능은 원래 클래스명을 체크하는 기능이라고 했다. 형변환이 되기 했지만 new Child
로 만들었기 때문에 True