티스토리 뷰

program

[java] instanceof 연산자

littlecarbb 2014. 2. 13. 21:04

 

 

1. 개요

 

 프로그램을 작성하다 보면 특정 변수를 Object 형태로 변환해서 넘겨주어야 할 때가 있다. 이때 넘겨받은 Object형이 어떠한 형인지 판별해야 하는데 그 때 사용하는 연산자가 intanceof 연산자이다.

 

 C#에서의 is연산자와 같은 기능을 한다.

 

 

2. 사용 조건

 

 instanceof 연산자는 보통 상속과 깊은 관련을 가지고 사용된다. 특히 다형성과는 밀접한 관계가 있다.

 

1) 단일 상속

 

 일반적으로 단일 상속의 경우 instanceof 연산자를 사용할 일은 많지 않다. 사용한다고 하더라도 코드의 간결함을 위해서 사용하지 필수적으로 사용할 필요가 있는 것은 아니다.

 

 

void CallFunction( Object aObj )

{

  if( aObj instanceof CAnalyzeNumber ) // aObj 가 CAnalyzeNumber 인지 확인

  {

  }

  else if( aObj instanceof CGenerateNumber ) // aObj 가 CGenerateNumber 인지 확인

  {

  }

}

 

 위와 같은 함수의 경우 공통 상속 클래스인 Object 을 쓰지 않는다면 CAnalyzeNumber, CGenerateNumber 용도의 함수를 모두 만들어 주어야 하는 불편함이 있다. 함수의 개수를 선호 한다면 위와 같이 만들 필요는 없다. 하지만 함수의 개수를 줄여야 되는 상황에서라면 instanceof 연산자가 유용하게 사용된다.

 

2) 다형성의 구현

 

 Item과 해당 Item을 관리하는 Manager또는 Pool에 해당하는 클래스가 있다고 하자. 외부에서 Item을 쓸 때 Item을 상속 받아서 구현하면 된다. 하지만 설계가 범용성을 고려하는 경우에 Manager까지 상속해서 구현해야 되는 경우가 있다. 또한 Item이 한 종류가 아니라 여러 종류일 경우가 있다.

 

 위와 같이 다양한 조건이 동시에 발생하는 일은 드물다. 하지만 위와 같은 상황이 발생하면 instanceof 연산자가 반드시 필요하게 된다.

 

 위에서 언급하는 다형성은 설계와 밀접한 관련이 있다. 따라서 추후 설계에서 자세하게 논의하도록 한다.

 

 Manager나 Pool을 상속 받을 때는 반드시 instanceof 연산자를 고려해야 하며 instanceof 연산자를 고려하지 않으면 설계 자체가 불가능할 때가 있다.

 

 

3. 동작 원리

   

public class A

{

}

 

public class B extends A

{

}

 

public class C extends B

{

}

 

 위와 같이B가 A를 상속받고 C가 B를 상속받았다고 하자. 그리고 각각의 인스턴스화된 변수를 tmpA, tmpB, tmpC 라 하자. 그러면 9가지의 경우가 발생한다.

 

 

코드

결과

설명

tmpA instanceof A

true

 

tmpA instanceof B

false

A는 B를 모른다.

tmpA instanceof C

false

A는 C를 모른다.

tmpB instanceof A

true

B는 A를 안다.

tmpB instanceof B

true

 

tmpB instanceof C

false

B는 C를 모른다.

tmpC instanceof A

true

C는 A를 안다.

tmpC instanceof B

true

C는 B를 안다.

tmpC instanceof C

true

 

 

 위 예에서는 편의상 '안다', '모른다'라는 용어를 사용하였다. 예를 들어 A는 B가 상속 받는다는 가정에 만들어진 것이 아니므로 B를 모른다고 할 수 있다. 하지만 B는 A를 상속 받아 만들었으므로 A를 알아야 B에 대한 코딩을 진행할 수 있다. 따라서 위와 같은 용어를 사용하였다.

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함