Practice/Coding, Debugging

엑세스 함수(getter/setter)를 올바로 사용하기

두 줄 요약:
객체의 속성을 읽고 쓸 때는 언제나 엑세스 함수를 사용하라.
외부에는 꼭 필요한 엑세스 함수만 공개하라.


엑세스 함수를 사용하면 규칙이나 기능을 추가하기 쉽다.

Null을 허용하지 않거나 값을 바뀔 수 없는[각주:1] 규칙이 더해질 수 있다.
메모이제이션(memoization)[각주:2]과 같은 기능이 나중에 추가될 수도 있다.
엑세스 함수를 사용했으면, 의존하고 있는 외부 객체의 수정 없이 이러한 규칙이나 기능을 추가할 수 있다.


일관된 접근 방법을 제공하라.

엑세스 함수와 변수 직접 접근을 같이 쓰면 속성 접근의 일관성이 깨진다.[각주:3]
한마디로, 엑세스 함수와 변수 직접 접근을 섞어서 쓰면 코드가 더러워진다.

h = t.getHours();
m = t.minutes;
t.setSeconds(sec);
t.minutes = min;


결론적으로 객체의 속성을 읽고 쓸 때는 언제나 엑세스 함수를 사용하라.


getter/setter에 대한 오해

setter/getter 쓴다고 정보은닉이 되는 게 아니고 사실은 정보은닉을 망치게 됩니다.
저는 getter/setter 많이 쓴 것은 나쁜 냄새(bad smell)로 봅니다.
getter setter는 객체지향과 거리가 멀며 써야 할 곳은 한정되어 있다


문맥과 떨어져서 해석하면,
"엑세스 함수보다는 변수를 직접 접근하는 것이 좋다"
라고 오해할 수 있다.
외부에서 내부의 상태를 변경하기 위해 접근자나 변수 직접 접근이 필요하다면 나쁜 설계라는 의미이다.
밥을 먹으면 배부른 상태가 되어야 하지, 객체 밖에서 배부른 상태를 직접 변경하는 것은 바람직하지 않다.


외부에는 꼭 필요한 엑세스 함수만 공개한다.

엑세스 함수를 많이 노출해야 한다면 설계에 문제가 있다고 봐야 한다.
이것이 나쁜 냄새다.
가능하면 초기값을 제외하고는 직접적인 상태 변경이 없는 설계가 좋다.
외부에 엑세스 함수를 최소한으로 공개하여 불필요한 상태 변경의 가능성을 차단하는 것이 좋다.


프러퍼티, 엑세스 함수 자동 생성 모듈 사용하자.

엑세스 함수가 비난받는 이유 중에 하나는 보일러플레이트 코드(boilerplate code)의 문제이다.
데이터 접근에 별다른 동작이 필요하지 않는 경우가 대부분이다.
setter는 단순히 값을 복사하고, getter는 그냥 반환하면 된다.
동일 구조의 코드를 많이 작성해야 한다.
이는 개발자가 매우 싫어하는 반복적인 단순 노동이다.

사실 그럴 필요는 없다.
프러퍼티를 사용하거나,
엑세스 함수를 자동으로 생성하는 모듈[각주:4] 을 사용하면 된다.

C#의 프러퍼티:

public class Date
{
    private int year = 2017;
    public int Year { get; set; }

    private int month = 2;
    public int Month
    {
        get { return month; }
        set
        {
            if ((value > 0) && (value < 13))
            {
                month = value;
            }
        }
    }
}

Java의 Lombok 사용하기:

public class Date
{
    @Getter @Setter private int year = 2017;

    @Getter private int month = 2;
    public int setMonth(int value) {
        if ((value > 0) && (value < 13)) {
            month = value;
        }
    }
}


  1. 엑세스 함수에서 사본을 생성하고 이를 반환하는 식으로 구현 [본문으로]
  2. 값을 캐싱하여 성능을 높이는 기법 [본문으로]
  3. 일관성을 유지하는 것은 매우 중요하다. 코딩 규약이나 UI 디자인 가이드 등으로 이것을 강조하는데는 이유가 있다. [본문으로]
  4. 자바에서는 Lombok이 유명하다. [본문으로]
  1. Favicon of https://justhackem.wordpress.com/2017/02/28/encapsulation-and-information-hidi.. 옮긴이 M/D Reply

    나는 응집 관점의 캡슐화 해석을 지지한다. Vector 클래스 설계법은 정보를 숨기지 않지만 이름을 가지기에 충분한 가치가 있기때문이다.
    https://justhackem.wordpress.com/2017/02/28/encapsulation-and-information-hiding/

  2. Favicon of http://www.joyalba.com 알바 . M/D Reply

    관리자의 승인을 기다리고 있는 댓글입니다

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

Today : 114
Yesterday : 134
Total : 205,383