1주차에 객체지향 프로그래밍에 대해서 공부하던 중 위 사진에 있는 규칙 9번에 대한 의문이 생겼었다.
getter
와 setter
, 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 는 객체의 정보이므로 객체가 스스로 판단하도록 해야합니다.
요약하자면 객체의 상태값에 대한 판단을 외부에서 하고 있기 때문이라고 할 수 있습니다.
이런 장문의 답변을 받게 되었다.
나는 이전까지 객체의 상태를 변경하는 것 만이 객체의 내부 상태를 외부에서 접근하는 것이라고 생각을 했었는데, 객체의 상태값을 판단하는 것도 객체지향을 위반할 수 있다는 사실을 이번에 알게되었다.
여기에 더하여 오브젝트 책에서는 왜 Getter
와 Setter
를 사용하면 안되는지에 대한 더욱 색다르고 재밌는 의견을 내놓았다.
위 예시 코드를 다시 한번 가져와보자.
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를 사용하지 말라는 것은 아닌데, 객체의 값을 외부로 표현(Presentation)
해 주어야 하는 경우에는 getter를 사용할 수 밖에 없다.
그러나 값에 의한 업무적 판단
이 일어나는 경우에는 getter를 사용하지 않도록 반드시 유의해야 한다.
좋은글 감사합니다~👍 참고할 만한 글 하나 남기고 갑니다 :)
https://tecoble.techcourse.co.kr/post/2020-04-28-ask-instead-of-getter/