본문 바로가기

클린코드

[Refactoring] 22. 데이터 클래스

 

코딩으로 학습하는 리팩토링 - 인프런 | 강의

리팩토링은 소프트웨어 엔지니어가 갖춰야 할 기본적인 소양 중 하나입니다. 이 강의는 인텔리J와 자바를 사용하여 보다 실용적인 방법으로 다양한 코드의 냄새와 리팩토링 기술을 설명하고 직

www.inflearn.com

| 인프런 - 백기선님의 코딩으로 학습하는 리팩토링 강의를 수강하며 정리한 글입니다.


데이터 클래스
  • 데이터 클래스 -> 필드 또는 필드에 대한 게터, 세터만 존재하는 클래스
  • 코드가 적절한 위치에 존재하지 않기 때문에 이러한 냄새가 생길 수 있다.
  • 예외적으로 단계 조개기에서 중간 데이터를 표현하는데 사용할 레코드는 불변 객체로 데이터를 전달하는 용도로 사용할 수 있다.
  • 관련 리팩토링
    • 레코드 캡슐화하기 -> public 필드를 가지고 있다면, 게터, 세터를 통한 접근이 이루어지도록 수정할 수 있다.
    • 세터 제거하기 -> 변경되지 않아야 할 필드에 적용할 수 있다.
    • 함수 옮기기 -> 게터와 세터가 사용되는 메서드를 찾아보고 데이터 클래스로 옮길 수 있다.
    • 함수 추출하기 -> 메서드 전체가 아니라 일부 코드만 옮겨야 할 경우

Refactoring 1. 레코드 캡슐화하기

  • 변하는 데이터를 다룰 때는 레코드보단 객체를 선호한다.
    • 레코드 -> public 필드로 구성된 데이터 클래스
    • 데이터를 메소드 뒤로 감추면 객체의 클라이언트는 어떤 데이터가 저장되어 있는지 신경 쓸 필요가 없다.
    • 필드 이름을 변경할 때, 점진적으로 변경할 수 있다.
    • 자바의 Record는 불변 객체로, 이런 리팩토링이 필요 없다.
  • public 필드를 사용하는 코드를 private 필드, 게터, 세터를 사용하도록 변경한다.
Before
public class Organization {

    public String name;

    public String country;

}

=> 메서드를 통한 접근이 아닌 필드를 통한 접근이 가능하다.

After
public class Organization {

    private String name;

    private String country;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}
public record Organization(String name, String country) {
}

=> record는 불변 객체이기 때문에 수정이 불가능하다. : final String name, final String country