일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 주문
- 지연로딩
- Spring Data Redis
- method area
- 카카오 화재
- JAVA8
- JPA
- JDK14
- CaffeineCache
- ci/cd
- Redis
- Jenkins
- Metaspace
- 부하테스트
- GithubActions
- java
- 재고 시스템
- backend
- springboot
- B+TREE
- 웹캐시
- 제네릭
- lazyloading
- 트랜잭션
- 동시성
- Ehcache
- nonclustered index
- 공변
- 리팩터링
- 상태패턴
- Today
- Total
NDM
Java Record 클래스를 알아보자 본문
코드 리뷰 도중 record 클래스에 대해 알게되었습니다
항상 Java 11버전만 사용해서 몰랐던 내용이므로, 한번 정리하고 넘어가려 합니다
코드리뷰는 역시 몰랐던 것을 알게되고, 간과했던 부분을 잡는다는 점에서 매우 효율적인것 같습니다
## 개념설명
JDK 14에서 preview로 등장했고, JDK16부터 정식 스펙으로 결정되었습니다.
불변 클래스를 쉽게 생성할 수 있도록 도와주는 클래스입니다.
public class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
불변 클래스를 만들기 위해 보통 다음과 같이 작성됩니다.
- 모든 필드는 private final
- 필드값을 포함한 생성자
- Getter 메소드
- 상속 방지를 위해 경우에 따라 클래스 레벨에서 final 사용
- toString / Equals / HashCode 재정의
이것은 다음과 같은 단점이 있습니다.
- 대부분의 클래스에서 반복되는 유사 작업
- 값 객체라는 사실을 모호해지게 만드는 코드들
위 코드를 Record를 사용해 작성하면 이렇게 됩니다
public record Person (String name, String address) {}
한눈에 [이름, 주소를 갖는 사람]을 나타내는 값 객체라는 것을 알 수 있습니다.
더불어 Record를 선언하면 다음과 같은 작업이 수행됩니다.
- Getter 메소드 추가
- getXXX가 아닌, 필드명()으로 생성
- 클래스는 final, 모든 필드는 private final
- 모든 필드를 포함하는 생성자 추가(public)
- Equals / HashCode / toString 메서드 추가
- Equals는 모든 필드 값이 일치해야만 True를 반환합니다
- HashCode는 필드 값중 하나라도 다르다면 다른 해시값을 반환합니다
추가적으로 다음과 같은 작업을 수행할 수 있습니다
- static 변수, 메서드를 가질 수 있습니다
- 생성자를 별도로 명싱하고 validation을 하는것도 가능합니다
## 내 생각
record는 불변 클래스를 만드는데 도움을 줄 수는 있지만 완전한 불변 클래스를 만들 수는 없다고 생각합니다
필드에 Collection이라도 들어오게 된다면 추가적인 작업이 불가피해 보이기 때문입니다
또한 [모든 필드를 파라미터로 받는 public한 생성자를 자동으로 생성한다] 라는 점이 @AllArgsConstructor의 단점을 그대로 안고 가게 될 것이라고 생각합니다
하지만 간단한 DTO나 값 객체에 한해서 사용한다면 반복되는 코드를 줄일 수 있어 지루한 작업을 피할 수 있을 것이라고 생각합니다
출처
https://colevelup.tistory.com/28
https://scshim.tistory.com/372
'Java' 카테고리의 다른 글
[Java] lambda에서 final변수만 사용 가능한 이유 - 멀티스레드의 비밀 (0) | 2022.09.15 |
---|---|
[Java] 자바 동작 원리와 JVM 3편 : Garbage Collector (0) | 2022.08.08 |
[Java] Java Exception과 Spring Transaction (0) | 2022.08.06 |
[Java] Java8 MetaSpace (0) | 2022.08.05 |
[Java] Java Generic은 어떻게 동작할까? (0) | 2022.05.09 |