ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 instanceof
    공부/자바 2023. 7. 29. 22:08
    728x90
    instanceof 연산자에 대한 패턴 매칭 기능으로 향상시킨다. 패턴 매칭은 프로그램에서 일반적으로 사용되는 로직인 객체로부터 조건부로 구성 요소를 추출하는 작업을 보다 간결하고 안전하게 표현할 수 있다.

    동기

    거의 모든 프로그램은 특정 유형 또는 구조를 가진 표현식을 테스트하고, 그 상태의 구성 요소를 조건부로 추출하여 추가 처리하는 로직을 포함한다.

    if (obj instanceof String) {
        String s = (String) obj;   
        ...
    }  

    여기에서 3가지 작업이 진행되는데 테스트, 변환, 새로운 로컬 변수 선언이다. 이는 여러가지 이유로 최적화 되지 않아 오류가 발생 할 수 있다. 이러한 해결책을 찾는 대신 Java가 패턴 매칭을 받아드리도록 하였다. 패턴 매칭은 객체의 원하는 형태를 간결하게 표현할 수 있도록 해주며, 다양한 문장과 표현식에서 해당 형태를 입력값과 대조하여 테스트할 수 있다.

    설명

    패턴은 대상에 적용할 수 있는 조건부 또는 테스트와 대상에 대해 조건부가 성공적으로 적용될 경우에만 추출되는 로컬 변수 집합인 패턴 변수의 조합이다.

    if (obj instanceof String s) {
        System.out.println("String!!");
    }   

    instanceof 연산자는 대상 obj를 다음과 같은 패턴과 일치시킨다. obj가 String의 인스턴스인 경우, obj를 String으로 캐스팅하고 그 값을 변수 s에 할당한다. 값이 패턴과 일치하지 않는 경우, 패턴 변수에 값이 할당되지 않아 패턴 변수의 범위를 신중하게 고려해야 한다. 간단하게 패턴 변수의 범위를 포함하는 문과 포함하는 블록 이후 문들로 정의할 수 있다. 패턴 변수의 범위를 대략적으로 처리하는 대신, 플로우 스코핑 개념을 사용한다. 패턴 변수는 컴파일러가 패턴이 확실히 일치하고 변수가 값으로 할당될 것임을 추론할 수 있는 범위 내에서만 유효하다. 조건식이 하나의 instanceof보다 복잡해질 경우, 패턴 변수 범위도 그에 따라 확장된다.

    if (obj instanceof String s && s.length() > 5) {
        flag = s.contains("jdk");
    }  

    패턴 변수 s는 &&연산자의 오른쪽 피연산자인 true 블록에서도 범위 내에 있다.

    if (obj instanceof String s || s.length() > 5) {    // Error!
        ...
    }  

    || 연산자 의미 때문에 패턴 변수 s가 할당되지 않았을 수 있어, 플로우 분석에서 오른쪽 피연산자에서 변수 s가 범위에 없어야 한다.

    패턴 매칭의 instanceof에서의 사용은 Java 프로그램 전반적으로 명시적인 캐스트의 수를 줄여줄 것이다. 특히 타입 테스트 패턴은 동등성 메서드를 작성할 때 유용하다.

    public final boolean equals(Object o) {
        return (o instanceof CaseInsensitiveString) &&
            ((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
    }  

    이렇게 변경 가능하다.

    public final boolean equals(Object o) {
        return (o instanceof CaseInsensitiveString cis) &&
            cis.s.equalsIgnoreCase(s);
    }

    출처: instanceof

    728x90
    반응형

    '공부 > 자바' 카테고리의 다른 글

    flyway  (0) 2023.08.27
    Java Records  (0) 2023.07.31
    외부함수와 메모리 API  (0) 2023.07.29
    switch를 위한 패턴 매칭  (0) 2023.07.29
    17 preview version 안되는 오류  (0) 2023.07.29

    댓글

Designed by Tistory.