[Java] 다형성과 instanceof

김세림·2024년 4월 26일

Java

목록 보기
14/24
post-thumbnail

다형성과 instanceof


다형성

다형성이란?

상속의 특징이며 여러가지 형태를 가질수 있는 능력을 의미한다.
1. 참조 변수 타입 변환을 활용해서 다형성을 구현할 수 있다.
2. 매개변수에도 다형성이 적용될 수 있다.

public Car(Tire tire) {
    this.tire = tire;
}

Car car1 = new Car(new KiaTire("KIA")); 
//위 코드는
//Tire kia = new KiaTire("KIA"); //자동타입변환
//Car car1 = new Car(kia);  이 두줄과 같다.
  1. 반환 타입에도 다형성이 적용될 수 있다.
Tire getHankookTire() { //반환타입은 부모클래스인 Tire
    return new HankookTire("HANKOOK"); //return은 자식타이어 객체
}

참조변수의 타입변환

위에서 말한 참조변수 타입변환이 무엇인지 알아보자.

1. 자동 타입변환

부모타입 변수 = 자식타입 객체; 에서는 부모타입으로 자동으로 변환이 일어난다.
부모 멤버를 자식객체가 상속받기 때문에 부모와 동일하게 취급될 수 있다.
다만 주의할 점은 부모 타입 변수자식 객체의 멤버에 접근할 때는 부모 클래스에 선언된 즉, 상속받은 멤버만 접근할 수 있습니다.

예를 들자면 포유류와 고래가 있다고 생각해보자
포유류는 모유수유를 하는 메서드가 있고,
고래는 포유류의 자식클래스이며, 수영을 하는 메서드도 가지고 있다고 가정한다.

public class Main {
    public static void main(String[] args) {
        // 고래는 포유류이기 때문에 포유류 타입으로 자동 변환
        Mammal mammal = new Whale();
        
        // mammal.swimming(); // 오류 발생
        //포유류에는 swimming 메서드가 없기때문

        // 반대로 모든 포유류가 전부 고래 처럼 수영이 가능한 것이 아니기 때문에 타입변환 불가능
        // Whale whale = new Mammal(); //오류

        mammal.feeding(); //모유수유 메서드는 부모클래스에서 상속한 멤버이기때문에 사용가능
        //고래는 모유수유를 합니다. 가 출력된다.
    }
}

2. 강제 타입변환

쉽게 말해서 부모타입변수 -> 자식 객체의 멤버였던것을 자식타입으로 다시 되돌리는 것을 말한다.
자식타입 변수 = (자식타입) 부모타입객체;
부모타입객체는 자식타입변수로 자동변환이 되지않으므로 캐스팅을 사용하여 강제로 변환시켜주는 것이다.

하지만 부모타입변수로 아예 생성자를 만들어놓고 자식 타입으로 변환시키는 것은 불가능하다.

Mammal newMammal = new Mammal();
Whale newWhale = (Whale) newMammal; // ClassCastException 발생

위 자동 타입변환의 예제에서 수영을 호출하지 못했을 때 처럼 자식클래스 안의 고유한 멤버를 사용하기 위해서는 강제타입변환을 해야한다고 생각하면 된다.

instance of

instance of란?

다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하기 위해 필요한 명령어이다.
( 어떤 인스턴스가 어떤 클래스의 설계도로 만들어졌는지를 체크 )
{대상 객체} instance of {클래스 이름} 의 형태로 사용하며 응답값은 boolean이다.

class Parent { }
class Child extends Parent { }

public class Main {
    public static void main(String[] args) {

	    Parent pc = new Child();  // 다형성 허용 (자식 -> 부모)
		
        System.out.println(pc instanceof Object); // true
        //object는 최상단 클래스이기 때문에 무조건 true라고보면된다.
        System.out.println(pc instanceof Parent); // true
        System.out.println(pc instanceof Child);  // true
        //자식과 부모를 모두 다형성을 허용하여 생성했기때문에
        
        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
        //p는 parent이기 때문에 

        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

    }
}

0개의 댓글