getter 언제까지 피해야 할까?

토닉·2022년 2월 22일
0

우아한테크코스

목록 보기
3/4
post-thumbnail

학습 동기

getter에 혐오를 가졌던 나였는데 getter를 피하다보니 더 큰 어려움을 겪게 되었다.

자동차의 이름과 위치를 출력해주세요.github

자동차 경주를 구현하던 중 위 요구사항을 만났다.

문제 해결

나름 MVC 패턴으로 구현하던 중 위 요구사항을 구현해야 했다. 쉽게 생각한다면 아래처럼 구현할 수 있었다.

class CarView {
    public void printCar(Car car) {
        System.out.println("%s : %s", car.getName(), "-".repeat(car.getPosition()));
    }
}

하지만, getter 를 너무 싫어했기 때문에 getName과 getPosition은 용납할 수 없었다. 따라서 모든 Object에서 사용되는 toString()을 사용했다.

class Car {
    @Override
    public String toString() {
        return String.format("%s : %s", name, "-".repeat(position);
    }

}

이 방법의 문제점은 무엇일까?

toString()의 용도

  • 객체의 정보를 보기 쉽게 전달

그렇다면 위에서 구현한 것도 자동차의 이름, 위치를 보기 쉽게? 전달한다고 볼 수 있지 않을까? 라고 생각했지만 후디에게 또 다른 용도를 들었다.

  • 디버깅을 위해 사용해요.

즉, 정말 개발자가 객체의 정보가 무엇이 들었는지 보고 싶을 때 사용한다고 했을 때 toString()을 위처럼 작성하면 안되겠다는 생각이 들었다.

getter를 왜 싫어하죠?

  • 객체의 내부 정보를 밖으로 노출하는 것이 싫어서

자동차의 위치(Position)이 밖으로 노출된다면 Position의 메소드에 접근할 수 있어 자동차의 위치가 외부에서 조절이 가능해진다.

  • 그럼 내부 정보가 외부에 노출되도 바뀌지 않는다면?

바뀌지 않는다면, 상관없다라고 생각이 들었다. 물론 그 정보가 보안성이 필요한 데이터라면 안되겠지만, 자동차의 이름과 위치는 그정도의 보안성은 필요없다고 생각한다.

결론

  • 기본값(Primitive type)을 반환하는 getter를 쓰자!
  • 객체가 자신의 상태를 알려줘야 하는 책임(view에게)있다고 생각이 들면 구현하자.
  • 단, 모델(도메인)끼리 상태를 요구하는 일은 최대한 지양하면서 구현하자.

기본값을 반환한다면, 객체 내부의 상태가 바뀔 걱정이 없다. 그리고 여기 요구사항에서 Car는 자신의 이름과 위치를 알려줄 책임이 있다.

getter에 대해 다른 의견이 있다면, 댓글로 작성해주시면 감사하겠습니다!😄

profile
우아한테크코스 4기 교육생

0개의 댓글