InstanceOf? (feat.typeof)

InstanceOf?

instanceof 연산자는 프로그램 실행시 참조 데이터형을 검사하기 위해 사용되는 연산자이다. 쉽게 말하면 데이터 타입을 리턴해주는 함수라고 생각하면 된다.


example(JAVA)

1
2
String word = "hello";
System.out.println(word instanceof String);

instanceof의 왼쪽에는 데이터형을 검사할 변수나 값이 오게되고, 오른쪽에는 예상하는 데이터 형이 오게 된다. 실제 데이터 형과 예상하는 데이터 형이 같은 경우에는 true를 반환한다.


그러나 여기서 예외경우가 몇 가지 존재하는데, 그 중 하나는 instanceof를 사용하는 왼쪽 변수가 오른쪽의 클래스와 상속관계가 없는 경우이다. 아래의 경우를 보자.

1
2
String word = "hello";
System.out.println(word instanceof Integer);

이 경우에는 에러가 발생하게 된다. Integer와 String은 상속관계에 있지 않기 때문이다.


또 다른 예외경우는 객체가 아닌 기본 데이터형을 비교하고자 할 때 발생한다.

1
2
int num = 0;
System.out.println(a instanceof Integer);



example(Javascript)

Javascript에는 instanceof뿐만 아니라 typeof라는 키워드가 존재한다. typeof키워드는 타입을 확인하고 해당하는 변수의 Primitive 타입을 String으로 돌려준다. 돌려주는 Primitive 타입은 아래와 같다.

  • undefined
  • boolean
  • number
  • string(이것은 primitive type으로 String과는 다르다)
  • Object
  • function

instanceoftypeof와는 조금 다르다. Javascript의 instanceof는 Java에서의 instanceof와 비슷하다고 할 수 있다. 그렇지만 문제는 Javascript라는 언어에서 시작된다. Java와 Javascript는 엄연히 다른언어이다. 대표적인 예로 {}[]를 들 수 있다. {}new Object();와 같은 의미를 가지며, []new Array();와 같은 의미를 가진다.


1
2
3
4
5
6
7
8
9
10
11
12
13
"foo" instanceof String; // === false
"foo" instanceof Object; // === false
true instanceof Boolean; // === false
true instanceof Object; // === false

[0,1] instanceof Array; // === true
{0:1} instanceof Object; // === true

var color1 = new String("red");
var color2 = "red";
color1 == color2; // === true
color1 instanceof String; // === true
color2 instanceof String; // === ?

제일 아래의 경우는 false가 나온다. color2는 primitive type string으로 String과는 다르다. 하지만 이중등호로 비교해보면 true가 나온다.


1
2
"foo".constructor instanceof String; // === false
"foo".constructor === String; // === true?!

이건 또 무슨상황인지? “foo”의 형은 String이 아니지만 삼중등호로 비교하면 String과 같다고 한다. 이것은 typeof "foo".constructor를 통해 확인할 수 있다.