학원/JAVA

10/4 14-7 instanceof 연산자

도원결의 2022. 10. 4. 23:17

instanceof


instanceof 연산자 : 
 두 클래스간의 형변환이 가능한지 판단하는 연산자   (형변환 전에 확인먼저 해야함)
 해당 인스턴스 변수가 어떤 타입의 변수인지 판단하는 연산자
 두 클래스간의 "상속관계"가 있어야 한다. 즉 is a 관계가 성립해야 한다.
 해당 인스턴스변수가  해당 타입이면  true ,아니면 false
형식)
   인스턴스변수 instanceof 클래스타입
   ex) s instanceof String

   class Super{ }
   class Normal extends Super{ }   =Super와 Normal 둘이 상속관계

public class InstanceOfOP {

public static void main(String[] args) {
    상속관계 없을 때
      String str = new String("JAVA");
      StringBuffer buf = new StringBuffer("JAVA");
  상속관계없을 때 대입 및 연상 과 형변환 불가
str = buf ;    안대
str = (String)buf; 이거도 안돼
buf = str ; 노노노
buf = (StringBuffer) str; 안돼용

System.out.println(str instanceof StringBuffer); 빨간줄 가요 아예 못씀
System.out.println(buf instanceof String);  얘도 빨간줄 가요 아예 못씀
상속관계 없을땐 안되에에에에에

System.out.println(str instanceof String?"str은 String타입니다.":"str은 String 타입이아니다");
System.out.println(str instanceof Object?"str은 Object타입니다.":"str은 Object 타입이아니다");
System.out.println(buf instanceof StringBuffer?"buf은 StringBuffer타입니다.":"buf은 StringBuffer 타입이아니다");
System.out.println(buf instanceof Object?"buf은 Object타입니다.":"buf은 Object 타입이아니다");
     =>출력

str은 String타입니다.
str은 Object타입니다.
buf은 StringBuffer타입니다.
buf은 Object타입니다.

 


상속관계 존재 시
1. instanceof 연산자 판단 않고 형변환시
     상속관계 존재하나 형변환 불가한경우 컴파일 에러는 없으나 실행시 에러  -> 꼭 instanceof 연산자 판단 미리 해라
Object obj = new Object();
   String strObj =(String)obj;    //실행은 되지만 에러뜸 
 System.out.println(obj instanceof String);
if(obj instanceof String) {
               String strObj =(String)obj;
    System.out.println("형변환이 일어났어요 1");
                    }

 

obj = new String("JAVA");
System.out.println(obj instanceof String);
if(obj instanceof String) {
        String strObj =(String)obj;
    System.out.println("형변환이 일어났어요 2");

     }


Super s = new Super();
    System.out.println(s instanceof Super);
    System.out.println(s instanceof Object);
    System.out.println(s instanceof Normal);
 Normal n = (Normal)s

=>출력 

true
true
false

s = new Normal();     // super를 참조하다가 Normal를 참조한다...
    System.out.println(s instanceof Super);
   System.out.println(s instanceof Object);
   System.out.println(s instanceof Normal);
Normal n = (Normal)s; //가능해짐