-
자바 instanceof공부/자바 2023. 7. 29. 22:08728x90instanceof 연산자에 대한 패턴 매칭 기능으로 향상시킨다. 패턴 매칭은 프로그램에서 일반적으로 사용되는 로직인 객체로부터 조건부로 구성 요소를 추출하는 작업을 보다 간결하고 안전하게 표현할 수 있다.
동기
거의 모든 프로그램은 특정 유형 또는 구조를 가진 표현식을 테스트하고, 그 상태의 구성 요소를 조건부로 추출하여 추가 처리하는 로직을 포함한다.
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