다형성은 하나의 타입에 여러 객체를 대입할 수 있는 성질을 말한다. 자바에서는 다형성을 위해 부모 클래스로 타입 변환을 허용한다. 즉 부모 타입에 모든 자식 객체가 대입될 수 있다.
예를 들어, 자동차를 설계할 때 타이어 클래스 타입을 적용했다면 이 클래스를 상속한 실제 타이어들은 종류에 상관없이 장착이 가능하다.
public Class Tire {
...
}
public Class starTire extends Tire {
...
}
public class koreaTire extends Tire {
...
}
starTire
와 koreaTire
클래스는 Tire
클래스를 상속 받았으므로, 다음과 같이 Tire
인스턴스 생성 시 자식 타입 객체 적용이 가능하다.
public class Car {
Tire t1 = new starTire();
Tire t2 = new koreaTire();
}
starTire
, koreaTire
→ Tire
)Promotion
)자동 타입 변환 (
Promotion
)은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다.
자동 타입 변환은 다음과 같은 조건에서 일어난다.
자동 타입 변환이 되면 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
예를 들어 Animal
클래스를 Cat
클래스가 상속 받았다고 할 때,
Cat
클래스로부터 Cat
객체를 생성하고 이것을 Animal
변수에 대입하면 자동 타입 변환이 일어난다.
Cat cat = new Cat();
Animal animal = cat;
cat
과 animal
변수는 타입만 다를 뿐, 동일한 Cat
객체를 참조한다.
부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
Casting
)강제 타입 변환이란 부모 타입을 자식 타입으로 변환하는 것을 말한다.
모든 부모 타입이 자식 타입으로 강제 변환될 수 있는 것은 아니다.
자식 타입이 부모 타입으로 자동 변환한 후, 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다!
자식 타입이 부모 타입으로 자동 변환하면 부모 타입에 선언된 필드와 메소드만 사용 가능하다는 제약 사항이 따른다. 만약 자식 타입에 선언된 필드와 메소드를 꼭 사용해야 한다면 강제 타입 변환해서 다시 자식 타입으로 변환한 다음 자식 타입의 필드와 메소드를 사용하면 된다.
instanceof
)강제 타입 변환을 할 때, 타입을 확인하지 않고 강제 타입 변환을 시도한다면 ClassCastException
예외가 발생할 수 있다! 그렇다면 부모 변수가 참조하는 객체가 부모 객체인지 자식 객체인지 확실하게 파악 확인하기 위해서는 어떻게 해야할까?
어떤 객체가 어떤 클래스의 인스턴스인지 확인하려면
instanceof
연산자를 사용하면 된다.
instanceof
연산자의 좌항에는 객체가 오고, 우항에는 타입이 오는데,
좌항의 객체가 우항의 인스턴스이면 true
를 산출하고 아니면 false
를 산출한다.
boolean result = 좌항(객체) instanceof 우항(타입)
instanceof
연산자는 매개값의 타입을 조사할 때 주로 사용된다.
메소드 내에서 강제 타입 변환이 필요할 경우 반드시 매개값이 어떤 객체인지 instanceof
연산자로 확인하고 안전하게 강제 타입 변환을 해야 한다.
이것이 자바다 책