반응형
/*instanceof 연산자
* - 좌변의 객체(참조변수)가 우변 클래스의 타입인지 판별하는 연산자
* - 판별 결과가 true 이면 형변환이 가능한 관계(업캐스팅 or 다운캐스팅)
* 판별 결과가 false 이면 절대로 형변환 불가
* - 우변의 클래스 타입과 같거나 우변 클래스 타입의 자식 타입 모두 가능
* - A is a B = A instanceof B
* - 판별 결과를 boolean 타입 변수에 저장하거나
* if문에 판별하는 문장을 직접 사용 가능
*
* < 기본 문법 >
* if(A instanceof B) { // A 는 참조변수(객체), B 는 클래스명(타입)
* // 형변환이 가능한 관계이므로 변환 수행
* } else {
* // 절대로 형변환이 불가능한 관계이므로 변환 수행 X
* }
*/
public class Ex2 {
public static void main(String[] args) {
/*
* instanceof 연산자
* - 좌변의 객체(참조변수)가 우변 클래스의 타입인지 판별하는 연산자
* - 판별 결과가 true 이면 형변환이 가능한 관계(업캐스팅 or 다운캐스팅)
* 판별 결과가 false 이면 절대로 형변환 불가
* - 우변의 클래스 타입과 같거나 우변 클래스 타입의 자식 타입 모두 가능
* - A is a B = A instanceof B
* - 판별 결과를 boolean 타입 변수에 저장하거나
* if문에 판별하는 문장을 직접 사용 가능
* < 기본 문법 >
* if(A instanceof B) {
* // 형변환이 가능한 관계이므로 변환 수행
* } else {
* // 절대로 형변환이 불가능한 관계이므로 변환 수행 X
* }
*/
SmartPhone sp = new SmartPhone("갤럭시","010-1111-1111","안드로이드");
sp.call();
sp.sms();
sp.kakaoTalk();
// sp 는 SmartPhone 입니까? YES
// => sp is a SmartPhone?
if(sp instanceof SmartPhone) {
System.out.println("sp는 SmartPhone이다!");
// sp 를 SmartPhone 타입 변수에 저장이 가능하다!
SmartPhone phone = sp;
}
System.out.println("--------------------------------");
//업캐스팅 가능 대상 확인
//sp는 HandPhone 입니까? YES
if(sp instanceof HandPhone) {
System.out.println("sp는 HandPhone이다!");
System.out.println("그러므로 sp 를 HandPhone 으로 형변환 가능하다!");
// sp -> HandPhone 타입(hp)으로 변환
HandPhone hp = sp; // 업캐스팅 = 묵시적(자동) 형변환
System.out.println("sp 는 HandPhone 이 가진 모든 기능을 포함한다!");
System.out.println("따라서, 업캐스팅 후에도 HandPhone 의 기능 사용 가능!");
hp.call(); // HandPhone 의 기능인 전화기능과
hp.sms(); // 문자 기능을 사용할 수 있으나
// hp.kakaoTalk(); //SmartPhone의 기능은 포기해야함
//=> 업캐스팅할 경우 참조영역이 축소됨
}else {
System.out.println("sp는 HandPhone이 아니다!");
}
System.out.println("----------------------------------");
// 다운캐스팅 가능 대상 확인
// 슈퍼클래스 타입 인스턴스 생성
HandPhone hp = new HandPhone("애니콜", "010-1234-5678");
// hp 는 SmartPhone 입니까? NO
if(hp instanceof SmartPhone) {
System.out.println("hp는 SmartPhone이다!");
} else {
System.out.println("hp는 SmartPhone이 아니다!");
System.out.println("그러므로 SmartPhone 으로 변환 불가능!");
System.out.println("hp 는 SmartPhone 이 가진 기능을 모두 포함하지 못함!");
}
System.out.println("----------------------------------");
// 다운캐스팅 가능 대상 확인(가능한 경우)
// SmartPhone -> HandPhone 타입(hp2)으로 업캐스팅
HandPhone hp2 = new SmartPhone("갤럭시","010-1111-1111","안드로이드");
// 업캐스팅 후에는 참조 영역 축소로 접근 범위가 줄어들게 됨
hp2.call();
hp2.sms();
// hp2.kakaoTalk(); // 접근 불가
// hp2 는 SmartPhone 입니까? YES
if(hp2 instanceof SmartPhone) {
System.out.println("hp2는 SmartPhone이다");
System.out.println("그러므로 hp2 는 SmartPhone 으로 형변환 가능!");
// SmartPhone sp2 = hp2; // 자동 형변환 불가능
SmartPhone sp2 = (SmartPhone)hp2; // 강제 형변환 필요
System.out.println("hp2 는 SmartPhone 이 가진 모든 기능을 포함한다!");
sp2.call(); // HandPhone 의 기능인 전화 기능과
sp2.sms(); // 문자 기능을 사용할 수 있으며
sp2.kakaoTalk(); // SmartPhone 의 기능도 다시 사용이 가능해진다!
} else {
System.out.println("hp2는 SmartPhone이 아니다");
}
System.out.println("===================================");
Child c = new Child();
// Parent p = c;
// p.parentPrn();
// Child -> Parent 자동 형변환이 가능하지만
// 형변환을 바로 수행하지 않고, instanceof 연산자를 통해 검사 후 수행
if(c instanceof Parent) {
System.out.println("c 는 Parent 이다!");
Parent p = c;
c.parentPrn();
}else {
System.out.println("c 는 Parent 가 아니다!");
}
Parent p2 = new Parent();
// Parent -> Child 변환 가능 여부 판별 후 변환
if(p2 instanceof Child) {
System.out.println("p2는 Child이다");
// 형변환 수행
// Child c2 = p2;
Child c2 = (Child)p2;
c2.parentPrn();
c2.childPrn();
}else {
System.out.println("p2는 Child가 아니다");
}
}
}
class HandPhone {
String modelName;
String phoneNumber;
public HandPhone(String modelName, String phoneNumber) {
super();
this.modelName = modelName;
this.phoneNumber = phoneNumber;
}
public void call() {
System.out.println("전화 기능!");
}
public void sms() {
System.out.println("문자 기능!");
}
}
class SmartPhone extends HandPhone {
String osName;
// 모델명, 전화번호, 운영체제명을 전달받아 초기화하는 생성자 정의
// => 모델명과 전화번호는 슈퍼클래스의 생성자를 통해 대신 초기화 수행
public SmartPhone(String modelName, String phoneNumber, String osName) {
super(modelName, phoneNumber);
this.osName = osName;
}
public void kakaoTalk() {
System.out.println("카톡 기능!");
}
}
/*
문자 기능!
카톡 기능!
sp는 SmartPhone이다!
--------------------------------
sp는 HandPhone이다!
그러므로 sp 를 HandPhone 으로 형변환 가능하다!
sp 는 HandPhone 이 가진 모든 기능을 포함한다!
따라서, 업캐스팅 후에도 HandPhone 의 기능 사용 가능!
전화 기능!
문자 기능!
----------------------------------
hp는 SmartPhone이 아니다!
그러므로 SmartPhone 으로 변환 불가능!
hp 는 SmartPhone 이 가진 기능을 모두 포함하지 못함!
----------------------------------
전화 기능!
문자 기능!
hp2는 SmartPhone이다
그러므로 hp2 는 SmartPhone 으로 형변환 가능!
hp2 는 SmartPhone 이 가진 모든 기능을 포함한다!
전화 기능!
문자 기능!
카톡 기능!
===================================
c 는 Parent 이다!
슈퍼클래스의 parentPrn
p2는 Child가 아니다
*/
반응형
'JAVA' 카테고리의 다른 글
[Java] 다형성(Polymorphism) (0) | 2021.11.01 |
---|---|
[Java] 상속(inheritance) - 동적 바인딩 (0) | 2021.10.31 |
[Java] 레퍼런스 형변환(Up Casting, Down Casting) (0) | 2021.10.31 |
[Java] final 키워드 (0) | 2021.10.31 |
[Java] 상속에서의 생성자 (0) | 2021.10.31 |