쉽게 배우는 튼튼한 프로그래밍 방법론

게터 제거: 클린 코드의 핵심 원칙

일상로그92 2024. 10. 2. 14:26

 

프로그램을 작성하면서 우리는 종종 코드의 품질을 높이기 위해 다양한 방법을 모색합니다. 그 중 하나가 바로 게터 제거입니다. 게터(Getter) 메소드는 객체의 상태를 조회하는 데 사용되지만, 때로는 이러한 메소드들이 코드의 복잡성을 증가시키고 유지보수를 어렵게 만들 수 있습니다. 오늘은 클린 코드 관점에서 게터를 제거하는 이유와 방법에 대해 깊이 탐구해보겠습니다.

게터의 역할과 문제점

게터 메소드는 객체 지향 프로그래밍에서 매우 일반적인 패턴입니다. 객체의 내부 상태를 외부에서 읽어올 수 있는 메소드로, 주로 get이라는 접두사를 붙여 사용됩니다. 예를 들어, getAge() 메소드는 age라는 필드의 값을 반환하는 역할을 합니다.

하지만 게터 메소드가 코드에 미치는 영향은 그리 단순하지 않습니다. 먼저, 게터는 종종 객체의 내부 상태에 대한 직접적인 접근을 허용합니다. 이는 정보 은닉(Encapsulation) 원칙을 위반할 수 있으며, 객체의 상태가 외부의 영향을 받기 쉽게 만듭니다.

게터가 많은 클래스는 코드의 가독성을 떨어뜨리고, 객체의 상태를 추적하기 어렵게 만듭니다. 게다가 게터 메소드가 많아질수록 클래스의 인터페이스가 복잡해지고, 결과적으로 클래스의 응집도(Cohesion)가 낮아질 수 있습니다. 이는 코드 유지보수와 확장성을 저해하는 요소가 됩니다.

또한, 게터를 사용할 때는 메소드 호출로 인해 추가적인 비용이 발생할 수 있습니다. 특히, 멀티스레딩 환경에서는 게터 메소드가 동기화 문제를 일으킬 수 있어, 코드의 안정성에 영향을 미칠 수 있습니다.

클린 코드에서의 게터 제거 원칙

클린 코드는 읽기 쉽고, 이해하기 쉬우며, 변경에 강한 코드를 지향합니다. 이를 실현하기 위해 게터를 제거하는 것이 유용할 수 있습니다. 클린 코드의 핵심 원칙 중 하나는 단일 책임 원칙(Single Responsibility Principle)입니다. 각 클래스는 하나의 책임만을 가져야 하며, 게터 메소드는 종종 클래스의 책임을 분산시킬 수 있습니다.

게터를 제거할 때는 정보 은닉을 철저히 하여, 객체의 상태를 직접적으로 노출하지 않는 방향으로 설계합니다. 객체의 상태를 외부에서 직접 읽기보다는, 객체가 자신을 설명할 수 있는 메소드를 통해 정보를 제공하는 것이 좋습니다. 이렇게 하면 객체의 상태가 아닌 객체의 동작에 집중할 수 있습니다.

또한, 불필요한 의존성을 제거하는 것도 중요합니다. 게터 메소드가 많아지면 코드가 객체의 내부 상태에 의존하게 되고, 이는 유지보수 시 문제를 일으킬 수 있습니다. 객체의 상태를 직접 노출하기보다는, 객체가 자신의 상태를 통해 적절한 동작을 수행하도록 설계하는 것이 바람직합니다.

게터 제거 방법

게터를 제거하기 위해서는 몇 가지 방법을 사용할 수 있습니다. 첫째, 상태 기반 메소드를 사용하여 객체의 상태를 조회하는 대신 객체의 동작을 수행하도록 변경합니다. 예를 들어, getAge() 메소드가 아닌 isAdult() 메소드를 사용하여 나이에 기반한 동작을 수행하도록 합니다.

둘째, 데이터 전달 객체(Data Transfer Object) 패턴을 고려할 수 있습니다. 이 패턴은 데이터를 담기 위해 별도의 객체를 사용하는 방법으로, 데이터 전송을 단순화하고 클래스의 책임을 명확히 할 수 있습니다.

셋째, 메소드 체이닝(Method Chaining)을 활용하여 상태 변경과 조회를 하나의 흐름으로 처리할 수 있습니다. 이 방법은 코드의 가독성을 높이고, 객체의 상태를 명확히 표현할 수 있습니다.

public class User {
    private String name;
    private int age;

    // 게터 제거
    // public String getName() { return name; }
    // public int getAge() { return age; }

    // 상태 기반 메소드로 변경
    public boolean isAdult() {
        return age >= 18;
    }

    public User withName(String name) {
        this.name = name;
        return this;
    }

    public User withAge(int age) {
        this.age = age;
        return this;
    }
}

위 코드에서 getName()getAge() 메소드를 제거하고, isAdult()와 메소드 체이닝을 활용하여 상태를 조회하는 대신 객체의 동작에 집중하는 방법을 보여줍니다.

게터 제거의 장점과 주의사항

게터를 제거하는 가장 큰 장점은 코드의 응집도를 높일 수 있다는 점입니다. 객체의 상태를 직접적으로 노출하지 않고, 객체가 자신의 상태를 기반으로 동작을 수행하게 하면, 클래스의 책임이 명확해지고 유지보수가 용이해집니다.

하지만 게터를 제거할 때는 객체의 사용 패턴을 잘 분석해야 합니다. 모든 상황에서 게터를 제거하는 것이 최선의 방법은 아닙니다. 객체의 상태를 조회할 필요가 있는 경우에는 적절한 방법으로 상태를 외부에 노출할 수 있는 방안을 고려해야 합니다.

또한, 성능 문제를 염두에 두어야 합니다. 상태 기반 메소드나 메소드 체이닝이 항상 성능을 개선하는 것은 아닙니다. 각 상황에 맞는 적절한 방법을 선택하는 것이 중요합니다.

결론

게터 제거는 클린 코드의 핵심 원칙 중 하나로, 코드의 응집도를 높이고 유지보수를 용이하게 합니다. 상태 기반 메소드나 메소드 체이닝을 활용하여 객체의 동작에 집중하는 것이 바람직합니다. 그러나 모든 상황에서 게터를 제거하는 것이 최선의 방법은 아니며, 상황에 맞는 적절한 방법을 선택하는 것이 중요합니다.

FAQ

Q1: 게터를 완전히 제거해야 하나요?
A1: 게터를 완전히 제거하는 것이 항상 최선은 아닙니다. 객체의 상태를 조회할 필요가 있는 경우에는 적절한 방법으로 상태를 외부에 노출할 수 있습니다.

Q2: 상태 기반 메소드를 사용하면 코드가 복잡해지지 않나요?
A2: 상태 기반 메소드는 코드의 복잡성을 줄이는 데 도움을 줄 수 있습니다. 객체의 상태를 기반으로 동작을 수행하도록 설계하면 코드의 응집도가 높아지고 유지보수가 용이해집니다.

Q3: 메소드 체이닝이 항상 좋은 방법인가요?
A3: 메소드 체이닝은 코드의 가독성을 높이고, 객체의 상태를 명확히 표현할 수 있는 방법입니다. 하지만 모든 상황에서 최선의 방법은 아니며, 성능 문제나 사용 패턴에 따라 적절한 방법을 선택하는 것이 중요합니다.

해시태그

#클린코드 #게터제거 #정보은닉 #객체지향프로그래밍 #상태기반메소드 #메소드체이닝 #소프트웨어개발 #프로그래밍 #클린코딩 #코드품질 #소프트웨어설계 #프로그래밍원칙 #코드리팩토링 #코드유지보수 #객체설계 #개발자 #소프트웨어개발자 #코드리뷰 #프로그래밍팁 #코딩 #코드디자인 #소프트웨어엔지니어 #프로그래밍언어 #코드개선 #객체지향설계 #클린코드원칙 #게터제거방법 #프로그래밍문제 #클린코드작성법

 

[쉽게 배우는 튼튼한 프로그래밍 방법론] - 빈 생성자 완성: 클린 코드의 핵심

 

빈 생성자 완성: 클린 코드의 핵심

빈 생성자(empty constructor)는 클래스의 객체를 생성할 때 아무런 특별한 초기화 작업을 수행하지 않는 기본 생성자를 말합니다. 간단히 말해, 아무 인수도 받지 않고 아무것도 하지 않는 생성자를

dailylog92.tistory.com

 

[쉽게 배우는 튼튼한 프로그래밍 방법론] - 클린 코드 방법론, DTO 제거하기

 

클린 코드 방법론, DTO 제거하기

DTO(Data Transfer Object)는 데이터를 전송하기 위한 객체입니다. 주로 네트워크를 통해 데이터를 전송하거나 데이터베이스와의 상호작용에서 사용하는 데 매우 유용합니다. DTO는 데이터의 구조를 명

dailylog92.tistory.com

2024.09.26 - [쉽게 배우는 튼튼한 프로그래밍 방법론] - 자동으로 구현된 속성 제거: 클린 코드의 핵심