리팩토링 42. 레코드 캡슐화 하기
- etc/리팩토링
- 2023. 5. 10.
들어가기 전
이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다.
리팩토링 42. 레코드 캡슐화 하기(Encapsulate Record)
- 변하는 데이터를 다룰 때는 레코드보다는 객체를 선호한다.
- 책에서 말하는 '레코드'란, public 필드로 구성된 데이터 클래스를 말함. (자바의 Record와는 다름)
- 데이터를 메서드 뒤로 감추면 객체의 클라이언트는 어떤 데이터가 저장되어 있는지 신경 쓸 필요가 없다.
- 필드 이름을 변경할 때 점진적으로 변경할 수 있다.
- 하지만 자바의 Record는 불변 객체라서 이런 리팩토링이 필요없다.
- 리팩토링
- public 필드를 private 필드로 변경
- Getter / Setter를 통해 필드에 접근하도록 변경.
책에서 이야기하는 Records는 public한 필드로 구성된 데이터 클래스를 의미한다. 만약 이런 종류의 레코드를 그대로 사용하면, 변경 범위가 넓기 때문에 어떻게 변경될지 전혀 예측할 수 없다. 그렇기 때문에 문제가 생길 여지가 많아진다. 이를 방지하고자 레코드를 캡슐화해서 우리가 허용하는 public한 메서드를 통해서만 접근하고 변경할 수 있도록 하는 것이다.
코드 보기
아래 Organization 클래스가 책에서 이야기하는 데이터 클래스다. 각 필드가 public으로 되어있기 때문에 필드에 직접 접근할 수 있게 된다. 이런 형태를 데이터 클래스 냄새라고 볼 수 있으며, 이 냄새는 '레코드 캡슐화 하기'를 통해서 제거할 수 있다.
// 데이터 클래스의 냄새.
// public 필드만 존재하고, 필드를 활용한 메서드가 전혀 존재하지 않음.
public class Organization {
public String name;
public String country;
}
자바에서는 이런 냄새의 리팩토링이 손쉽다. '클래스'를 'record'로 바꾸면 손쉽게 불변 데이터 클래스를 생성할 수 있다.
// 레코드로 변경
public record Organization(String name, String country) {
}
'etc > 리팩토링' 카테고리의 다른 글
냄새 24. 주석 (0) | 2023.05.10 |
---|---|
냄새 23. 상속포기 (0) | 2023.05.10 |
냄새 22. 데이터 클래스 (0) | 2023.05.10 |
냄새 21. 서로 다른 인터페이스의 대안 클래스들 (0) | 2023.05.10 |
리팩토링 41. 슈퍼클래스 추출하기 (0) | 2023.05.10 |