JAVA16

Record 클래스

기본 문법

record range(int start, int end){}

단일파일선언

public record range(int start, int end){}

클래스 내부 선언

public class DidispaceTest {
    public record range(int start, int end){}
}

함수내 선언

public class DidispaceTest {
  public void test() {
    public record range(int start, int end){}
  }
}

record 키워드는 본질은 불변의 클래스의 선언을 간소화 하기 위함? 이고 특별한 클래스다.

public final class range{
    final int start;
    final int end;

    public range(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        range range = (range) o;
        return start == range.start && end == range.end;
    }

    @Override
    public int hashCode() {
        return Objects.hash(start, end);
    }

    @Override
    public String toString() {
        return "range{" +
                "start=" + x +
                ", end=" + y +
                '}';
    }

    public int start(){
        return start;
    }

    public int end(){
        return end;
    }
}

일부 함수들이 숨김? 으로 되어 있어 range정의시 육안으로 확인할수 없음. 그래서 아래 테스트 코드를 작성해서 확인할수 있다.

그리고 record도 클래스 이므로 맴법변수정의도 가능하다.

호출은 아래와 같이

instanceof 향상

과거 우리는 아래와 같은 코드를 자주 봤었다.

객처에서 값을 구할때 아래와 같은 번거로운 과정을 거쳤다.

JAVA16 부터 아래와 같이 개선된 방법으로 작성할수있다.

Stream을 List로 전환시

Stream 을 List 로 전환시 더 이상 collect 할 필요없이 직접 toList 하면 된다.

toList() 는 java 16 부터 지원하는 함수이고 stream 을 list로 바로 전화 가능하다.

java8에서는 아래와 같이 처리했을것이다.

여기에서 한가지 더 나아가서 Stream.toList() 와 Collectors.toList() 의 차이점은

Stream.toList() 의 구현 소스를 보면

때문에 Stream.toList()가 생성한 List는 변경불가한 unmodifiableList List 라는것을 알수 있다. 하지만 Stream.collect(Collectors.toList()) 가 생성한 List는 일반적인 List로 당연히 item을 추가,삭제 가능하다.

Collectors 로 변경불가한 List를 생성하려면 어떻게 될까? 바로 Collectors.toUnmodifiableList() 를 사용하면 된다.

때문에 맨 위에 언급된 코드는 아래와 같이 작성하면된다.

위 코드는 java8에는 없는 java10부터 있는 부분이다.

Last updated