티스토리 뷰

728x90
반응형

참조 변수의 타입 변환

 

기본 자료형과 마찬가지로 참조 변수도 형 변환이 가능하다.

 

참조 변수의 형 변환은 사용할 수 있는 멤버의 개수 조절을 의미하는데,

 

자바의 다형성을 이해하는 데 있어 필수적인 개념이라고 할 수 있다.

 

참조 변수의 타입 변환에는 다음의 세 가지 조건이 필요하다.

 

  1. 서로 상속 관계에 있는 상위 - 하위 클래스 사이에서만 가능하다.
  2. 하위 클래스에서 상위 클래스로의 형 변환(업 스케일링)은 형 변환자(괄호)를 생략할 수 있다.
  3. 상위 클래스에서 하위 클래스로의 형 변환(다운 스케일링)은 형 변환자(괄호)를 반드시 명시해야 한다.

예시를 통해 조금 더 살펴보자.

public class VehicleTest {
    public static void main(String[] args) {
        Car car = new Car();
        Vehicle vehicle = (Vehicle) car; // 상위 클래스 Vehicle 타입으로 변환(생략 가능)
        Car car2 = (Car) vehicle; // 하위 클래스 Car타입으로 변환(생략 불가능)
        MotorBike motorBike = (MotorBike) car; // 상속관계가 아니므로 타입 변환 불가 -> 에러발생
    }
}

class Vehicle {
    String model;
    String color;
    int wheels;

    void startEngine() {
        System.out.println("시동 걸기");
    }

    void accelerate() {
        System.out.println("속도 올리기");
    }

    void brake() {
        System.out.println("브레이크!");
    }
}

class Car extends Vehicle {
    void giveRide() {
        System.out.println("다른 사람 태우기");
    }
}

class MotorBike extends Vehicle {
    void performance() {
        System.out.println("묘기 부리기");
    }
}

가장 먼저 Vehicle 클래스와 그것을 상속받은 Car, MotorBike 클래스가 있음을 확인할 수 있다.

 

즉, Vehicle-Car, Vehicle-MotorBike 클래스는 각각 상위-하위 클래스 관계가 있으나 Car-MotorBike는 그렇지 않다.

 

메인 메서드에서 가장 먼저 Car 타입의 참조변수를 이용해 객체 car를 생성하고,

 

그 객체를 가리키는 vehicle의 타입을 Vehicle로 선언하여 형 변환을 실행했다(업 스케일링).

 

이어서 이번엔 vehicle을 하위 클래스 타입인 Car로 변환하여 참조 변수 car2에 할당했다(다운 스케일링).

 

여기까지는 무리 없이 진행되었으나, 다음 줄을 보면 car 객체를 가리키는 MotorBike 타입의 motorbike를 선언해

 

형 변환을 시도하는 것을 볼 수 있다.

 

앞서 언급한 대로 Car 클래스와 MotorBike클래스는 상위-하위 클래스 관계가 아니기 때문에 에러가 나며,

 

형 변환이 실패하게 된다.

 


instanceof 연산자

 

instanceof 연산자는 앞서 살펴본 참조변수의 타입 변환(캐스팅)이 가능한지 여부를 boolean 타입으로 알려주는 연산자다.

 

캐스팅이 가능한지 판단하기 위해선 두 가지 확인이 필요한데,

 

  1. 객체를 어떤 생성자로 만들었는가
  2. 클래스 사이에 상속관계가 존재하는가

가 그것이다. 이를 확인하기 위해 사용하는 연산자가 instanceof인데, 사용방법은 다음과 같다.

참조_변수 instanceof 타입

위와 같이 입력했을 때 true가 나오면 참조변수가 검사한 타입으로 변환이 가능하며, false일 경우는 불가능하다.

 

참조 변수가 null인 경우에는 false를 반환한다고 한다.

 

조금 더 구체적인 예를 보자.

public class InstanceOfExample {
    public static void main(String[] args) {
        Animal animal = new Animal();
        System.out.println(animal instanceof Object); //true
        System.out.println(animal instanceof Animal); //true
        System.out.println(animal instanceof Bat); //false

        Animal cat = new Cat();
        System.out.println(cat instanceof Object); //true
        System.out.println(cat instanceof Animal); //true
        System.out.println(cat instanceof Cat); //true
        System.out.println(cat instanceof Bat); //false
    }
}

class Animal {};
class Bat extends Animal{};
class Cat extends Animal{};

위 예시를 보면 Animal 클래스와 그 하위 클래스인 Bat와 Cat이 있는 것을 알 수 있다.

 

그리고 animal과 cat 객체를 생성하여 Animal 타입의 참조 변수에 할당하고, 형 변환 여부를 확인하고 있다.

 

cat 객체를 예를 들면, 상위 - 하위 클래스 관계와 다형적 표현 방법에 따라 Cat, Animal, Object로

 

선언될 수 있다는 사실을 확인할 수 있다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함