티스토리 뷰
다형성(Polymorphism)
: 부모 클래스의 참조변수로 자식 클래스의 객체를 다룰 수 있는 성질 (역은 성립하지 X !!)
상속관계 간의 형변환만 가능하다.
자손타입 -> 부모타입 형변환 (UpCasting) : 자동 형변환 (암묵적 형변환)
부모타입 -> 자손타입 형변환 (DownCasting) : 강제 형변환 (명시적 형변환)
ex)
public class Example {
public static void main(String[] args) {
Fruit fr = new Fruit();
Kiwi ki = new Kiwi();
fr = ki; // 자동 형변환
ki = (Kiwi)fr; // 강제 형변환
fr = null;
ki = (Kiwi)fr; // ki는 null을 가리킴
ki.answer(); // 작성 시 오류나지 않지만 컴파일 시 오류 발생
}
}
class Fruit {
public void question() {
System.out.println("나는 누구일까요?");
}
}
class Kiwi extends Fruit { // Fruit 클래스를 상속
public void answer() {
System.out.println("키위입니다!");
}
}
심화) 자식으로 부모 가리키기
class Car {
public void drive() {
System.out.println("운전합니다");
}
}
class Truck extends Car { // Car 클래스를 상속
}
public class Polymorphism {
public static void main(String[] args) {
Car car1 = new Car();
Truck truck1 = null;
truck1 = (Truck)car1; // 부모->자식으로 형 변환
truck1.drive(); // 컴파일 시 오류 발생
Car car2 = new Truck();
Truck truck2 = null;
truck2 = (Truck)car2; // 부모->자식으로 형 변환
truck2.drive(); // 정상적으로 컴파일
}
}
truck1 = (Truck)car1; 에서
car1는 Car형 인스턴스이므로 자손 타입으로 부모 타입 인스턴스를 참조할 수 없기 때문에 에러가 발생한다.
truck2 = (Truck)car2; 에서
car2는 Truck형 인스턴스이므로 참조가 가능하다.
[instanceof 연산자]
사용 : '참조변수 instanceof 클래스명' => true/false를 반환
(클래스명에 조상클래스도 포함이 된다!)
ex)
public class instanceofEx {
public static void main(String[] args) {
Truck tr = new Truck();
if(tr instanceof Truck) {
System.out.println("Truck Type");
}
if(tr instanceof Car) {
System.out.println("Car Type");
}
if(tr instanceof Object) {
System.out.println("Object Type");
}
}
}
출력 결과 >
Truck Type
Car Type
Object Type
Car 클래스를 상속받는 Truck 클래스의 객체 tr에 대해 instanceof 연산자를 적용했을 때
tr은 Truck 타입, Car 타입, 그리고 최상위 클래스인 Object 타입인 것을 확인할 수 있다.
반응형
'Java, JavaScript' 카테고리의 다른 글
[Java] Object 클래스의 기본 메소드 (0) | 2019.06.14 |
---|---|
[Java] 예외 처리 (try~catch, throws) (0) | 2019.06.07 |
[Java] 인터페이스(Interface)와 추상(abstract) 클래스 (0) | 2019.04.30 |
[Java] abstract과 final (0) | 2019.04.30 |
[Java] 패키지(Package)와 접근 지정자(Access modifier) (0) | 2019.04.29 |
댓글