반응형
instanceof 연산자
- 어떤 객체에 대한 is a (상속) 관계를 판별하는 연산자
- 주로 if문을 사용하여 형 변환이 가능한 지 여부를 판별한다.
- instanceof의 결과가 true이면 형 변환이 가능하다.
instanceof 기본 문법
if ( 레퍼런스 변수명 instanceof 클래스명 ) {}
=> 레퍼런스 변수명 => 클래명으로 다운캐스팅 또는 업캐스팅이 일어난다.
if문의 조건식인 '레퍼런스 변수명 instanceof 클래스명' 이 true일 경우에는 레퍼런스 변수명이 클래스명(형 변환할 클래스)으로 업 캐스팅 혹은 다운 캐스팅이 가능합니다.
하지만 다운캐스팅인 경우에는 업 캐스팅이 먼저 발생한 후 다운 캐스팅이 가능한데 instanceof 연산자를 통해 다운 캐스팅이 가능한 지 판별을 하면 상속 관계가 맞는다면 true가 반환된다. 따라서 다운 캐스팅이 가능한 지 판별할 시에는 개발자가 해당 클래스가 먼저 업 캐스팅이 되어있는지 확인을 해야 합니다.
주의할 점
- 다운 캐스팅 시 먼저 업 캐스팅이 일어난 경우에만 가능하다.
- 다운 캐스팅 시 강제형 변환 명시 필수!!
- Object 타입은 모든 클래스의 슈퍼클래스임!
instanceof 코드 예시
public class Ex {
public static void main(String[] args) {
Bus b = new Bus(50, 200);
Truck t = new Truck(50, 200);
Car c = null;
if (b instanceof Car) { // if 안의 조건이 트루이면 형변환이 가능하고 폴스이면 불가능하다 !
System.out.println("형변환이 가능합니다 !");
c = b; // 바꾸어질 클래스 타입 = 레퍼런스 변수(바꿀 클래스 타입) => Bus -> Car 타입으로 형변환 된다.(업캐스팅)
c.speedUp(); // 업캐스팅이 일어났기 때문에 참조 범위가 줄어듬 ! 메서드 갯수 4개 => 2개
c.speedDown();
} else {
System.out.println("형변환이 불가능합니다 !");
}
System.out.println("=====================================");
if (c instanceof Bus) {
System.out.println("형변환이 가능합니다 !");
b = (Bus) c; // 이미 Bus => Car 로 업캐스팅 후이기 때문에 다운캐스팅 가능 !
// 강제 형변환이기 때문에 (Bus) 라고 명시 해줘야 한다.!!!
b.speedUp(); // Car => Bus 로 다운캐스팅 후이기 때문에 참조 범위가 다시 넓어짐 (2개 => 4개)
b.speedDown();
b.ride();
b.drop();
} else {
System.out.println("형변환이 불가능합니다 !");
}
System.out.println("======================================");
if (t instanceof Car) {
System.out.println("형변환이 가능합니다 !");
c = t;
c.speedUp();
c.speedDown();
} else {
System.out.println("형변환이 불가능합니다 !");
}
System.out.println("=====================================");
if (c instanceof Truck) {
System.out.println("형변환이 가능합니다 !");
t = (Truck) c;
t.speedUp();
t.speedDown();
t.dump();
} else {
System.out.println("형변환이 불가능합니다 !");
}
}
}
class Car { // 슈퍼클래스
int speed;
int maxSpeed;
public Car() { // 디폴트 생성자
super();
}
public Car(int speed, int maxSpeed) { // 파라미터를 가지고 있는 생성자
super();
this.speed = speed;
this.maxSpeed = maxSpeed;
}
public void speedUp() { // 슈퍼클래스의 메서드 스피드업
System.out.println("속력 업 !");
}
public void speedDown() { // 슈퍼클래스의 메서드 스피드다운
System.out.println("속력 다운 !");
}
}
class Bus extends Car { // 슈퍼클래스 Car 를 상속 받은 서브클래스 Bus
public Bus(int speed, int maxSpeed) { // 생성자
super(speed, maxSpeed);
}
@Override
public void speedUp() { // 슈퍼클래스의 메서드를 오버라이딩
super.speedUp();
}
@Override
public void speedDown() { // 슈퍼클래스의 메서드를 오버라이딩
super.speedDown();
}
public void ride() { // 서브클래스 Bus 자신의 메서드
System.out.println("손님 승차 !");
}
public void drop() { // 서브클래스 Bus 자신의 메서드
System.out.println("손님 하차 !");
}
}
class Truck extends Car {
public Truck(int speed, int maxSpeed) {
super(speed, maxSpeed);
}
@Override
public void speedUp() {
super.speedUp();
}
@Override
public void speedDown() {
super.speedDown();
}
public void dump() {
System.out.println("짐 싣고 내리기 !");
}
}
반응형
'Programming > Java' 카테고리의 다른 글
[Java] 자바 환경변수 설정하기 (0) | 2022.03.16 |
---|---|
자바 다형성(Polymorphism) (1) | 2021.01.09 |
자바 업캐스팅, 다운캐스팅 (0) | 2021.01.07 |
자바 super() (0) | 2021.01.06 |
자바 상속과 오버라이딩 (0) | 2021.01.06 |
댓글