10/4 14-7 instanceof 연산자
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; //가능해짐