클래스 형변환
클래스 형변환에는 자동 형변환과 강제 형변환이 있다.
1. 자동 형변환 → 자식 클래스를 부모 클래스를 사용해 선언 가능.
public class Main {
public static void main(String[] args) {
// 고래는 포유류이기 때문에 포유류 타입으로 변환될 수 있습니다.
Mammal mammal = new Whale();
// 하지만 포유류 전부가 바다에 살고 수영을 할 수 있는 것은 아니기 때문에
// 수영 하다 메서드는 실행 불가
// 즉, 부모 클래스에 swimming이 선언되어있지 않아서 사용 불가능합니다.
// mammalia.swimming(); // 오류 발생
// 반대로 모든 포유류가 전부 고래 처럼 수영이 가능한 것이 아니기 때문에 타입변환이 불가능합니다.
// 즉, 부모타입의 객체는 자식타입의 변수로 변환될 수 없습니다.
// Whale whale = new Mammal(); // 오류 발생
mammal.feeding();
}
}
2. 강제 형변환 → 자동 형변환이 완료된 애들이 돌아갈 수 있는 것
// 자식타입객체가 자동 타입변환된 부모타입의 변수
Mammal mammal = new Whale();
mammal.feeding();
// 자식객체 고래의 수영 기능을 사용하고 싶다면
// 다시 자식타입으로 강제 타입변환을 하면된다.
Whale whale = (Whale) mammal;
whale.swimming();
자식 타입 객체가 부모 타입으로 자동 타입 변환된 후 다시 자식 타입으로 변환될 때만 강제 타입 변환이 가능합니다.
다형성
다형성이란 ‘여러 가지 형태를 가질 수 있는 능력’을 의미한다. 클래스 형변환을 통해 다형성을 구현할 수 있다.
아래의 코드로 다형성을 확인해보자.
//Car 클래스
public Car(Tire tire) {
this.tire = tire;
}
//Main 클래스
public class Main {
public static void main(String[] args) {
// 매개변수 다형성 확인!
Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));
}
}
Car 생성자에서 매개변수의 타입이 부모 타이어이기 때문에 자식 타이어 객체들을 매개값으로 전달할 수 있다.
//Car 클래스
Tire getHankookTire() {
return new HankookTire("HANKOOK");
}
Tire getKiaTire() {
return new KiaTire("KIA");
}
...
//Main 클래스
public class Main {
public static void main(String[] args) {
// 반환타입 다형성 확인!
Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire();
}
}
반환 타입에도 다형성이 적용될 수 있다. Car 클래스에서 반환 타입이 부모 타이어이기 때문에 자식 타이어 객체들을 반환값으로 지정할 수 있다. 또한 자동 타입 변환이 된 반환값인 자식 타이어 객체를 강제 타입 변환할 수도 있다.
instanceof
다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는 것이 필요한데 이때 사용할 수 있는 명령어가 instance of 다. 이 명령어를 통해서 해당 객체가 내가 의도하는 클래스의 객체인지 확인할 수 있다.
// 다형성
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 출력
}
}
'개발 > Java' 카테고리의 다른 글
[Java] 인터페이스 / 인터페이스 상속 / 인터페이스 타입 변환 (0) | 2024.04.24 |
---|---|
[Java] 추상 메서드 / 추상 메서드 오버라이딩 (cf. 일반 메서드 오버라이딩) (0) | 2024.04.24 |
[Java] 상속 (Object , super, super()) (0) | 2024.04.24 |
[Java] 객체지향 프로그래밍 (0) | 2024.04.24 |
[Java] 캡슐화 (접근 제어자, getter & setter) (0) | 2024.04.24 |