리팩토링 42. 레코드 캡슐화 하기

    들어가기 전

    이 글은 인프런 백기선님의 강의를 복습하며 작성한 글입니다. 


    리팩토링 42. 레코드 캡슐화 하기(Encapsulate Record)

    • 변하는 데이터를 다룰 때는 레코드보다는 객체를 선호한다.
      • 책에서 말하는 '레코드'란, public 필드로 구성된 데이터 클래스를 말함. (자바의 Record와는 다름)
      • 데이터를 메서드 뒤로 감추면 객체의 클라이언트는 어떤 데이터가 저장되어 있는지 신경 쓸 필요가 없다.
      • 필드 이름을 변경할 때 점진적으로 변경할 수 있다.
      • 하지만 자바의 Record는 불변 객체라서 이런 리팩토링이 필요없다. 
    • 리팩토링
      1. public 필드를 private 필드로 변경
      2. 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

    댓글

    Designed by JB FACTORY