Getter Setter 를 쓰지 말아야하는 이유가 뭘까?

수달·2022년 2월 20일
2

우아한테크코스

목록 보기
1/1

Private 로는 데이터를 지키기에 부족한걸까?

맨 처음 객체 지향에 대해 배울 때, 데이터를 다른 곳에서 변경하지 못하도록

접근 제어자를 private 로 두고, getter / setter 를 사용하라고 배웠다.

그런데 이번 요구사항에 최대한 setter 를 쓰지 않고 해보라 는 의문의 메시지가 있었다.. ! 😲😲

왜 그렇게 해야할까?


객체 지향 프로그래밍의 본질

객체 상태를 보호하기 위해 외부에 노출되는 정보를 줄이고, 다른 객체와 메세지를 주고받아 협력하는 것 이라고 생각한다.

여기서 핵심 키워드는 노출되는 정보를 줄임메세지로 협력 이다.

setter 를 사용하게되면 클래스 외부에서 내부를 수정하게 되니, 객체를 보호하는 것에 멀어지고,

getter 를 사용하게되면 정보를 노출한다.

캡슐화

내가 알고 있는 캡슐화란 정보를 은닉해서 데이터 접근을 막는 것 이었다.

흠.. 🤔 조금 더 깊은 이해가 필요할 것 같아 객체 지향에 관련된 책을 펼쳐봤다.

여기서 tell, don't ask 라는 단서를 찾았다. 필요한 액션을 말해, 정보를 묻지말고. 라고 이해했다.


묻지도 따지지지도 말고 (원하는 행동을)말해!

스크린샷 2021-12-04 오후 6 39 40

그래!! 정보를 주지말고, 정보에 관련 된 처리를 가지고 있는 당사자가 해보면 어떨까?

만약 자동차 주행 거리가 100km 가 넘었는지 알고싶다고 하자.


class car {
   private int 거리;

   public car(int 거리){
       this.거리 = 거리;
   }

   public int get거리(){ return this.거리;}
}

  public static void main(String[] args) {
   if(car.get거리 >= 100km){
      System.out.println("100km 넘게 주행하셨네요 ~);
   else
      System.out.println("100km 안넘었어요! ");
}
 

여기서 get 을 사용하면 거리가 노출된다. 바꿔보자.


class car {
   private int 거리;

   public car(int 거리){
       this.거리 = 거리;
   }

   public int isOverKm(int km){ // 여기를 보자
         return 거리>= km;
}

  public static void main(String[] args) {
   if(isOverKm(100)){
      System.out.println("100km 넘게 주행하셨네요 ~);
   else
      System.out.println("100km 안넘었어요! ");
}
 

이렇게 하면, 정확한 거리를 알려주지 않더라도 내가 원하는 정보를 알게 된다!
조금더 정보가 숨겨진 것 같지 않은가????

Getter/Setter 을 쓰지 말아야하는 -> 줄여야하는 이유

get/ set 사용을 지양해야 하는 이유는 위에서 보았듯 일차적으로 데이터를 보호하기 위해 사용하지만,

사용하게 되면 데이터가 노출된다. 가 이유인 것 같다.

그렇다고 해서 아예 사용을 하지 않고서는 코딩이 어렵다!! ㅠㅠ

따라서 쓰지 말아야하는 -> 줄여야하는 으로 변경했다.

느낀점

객체 지향에 대해 다각도로 바라본 경험이었다.
무의식으로 get/set 을 만들어서 사용하곤 했는데, 의식해서 줄여봐야겠다. 
이번 미션부터 적용해보자!

참고

profile
짜장면 쟁이

1개의 댓글

comment-user-thumbnail
2022년 4월 11일

신입인데 글보면서 배우고갑니다...

답글 달기