English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 튜토리얼을 통해 예제를 도움으로 받아 Java instanceof 연산자를 자세히 이해할 수 있습니다.
Java에서 instanceof 키워드는 이진 연산자입니다. 특정 클래스의 인스턴스인지 확인하는 데 사용됩니다.
연산자는 객체가 인터페이스를 구현한 클래스의 인스턴스인지 확인합니다(이 튜토리얼의 후반에서 설명됩니다).
instanceof의 문법은 다음과 같습니다:
result = objectName instanceof className;
instanceof 연산자의 왼쪽 연산자는 객체 이름이고, 오른쪽 연산자는 클래스 이름입니다. 객체가 클래스의 인스턴스인 경우 결과는 true이며, 그렇지 않으면 false입니다.
class Main { public static void main(String[] args) { String name = \"w"3codebox"; Integer age = 22; System.out.println("이름이 String의 인스턴스인가: \""+ (name instanceof String)); System.out.println("age는 Integer의 인스턴스인가요: "+ (age instanceof Integer)); } }
출력:
name은 String의 인스턴스인가요: true age는 Integer의 인스턴스인가요: true
위의 예제에서는 String 타입의 객체 name과 Integer 타입의 객체 age를 생성했습니다. 그런 다음 instanceof 연산자를 사용하여 이름이 String 타입인지 확인하고 age가 Integer 타입인지 확인했습니다.
상속의 경우, instanceof 연산자는 서브 클래스의 객체가 부모 클래스의 인스턴스인지 확인하는 데 사용됩니다.
class Animal { } //Dog 클래스는 Animal의 서브 클래스입니다 class Dog extends Animal { } class Main { public static void main(String[] args){ Dog d1 = new Dog(); //d를 확인했습니다1Dog 객체인가요 System.out.println("d1Dog의 인스턴스인가요: "+ (d1 instanceof Dog)); //d를 확인했습니다1Animal 객체인가요 System.out.println("d1Animal의 인스턴스인가요: "+ (d1 instanceof Animal)); } }
출력:
d1Dog의 인스턴스인가요: true d1Animal의 인스턴스인가요: true
위의 예제에서 d1Dog와 Animal 클래스의 인스턴스입니다. 따라서, d1 instanceof Dog 와 d1 instanceof Animal 모두 true입니다.
Java에서 모든 클래스는 Object 클래스를 상속받습니다. Object 클래스를 상속할 때 extends 키워드를 사용하지 않습니다. 이 상속은 Java에서 은닉적으로 발생합니다.
class Animal { } class Dog { } class Cat { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = new Animal(); Cat c1 = new Cat(); System.out.println("d1Object 클래스의 인스턴스인가요: "+ (d1 instanceof Object)); System.out.println("a1Object 클래스의 인스턴스인가요: "+ (a1 instanceof Object)); System.out.println("c1Object 클래스의 인스턴스인가요: "+ (c1 instanceof Object)); } }
출력:
d1Object 클래스의 인스턴스인가요: true a1Object 클래스의 인스턴스인가요: true c1Object 클래스의 인스턴스인가요: true
위의 예제에서는 Animal, Dog, Cat 클래스의 객체 a를 각각 생성했습니다.1와 d1와 c1이제 instanceof 연산자를 사용하여 이러한 객체 a를 확인했습니다.1, d1, c1Object 클래스의 객체인가요? 출력 결과 모두 true(참)입니다.
이유는 Object 클래스가 java.lang 패키지에서 정의된 루트 클래스이기 때문입니다. 모든 다른 클래스는 Java에서 계층 구조를 형성하는 Object 클래스의 서브 클래스로 구성됩니다.
Java에서는 서브 클래스의 객체가 부모 클래스의 객체로 간주될 수 있습니다. 이를 올라쓰기 유형 변환이라고 합니다.평범하게 말해, 서브 클래스 객체를 부모 클래스 객체로 변환하는 것입니다. 여기서 부모 클래스 객체는 인터페이스일 수 있습니다.
Java 컴파일러가 자동으로 올라쓰기 유형 변환을 수행합니다.
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = d1; a1.displayInfo(); } }
출력:
I am an animal.
위의 예제에서는 Dog 클래스의 객체 d를 생성했습니다1. 우리는 d1서브 클래스 Animal의 객체 a를 생성하기 위해 객체를 사용1. 이는 Java에서 올라쓰기 유형 변환으로 불립니다.
이 코드는 문제가 없습니다. 이는 올라쓰기 유형 변환은 Java 컴파일러가 자동으로 완료하기 때문입니다.
내려쓰기 유형 변환은 올라쓰기 유형 변환의 반대 과정입니다. 즉, 올라쓰기 유형 변환의 반대로, 부모 클래스 객체를 서브 클래스 객체로 변환하는 것입니다.
내려쓰기 유형 변환의 경우, 부모 클래스의 객체가 서브 클래스의 객체로 간주됩니다. Java에서는 내려쓰기 유형 변환을 명시적으로 컴파일러에 지시해야 합니다.
class Animal { } class Dog extends Animal { public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Animal a1 = new Animal(); Dog d1 = (Dog)a1; // 내려쓰기 유형 변환 d1.displayInfo(); } }
프로그램을 실행할 때, ClassCastException이 발생합니다. 여기서 무엇이 일어났는지 확인해 보겠습니다.
위에서는 부모 클래스 Animal의 객체 a1. 그런 다음 a1객체를 서브 클래스 Dog의 객체 d로 강제 변환합니다1.
이는 문제를 일으킵니다. 이는 부모 클래스 Animal의 a1객체는 다른 서브 클래스를 참조할 수도 있습니다. Dog과 함께 다른 서브 클래스 Cat을 생성하면; 동물은 고양이일 수도 있고 개일 수도 있어 혼란을 일으킬 수 있습니다.
이 문제를 해결하기 위해 instanceof 연산자를 사용할 수 있습니다. 이렇게 합니다:
class Animal { } class Dog extends Animal { public void displayInfo() { System.out.println("I am a dog"); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); Animal a1 = d1; // 내려쓰기 if (a1 instanceof Dog) { Dog d2 = (Dog)a1; // 내려쓰기 d2.displayInfo(); } } }
출력:
I am a dog
위의 예제에서는 instanceof 연산자를 사용하여 a1객체가 Dog 클래스의 인스턴스인가요. 표현식 a1 instanceof Dog가 참일 때만 내려쓰기 유형 변환을 수행합니다.
instanceof 연산자는 또한 클래스의 객체가 해당 클래스를 구현하는 인터페이스의 인스턴스인지 확인하는 데도 사용됩니다.
interface Animal { } class Dog implements Animal { } class Main { public static void main(String[] args) { Dog d1 = new Dog(); System.out.println("d1객체가 Animal의 인스턴스인가요: "+(d1 instanceof Animal)); } }
출력:
d1객체가 Animal의 인스턴스인가요: true
위의 예제에서 Dog 클래스를 생성했습니다. 이 클래스는 Animal 인터페이스를 구현합니다.
그런 다음, Dog 클래스의 객체 d를 생성합니다.1이미 instanceof 연산자를 사용하여 d를 확인했습니다.1객체가 Animal 인터페이스의 인스턴스도 아닙니다.