Develop/Java

[Java] Getter와 Setter : 편리함 속의 함정

DevPi 2024. 7. 8. 17:44
반응형

자바를 써본 분들이라면 Getter와 Setter 메서드를 쉽게 접할 수 있을 것입니다. 이들은 매우 편리한 메서드지만, 그만큼 치명적인 단점도 가지고 있습니다. 이번 글에서는 Getter와 Setter의 기능과 그 단점에 대해 자세히 알아보겠습니다.


Getter와 Setter 란

Getter와 Setter는 객체 지향 프로그래밍에서 클래스의 필드 값을 읽거나 수정하기 위해 사용되는 메서드입니다. 이들은 클래스의 캡슐화를 유지하면서 외부 코드가 클래스의 속성에 접근하도록 합니다.

 

Getter

Getter는 클래스의 필드 값을 반환하는 메서드입니다. 일반적으로 메서드 이름은 get 접두사와 필드 이름을 조합하여 만듭니다.

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

    // Getter for name
    public String getName() {
        return name;
    }

    // Getter for age
    public int getAge() {
        return age;
    }
}

 

Setter

Setter는 클래스의 필드 값을 설정하는 메서드입니다. 메서드 이름은 일반적으로 set 접두사와 필드 이름을 조합하여 만듭니다.

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

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

    // Setter for age
    public void setAge(int age) {
        this.age = age;
    }
}

 

Lombok을 이용한 Getter와 Setter 자동생성

Java의 Lombok 라이브러리를 사용하면 Getter와 Setter 메서드를 자동으로 생성할 수 있습니다. Lombok은 클래스에 주석을 추가하여 이러한 메서드를 자동으로 생성합니다.

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Person {
    private String name;
    private int age;
}

이렇게 하면 Lombok이 자동으로 getName(), setName(), getAge(), setAge() 메서드를 생성합니다. Lombok을 사용하면 코드를 더 간결하게 작성할 수 있습니다.


Getter, Setter의 단점

Getter와 Setter는 객체지향 프로그래밍에서 유용하지만, 객체지향의 특성과 관련하여 몇 가지 단점을 가지고 있습니다.

 

1. 캡슐화 원칙의 약화

객체 지향 프로그래밍의 중요한 원칙 중 하나는 캡슐화입니다. 캡슐화는 객체의 내부 상태를 숨기고, 객체가 제공하는 메서드를 통해서만 접근하도록 하는 것을 의미합니다. 하지만 Getter와 Setter는 클래스의 내부 상태에 대한 직접적인 접근을 허용하기 때문에 이 원칙을 약화시킬 수 있습니다.

 

  • 객체의 내부 구현이 외부에 노출됩니다.
  • 클래스의 필드가 변경되면, 그 필드를 사용하는 모든 외부 코드도 변경해야 할 수 있습니다.
  • 불필요하게 많은 Getter와 Setter는 객체를 단순 데이터 저장소로 변질시킬 수 있습니다.

2. 객체의 무결정 저하

Setter 메서드는 객체의 내부 상태를 변경할 수 있게 하므로, 객체의 무결성을 저하시킬 수 있습니다. 특히, 필드에 부적절한 값이 설정되면 객체가 잘못된 상태에 빠질 수 있습니다.

 

  • Setter를 통해 필드 값이 무분별하게 변경될 수 있습니다.
  • 객체의 일관성을 유지하기 어렵습니다.
  • 특정 조건을 만족해야 하는 필드 값의 경우, Setter에서 별도의 유효성 검사를 추가해야 합니다.

3. 낮은 응집도와 높은 결합도

객체 지향 프로그래밍에서는 응집도결합도가 중요한 개념입니다. 응집도는 클래스나 모듈이 하나의 책임을 얼마나 잘 수행하는지를 나타내며, 결합도는 클래스나 모듈이 다른 클래스나 모듈과 얼마나 강하게 연결되어 있는지를 나타냅니다. 많은 Getter와 Setter를 사용하는 경우, 객체의 응집도가 낮아지고, 외부 코드와의 결합도가 높아질 수 있습니다.

 

  • 객체가 많은 책임을 가지게 되어 응집도가 낮아질 수 있습니다.
  • 외부 코드가 객체의 내부 상태에 의존하게 되어 결합도가 높아질 수 있습니다.
  • 객체가 자신의 데이터를 직접 처리하지 않고, 외부에서 처리하게 되면 객체 지향의 장점을 살리기 어렵습니다.

4. 변경에 대한 유연성 감소

객체 지향 프로그래밍의 장점 중 하나는 변경에 유연하게 대처할 수 있다는 것입니다. 하지만 Getter와 Setter를 많이 사용하면, 내부 필드의 변경이 어려워질 수 있습니다. 예를 들어, 필드의 이름이나 타입을 변경하면, 해당 필드를 사용하는 모든 Getter와 Setter, 그리고 이를 호출하는 모든 외부 코드도 함께 변경해야 합니다.

 

  • 필드의 변경이 어려워집니다.
  • 코드의 유지보수성이 떨어집니다.
  • 내부 구현의 세부 사항이 외부에 노출되어, 구현의 세부 사항을 변경하기 어려워집니다.

결론

Getter와 Setter는 편리한 메서드지만, 객체 지향 프로그래밍의 특성과 원칙을 고려할 때 신중하게 사용해야 합니다. 가능한 한 객체의 내부 상태는 캡슐화하고, 객체 스스로가 자신의 데이터를 처리하도록 설계하는 것이 좋습니다. 이를 통해 객체 지향의 장점을 최대한 살릴 수 있습니다.

 

 

 

 

반응형