instanceof 연산자
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 31번째.
이전 레슨에서는 객체가 실제로 변환하려는 타입이 아닌 경우 downcasting이 ClassCastException과 함께 실패할 수 있음을 보여 주었습니다. instanceof 연산자를 사용하면 변환하기 전에 객체의 타입을 확인할 수 있으므로 이 문제를 해결할 수 있습니다.
구문은 간단합니다. object instanceof ClassName은 객체가 해당 클래스(또는 그 하위 클래스 중 하나)의 인스턴스인 경우 true를 반환합니다.
Animal animal = new Dog();
if (animal instanceof Dog) {
Dog dog = (Dog) animal;
dog.bark(); // Dog 전용 메서드를 안전하게 호출할 수 있음
}이 검사는 캐스팅이 성공하는지 확인하여 런타임 오류를 방지합니다. 이 연산자는 계층 구조의 부모 타입에 대해서도 true를 반환합니다.
Dog dog = new Dog();
System.out.println(dog instanceof Dog); // true
System.out.println(dog instanceof Animal); // true
System.out.println(dog instanceof Object); // trueJava 16부터는 패턴 매칭을 사용하여 check와 cast를 한 단계로 결합할 수 있습니다:
if (animal instanceof Dog dog) {
dog.bark(); // 'dog'는 이미 캐스트되어 바로 사용할 수 있습니다
}이 더 깔끔한 구문은 별도의 캐스트 줄을 없앱니다. instanceof는 null을 대상으로 검사할 때 false를 반환하므로 별도의 null 검사가 필요하지 않습니다.
챌린지
쉬움instanceof 연산자를 사용하여 다양한 차량 유형을 안전하게 식별하고 처리하는 차량 검사 시스템을 만들어 봅시다. 차량 계층 구조를 만들고 각 차량의 특화된 기능에 접근하기 전에 실제 유형을 확인하는 코드를 작성합니다.
코드를 네 개의 파일로 구성합니다.
Vehicle.java: 모든 차량이 공유하는 Baseclass를 만듭니다. 모든 차량에는modelfield(String)이 있습니다. 이를 초기화하는 constructor, getter methodgetModel(), 그리고inspect()method를 포함합니다. 이 method는 다음을 출력합니다:Inspecting vehicle: [model]Car.java: Vehicle을 extends하는class를 만듭니다. Car에는 추가로numDoorsfield(int)가 있습니다. 부모 초기화에는super를 사용합니다. 다음을 출력하는checkDoors()method를 추가합니다:[model] has [numDoors] doorsMotorcycle.java: Vehicle을 extends하는 또 다른class를 만듭니다. Motorcycle에는hasSidecarfield(boolean)가 있습니다. boolean 값에 따라[model] has a sidecar또는[model] has no sidecar를 출력하는checkSidecar()method를 추가합니다.Main.java: 여기서instanceof가 필수적입니다! 네 개의 inputs를 받습니다. car model, doors의 수, motorcycle model, 그리고 sidecar가 있는지 여부(true/false)입니다.Car와 Motorcycle을 포함하는
Vehiclereferences의 array를 만듭니다. 그런 다음 array를 Loop하며 각 vehicle에 대해 다음을 수행합니다.- Base
inspect()method를 Call합니다. instanceof를 사용하여 Car인지 check합니다. 그렇다면 안전하게 downcast한 후checkDoors()를 Call합니다.instanceof를 사용하여 Motorcycle인지 check합니다. 그렇다면 안전하게 downcast한 후checkSidecar()를 Call합니다.
- Base
네 개의 inputs를 받습니다. car model(String), doors의 수(int), motorcycle model(String), 그리고 has sidecar(boolean)입니다.
출력은 네 줄이어야 합니다. 각 vehicle에 대해 inspection message가 표시된 후 해당 type에 맞는 check 결과가 표시됩니다. instanceof 연산자는 실제 Car에 대해서만 Car methods를 Call하고 실제 Motorcycle에 대해서만 Motorcycle methods를 Call하도록 보장하여, ClassCastException이 발생하지 않도록 합니다!
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 입력 읽기
String carModel = scanner.nextLine();
int numDoors = Integer.parseInt(scanner.nextLine());
String motorcycleModel = scanner.nextLine();
boolean hasSidecar = Boolean.parseBoolean(scanner.nextLine());
// TODO: carModel과 numDoors로 Car 객체 생성
// TODO: motorcycleModel과 hasSidecar로 Motorcycle 객체 생성
// TODO: Car와 Motorcycle을 포함하는 Vehicle 참조 배열 생성
// TODO: 배열을 순회하며 각 vehicle에 대해:
// 1. inspect() 메서드 호출
// 2. instanceof로 Car인지 확인한 다음 다운캐스트하고 checkDoors() 호출
// 3. instanceof로 Motorcycle인지 확인한 다음 다운캐스트하고 checkSidecar() 호출
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러