[JAVA] INSTANCEOF 연산자

@욕심쟁이

·

2020. 9. 8. 12:03

반응형

instanceof 연산자

- 어떤 객체가 특정 클래스 타입의 인스턴스인지를 판별하는 연산자

  → 형변환 가능 여부를 판별

- 판별결과를 boolean타입변수에 결과값을 저장하거나 if문 등의 조건식에 직접 사용하여 판별

- 판별결과가 true이면 형변환이 가능한 관계라는 의미

  업캐스팅 또는 다운캐스팅 가능한 관계 모두 treu가 리턴됨

<기본문법>

a instanceof B

→ a : 객체(참조변수)

→ b : 클래스명(또는 인터페이스명)

예제)

public class Ex2 {
	public static void main(String[] args) {
		Parent2 p2 = new Parent2();
		if(p2 instanceof Child2) {
			//판별결과가true이면 무조건 CHild2차입으로 변환가능 
			//=>서브클래스를 이미 업캐스팅 해놓은 상태이므로 형변환 가능하다는 True가 리턴됨
			System.out.println("p -> Child2타입으로 형변환 가능");
			//Child2 c = p2;//자동형변환은 불가능한 관계이므로 
			Child2 c = (Child2)p2;
		}else {
			//판별결과가 true이면 어떠한 변환도 불가능
			//->슈퍼클래스 타입 인스턴스이므로 다운 캐스팅 불가!
			System.out.println("p -> Child2타입으로 형변환 불가능");
		}
		System.out.println("==============================================");
		
		//SmartPhone인스턴스(sp)생성
		SmartPhone 내폰 = new SmartPhone();
		//내폰은 SmartPhone입니까?
		if(내폰 instanceof SmartPhone) {   //변수명 instanceof 타입
			System.out.println("내폰은 SmartPhone이다.");
			SmartPhone 동생폰 = 내폰;
			동생폰.call();
			동생폰.sms();
			동생폰.kakaoTalk();
			동생폰.youtube();
		}
		System.out.println("==============================================");
		
		if(내폰 instanceof HandPhone) {
			System.out.println("내폰은 HandPhone입니다.");
			System.out.println("그러므로 HandPhone으로 형변환 가능하다!");
			HandPhone 엄마폰= 내폰;
			System.out.println("내폰은 HandPhone의 모든 기능을 포함한다!");
			엄마폰.call();
			엄마폰.sms();
		} 
		System.out.println("==============================================");
		
		HandPhone 엄마폰 = new HandPhone();
		
		if(엄마폰 instanceof SmartPhone) {
			System.out.println("엄마폰은 SmartPhone입니다.");
		}else {
			System.out.println("엄마폰은 SmartPhone이 아닙니다.");
		}
		System.out.println("==============================================");
		
		HandPhone 엄마폰2 = new SmartPhone();
		if(엄마폰2 instanceof SmartPhone) {
			System.out.println("엄마폰2은 SmartPhone입니다.");
			SmartPhone 내폰2 = (SmartPhone)엄마폰2;
			System.out.println("엄마폰은 SmartPhone의 모든기능을 포함");
			System.out.println("따라서 SmartPhone의 형변환 후에도");
			System.out.println("정상적으로 SmartPhone의 모든 기능 사용가능");
			내폰2.call();
			내폰2.sms();
			내폰2.kakaoTalk();
			내폰2.youtube();
		}else {
			System.out.println("엄마폰은 SmartPhone이 아닙니다.");
		}
		
		
		
	}
}

class Parent2{
	
}

class Child2 extends Parent2{
}
//----------------------------------------------

class HandPhone{
	
	String phoneNumber;
	
	public void call() {
		System.out.println("HandPhone의 전화기능!");
	}
	public void sms() {
		System.out.println("HandPhone의 문자기능!");
	}
}

class SmartPhone extends HandPhone{
	
	String osName;
	public void kakaoTalk() {
		System.out.println("SmartPhone의 카카오 기능!");
	}
	public void youtube() {
		System.out.println("SmartPhone의 유튜브 기능!");
	}
	
	
}

 

반응형