불변성을 가지는 데이터 클래스를 위한 타입이다. 자바 14 이전 버전에서는 불변의 데이터 클래스를 생성하기 위해서는 private final 필드, 모든 필드를 초기화하는 생성자, equals 메서드, toString 메서드 등을 만들어야 했지만 자바 17(자바 14 이후) 버전에서는 Record 타입을 이용하면 자바 컴파일러가 위와 같은 코드를 자동으로 완성해 준다.
1. Record 타입의 객체 생성
- 생성자를 재 정의하거나, 다른 인수를 제공하는 생성자를 정의할 수 있지만 유효성 검사를 위해 사용하거나, 초기화 용도로만 사용해야 한다.
import java.util.Objects;
public record RecordPerson(String name, String address) {
public static String UNKNOWN_ADDRESS = "Unknown";
public static RecordPerson unnamed(String address) {
return new RecordPerson("Unnamed", address);
}
public RecordPerson {
Objects.requireNonNull(name);
Objects.requireNonNull(address);
}
public RecordPerson(String name) {
this(name, "unknown");
}
}
2. 생성자, Getter
- 모든 필드를 초기화하는 생성자(AllArgsConstructor)가 자동으로 만들어지며 Getter의 경우는 GetXXX의 형식이 아니라 필드명으로 만들어진다.
@Test
public void record_constructor() {
RecordPerson person1 = new RecordPerson("jack", "seoul");
RecordPerson person2 = new RecordPerson("terry", "busan");
Assertions.assertEquals("jack", person1.name());
Assertions.assertEquals("seoul", person1.address());
Assertions.assertEquals("terry", person2.name());
Assertions.assertEquals("busan", person2.address());
}
3. Equals
- 객체의 유형이 같고 모든 필드의 값이 일치하면 true를 반환
@Test
public void record_equals() {
RecordPerson person1 = new RecordPerson("jack", "seoul");
RecordPerson person2 = new RecordPerson("jack", "seoul");
RecordPerson person3 = new RecordPerson("terry", "busan");
Assertions.assertTrue(person1.equals(person2));
Assertions.assertFalse(person2.equals(person3));
}
4. hashCode
- 객체의 유형이 같고 모든 필드의 값이 일치하면 같은 hashcode를 반환. 필드 값이 다르면 hashcode가 다를 가능성이 있지만 절대적으로 보장하지는 않음
@Test
public void record_hashcode() {
RecordPerson person1 = new RecordPerson("jack", "seoul");
RecordPerson person2 = new RecordPerson("jack", "seoul");
RecordPerson person3 = new RecordPerson("terry", "busan");
Assertions.assertEquals(person1.hashCode(), person2.hashCode());
Assertions.assertNotEquals(person2.hashCode(), person3.hashCode());
}
5. static 변수, static 메소드
- 클래스와 마찬가지로 static 변수와 static 메서드를 사용할 수 있다.
@Test
public void record_static() {
Assertions.assertEquals("Unknown", RecordPerson.UNKNOWN_ADDRESS);
RecordPerson unnamedPerson = RecordPerson.unnamed("seoul");
Assertions.assertEquals("Unnamed", unnamedPerson.name());
Assertions.assertEquals("seoul", unnamedPerson.address());
}
2023.04.30 - [기타/프로그래밍 언어] - [JAVA] 자바 17 특징 - 텍스트 블록
[JAVA] 자바 17 특징 - 텍스트 블록
1. 기존 스타일과의 비교 String textBlockHtml = """ example text """; @Test public void givenAnOldStyleMultilineString_whenComparing_thenEqualsTextBlock() { String expected = "\n" + "\n" + " \n" + " example text\n" + " \n" + ""; assertEquals(expect
lazy-man.tistory.com
2023.05.01 - [기타/프로그래밍 언어] - [JAVA] 자바 17 특징 - Switch 문
[JAVA] 자바 17 특징 - Switch 문
자바 17에서는 Switch 문의 기능이 개선되었다. 향상된 Switch 문을 사용하면 break 문을 사용하거나 여러 개의 case를 묶을 때 자바 11 이전의 버전보다 편리하게 사용할 수 있다. 1. 자바 11 이전의 switch
lazy-man.tistory.com
2023.05.01 - [기타/프로그래밍 언어] - [JAVA] 자바 17 특징 - Sealed Class
[JAVA] 자바 17 특징 - Sealed Class
sealed class, interface는 상속하거나 구현할 클래스를 지정하고, 지정한 클래스 외에는 상속 또는 구현할 수 없도록 하는 기능으로 무분별한 상속과 구현을 방지할 수 있습니다. 1. sealed 클래스(인터
lazy-man.tistory.com
2023.05.01 - [기타/프로그래밍 언어] - [JAVA] 자바 17 특징 - 기타
[JAVA] 자바 17 특징 - 기타
이번 포스팅에서는 자바 17의 특징 중 텍스트 블록, Switch 문, Record, Sealed 외의 특징에 대해 알아보도록 하겠습니다. 1. instanceof instanceof 체크할 때 변수를 선언할 수 있기 때문에 좀 더 간결한 코드
lazy-man.tistory.com
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] 함수형 인터페이스 - Predicate (0) | 2023.12.13 |
---|---|
[JAVA] 자바 17 특징 - 기타 (0) | 2023.05.01 |
[JAVA] 자바 17 특징 - Sealed Class (0) | 2023.05.01 |
[JAVA] 자바 17 특징 - Switch 문 (0) | 2023.05.01 |
[JAVA] 자바 17 특징 - 텍스트 블록 (0) | 2023.04.30 |