변수의 유형 확인
Java 에서 변수의 형태를 확인하는 샘플 프로그램을 소개합니다.
Java 는 형태를 명시적으로 선언하는 정적 형태 붙이 언어이므로, 거기까지 형태를 확인할 기회는 없습니다. 그러나 상속 개체를 사용하는 경우 형식 확인이 필요할 수 있습니다.
Java에서 유형을 확인하려면 instanceof 연산자를 사용해, 다음과 같이 클래스나 인터페이스에 대해서 if문등으로 평가할 수 있습니다.
변수 instanceof 클래스
변수 instanceof 인터페이스
instanceof 오른쪽에 클래스 이름 또는 인터페이스 이름을 지정할 수 있습니다.instanceof 의 반환값은 boolean 이고, true 라면 변수는 지정한 클래스나 인터페이스, 라고 하게 됩니다.
Chat&Messenger 는 비즈니스 채팅, 웹 회의, 파일 공유, 일정 관리, 문서 관리, 회의실 예약, 근태 관리를 사용하기 쉽게 통합한 그룹웨어입니다. 기업용 보안도 만전으로,무료로 사용할 수 있습니다!
샘플 프로그램
우선 가장 간단한 패턴. 변수 i가 Integer이면 true 그렇지 않으면 false를 반환합니다.
샘플 코드
public static void integerSample() {
Integer i = 100;
boolean result = i instanceof Integer;
System.out.println(result);
}
출력 결과
true
변수 i는 Integer이므로 결과는 true입니다. 그러나 이것은 너무 당연해서 instanceof 가 무엇을 위해 있는지 모르기 때문에 좀 더 복잡하게 합니다.
instanceof를 효과적으로 사용하는 방법
instanceof 의 효과적인 사용법의 하나에, 그 변수가 어느 아이 클래스인가를 판정하는 경우가 있습니다.
샘플 코드
샘플 코드에서는 동물 클래스 Animal 과, 동물 클래스를 상속한 Dog 클래스, Cat 클래스를 작성해, 인스턴스를 작성한 후에, play 메소드내에서 변수를 instanceof 로 판정해 콘솔 출력을 분기하고 있습니다.
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
public class Main {
public static void main(String[] args) {
instanceofSample();
}
static void instanceofSample() {
Animal dog = new Dog();
play(dog);
Animal cat = new Cat();
play(cat);
}
static void play(Animal animal) {
if (animal instanceof Dog) {
System.out.println("お散歩する");
} else {
System.out.println("猫じゃらしで遊ぶ");
}
}
}
출력 결과
お散歩する
猫じゃらしで遊ぶ
play 메소드 내에서는 인수에 건네받은 animal 가 dog인지 cat인지 모르는 것이 포인트입니다.
instanceof 그럼 슈퍼 클래스(Animal) 안에 들어 있는 서브 클래스의 인스턴스(Dog 또는 Cat)와도 체크할 수 있으므로, 이런 사용법도 할 수 있네요.
특정 인터페이스가 구현되었는지 확인
instanceof 의 대상이 되는 변수에, 특정의 인터페이스가 구현되고 있는지를 확인할 수 있습니다. 예를 들어 이러한 사용법을 할 수 있습니다.
샘플 코드
다음의 샘플 코드에서는, 사토씨, 스즈키씨 클래스를 작성해, 스즈키씨만이 차를 가지고 있다고 가정해, 인터페이스 Car 를 implements 하고 있습니다. goShopping() 메소드는 쇼핑에 가는 처리를 가정하고 있습니다만, Car 를 implements 하고 있는지, instanceof 로 판정해 콘솔 출력을 분기하고 있습니다.
interface Car {}
class Sato {}
class Suzuki implements Car {}
public class Main {
public static void main(String[] args) throws Exception {
instanceofSample();
}
static void instanceofSample() {
Sato sato = new Sato();
goShopping(sato);
Suzuki suzuki = new Suzuki();
goShopping(suzuki);
}
static void goShopping(Object human) {
if (human instanceof Car) {
System.out.println("車で行く");
} else {
System.out.println("歩いて行く");
}
}
}
출력 결과:
歩いて行く
車で行く
Car 가 구현되고 있는 경우와 그렇지 않은 경우로, 처리가 분기하고 있는 것을 알 수 있습니다.