맨 처음 객체 지향에 대해 배울 때, 데이터를 다른 곳에서 변경하지 못하도록
접근 제어자를 private
로 두고, getter / setter
를 사용하라고 배웠다.
그런데 이번 요구사항에 최대한 setter 를 쓰지 않고 해보라
는 의문의 메시지가 있었다.. ! 😲😲
왜 그렇게 해야할까?
객체 상태를 보호하기 위해 외부에 노출되는 정보를 줄이고, 다른 객체와 메세지를 주고받아 협력하는 것 이라고 생각한다.
여기서 핵심 키워드는 노출되는 정보를 줄임
과 메세지로 협력
이다.
setter 를 사용하게되면 클래스 외부에서 내부를 수정
하게 되니, 객체를 보호하는 것에 멀어지고,
getter 를 사용하게되면 정보를 노출
한다.
내가 알고 있는 캡슐화란 정보를 은닉해서 데이터 접근을 막는 것 이었다.
흠.. 🤔 조금 더 깊은 이해가 필요할 것 같아 객체 지향에 관련된 책을 펼쳐봤다.
여기서 tell, don't ask
라는 단서를 찾았다. 필요한 액션을 말해, 정보를 묻지말고.
라고 이해했다.
묻지도 따지지지도 말고 (원하는 행동을)말해!
만약 자동차 주행 거리가 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 안넘었어요! ");
}
이렇게 하면, 정확한 거리를 알려주지 않더라도 내가 원하는 정보를 알게 된다!
조금더 정보가 숨겨진 것 같지 않은가????
get/ set 사용을 지양해야 하는 이유는 위에서 보았듯 일차적으로 데이터를 보호하기 위해 사용하지만
,
사용하게 되면 데이터가 노출
된다. 가 이유인 것 같다.
그렇다고 해서 아예 사용을 하지 않고서는 코딩이 어렵다!! ㅠㅠ
따라서 쓰지 말아야하는 -> 줄여야하는
으로 변경했다.
객체 지향에 대해 다각도로 바라본 경험이었다.
무의식으로 get/set 을 만들어서 사용하곤 했는데, 의식해서 줄여봐야겠다.
이번 미션부터 적용해보자!
신입인데 글보면서 배우고갑니다...