getter 쓰지마라고? 내 생각에는!

Kevin·2023년 4월 22일
4

? 내 생각에는!

목록 보기
2/5
post-thumbnail

왜 Getter 사용하면 안됨?


1주차에 객체지향 프로그래밍에 대해서 공부하던 중 위 사진에 있는 규칙 9번에 대한 의문이 생겼었다.

gettersetter, Property를 사용하지 말라는건데, 도대체 왜 getter를 사용하지 말라는걸까?

setter를 사용하지 말라는 것은 충분히 이해가 된다. 왜냐하면 객체는 자신의 상태를 자신이 책임져야 하는데, setter는 다른 객체의 상태 또한 마음대로 접근하여, 값을 바꿀 수 있기 떄문이다.

자신의 냉장고에 있는 음식들을 다른 사람이 마음대로 먹거나 바꾸면 기분이 좋겠는가.

그래서 카카오 테크 캠퍼스 매니저님께 내가 만든 예시 코드와 함께 이렇게 질문을 드렸었다.

  • 예시 코드
    • getter를 사용한 기존 코드
      public boolean hasShopItem(int num) {
              for (ShopItem item : this.shopItems) {
                  if (item.getMenuId() == num) {
                      return true;
                  }
              }
              return false;
          }
    • getter를 사용하지 않고, 해당 객체에게 메시지를 보내 스스로 상태에 대한 처리 로직을 수행하도록 하는 코드
      public boolean hasShopItem(int num) {
              for (ShopItem item : this.shopItems) {
                  if (item.isRightMenuId(num)) {
                      return true;
                  }
              }
              return false;
          }
  • 질문

    getter를 사용하는 것을 지양해야 하나요??

사실 이렇게까지 친절하게 답변을 달아주실 줄은 몰랐는데, 답변을 확인해보니 너무나 스윗하시다…

멋쪄…

최고다 카테캠!!

답변은 아래와 같다.

이 또한 코딩 스타일의 한 갈래로서, 이것이 정답이다! 라고 딱 잘라서 말씀드리기는 어렵습니다.

객체지향적 관점에서는, getter 메서드로 객체의 값이 변경되지는 않더라도, getter 메서드의 사용으로 “독립적인 객체 지향적 설계”에 위배되는 상황이 발생할 수 있기 때문입니다.

예시로 들어주신 코드를 예로 들면, getter 메서드를 사용하는 첫번째 코드는 올바른 menuId 를 객체가 아닌 외부에서 판단하고 있습니다. 객체지향적으로 설계한다면 menuId 는 객체의 정보이므로 객체가 스스로 판단하도록 해야합니다.


요약하자면 객체의 상태값에 대한 판단을 외부에서 하고 있기 때문이라고 할 수 있습니다.

이런 장문의 답변을 받게 되었다.

나는 이전까지 객체의 상태를 변경하는 것 만이 객체의 내부 상태를 외부에서 접근하는 것이라고 생각을 했었는데, 객체의 상태값을 판단하는 것도 객체지향을 위반할 수 있다는 사실을 이번에 알게되었다.

여기에 더하여 오브젝트 책에서는 왜 GetterSetter를 사용하면 안되는지에 대한 더욱 색다르고 재밌는 의견을 내놓았다.

위 예시 코드를 다시 한번 가져와보자.

public boolean hasShopItem(int num) {
        for (ShopItem item : this.shopItems) {
            if (item.getMenuId() == num) {
                return true;
            }
        }
        return false;
    }

위 코드에서 여러분들은 어떤 것을 발견할 수 있는가?

  • item.getMenuId() 라는 getter 메서드로부터, ShopItem 객체에는 menuId라는 인스턴스 변수가 존재한다는 사실을 퍼블릭 인터페이스에 노골적으로 들어낸다는 사실을 발견할 수 있을 것이다.
  • 이는 캡슐화의 원칙에 위반하는 변경에 취약한 설계를 얻게된다.

이러한 이유들로 하여금 getter와 setter를 사용하면 안되는 이유들을 알아보았다.

그러면 독자분들은 나와 같은 궁금증이 생길 수도 있다.

아니 그러면 사용하면 안되는 이유는 알겠는데, 그러면 어떻게 객체의 인스턴스에 접근해야 해??

답은 getter를 통해서 다른 객체의 상태를 직접 가져오지말고, 해당 객체에게 메시지를 보내 스스로 상태에 대한 처리로직을 수행하도록 하면 된다.

  • 이렇게 하면 캡슐화를 지킬 수 있고, getter와 같은 결과를 낼 수 있다.

그러나 카테캠 매니저분의 말씀처럼 무조건 getter를 사용하지 말라는 것은 아닌데, 객체의 값을 외부로 표현(Presentation) 해 주어야 하는 경우에는 getter를 사용할 수 밖에 없다.

  • 표현 → 분기문등에 의한 비교가 아닌 단순 표현

그러나 값에 의한 업무적 판단이 일어나는 경우에는 getter를 사용하지 않도록 반드시 유의해야 한다.

  • 업무적 판단 → 분기문등에 의한 비교
profile
Hello, World! \n

1개의 댓글

comment-user-thumbnail
2023년 4월 28일

좋은글 감사합니다~👍 참고할 만한 글 하나 남기고 갑니다 :)
https://tecoble.techcourse.co.kr/post/2020-04-28-ask-instead-of-getter/

답글 달기