본문 바로가기

개발/Java

[Java] 클래스 다형성 ( 클래스 형변환, instance of)

 

클래스 형변환

클래스 형변환에는 자동 형변환과 강제 형변환이 있다.

 

 

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 출력

    }
}