[JDK 16] Pattern Matching for instanceof

2022. 5. 6. 14:36Dev/Java

300x250
반응형

JDK 16 부터 instanceof의 패턴 매칭을 지원합니다.
패턴 매칭은 타입을 강제로 설정해줌으로써 캐스팅을 잘못하여 발생되는 에러를 방지할 수 있습니다.

JEP 394: Pattern Matching for instanceof


instanceof 테스트를 하기 위해 먼저 아래와 같은 클래스를 선언했습니다.

@Getter
abstract static class Figure {
    protected String name;
}

@Getter
static class Circle extends Figure {
    public Circle() {
        this.name = "원";
    }
}

@Getter
static class Square extends Figure {
    private final int line;

    public Square() {
        this.name = "사각형";
        this.line = 4;
    }
    public Square(String name) {
        this();
        this.name = name;
    }
}

JDK 16 이전 버전에서 instanceof를 아래와 같이 사용하여, if 블럭 내에서 Cast 후 변수를 이용했었다면

if(figure instanceof Square) {
    Square square = (Square) figure;
    ...
}

JDK 16 이후 버전 부터는 아래와 같이 if 문 내에서 바로 캐스팅을 할 수 있습니다.

if(figure instanceof Square square) {
  ...
}

예제 1. Pattern Matching Test

먼저, instanceof 테스트를 위해 클래스를 정의합니다.

Square타입일 경우, 이름과 line 수를 출력하고, Circle타입일 경우 이름만 출력합니다.
instanceof 가 쓰여진 if문 내에서 패턴매칭을 이용하여 바로 캐스팅합니다.

이름: 사각형, line 수: 4
이름: 원
이름: 네모, line 수: 4

예제 2. && 연산자와 함께 활용

if 구문 내에서 instanceof 패턴매칭 할때, && 연산자는 사용할 수 있지만 || 연산자는 사용할 수 없습니다.

앞선 구문이 참이 아닐 경우에는 패턴매칭으로 cast될 수 없기 때문에 or 연산자의 경우 컴파일 에러가 발생됩니다.

또 instanceof 로 패턴매칭될 경우 && 연산자를 이용하여 객체 내의 메서드를 활용할 수 있습니다.

if(number instanceof Double d && d.floatValue() > 10) { }

instanceof 패턴매칭과 && 논리연산자를 함께 활용한 예제입니다.


++ References

300x250
반응형

TAG