getXXX 로 받아와서 비교를 하다기 보다 객체로 메세지를 보내 비굣값을 받아보자

이 피드백으로 나는 디미터 법칙을 알게 되었다

 

❓ 여기서 생긴 궁금증

  • 단순히 인스턴스 변수를 반환 받는 것 또한 getXXX -> receiveXXX 이런 식으로 반환을 받아야 하는 것일까??

 

자바 빈 규약

  • 멤버 변수들은 private 선언
  • private 선언되어 있기에 접근을 하기 위한 getter, setter 필요

 

디미터 법칙

  • 객체는 그것이 내부적으로 보유하고 있거나 메시지를 통해 확보한 정보만 가지고 의사 결정을 내려야 한다

 

자바 빈 규약 vs 객체지향 서로의 관점

자바 빈 규약에서는 멤버 변수가 private 선언 되었기에 접근 가능한 getter, setter 를 정해 놓은 것
객체지향에서는 값이 변형되지 못하게 인스턴스 변수의 복삿값만 전달하는 용도의 getter
뭔가 말장난 같지만 단순히 접근의 용도와 변수의 복삿값 전달 관점은 확실히 다른 것 같다

✏️ 결론

무조건 getter, setter 를 쓰지 말라는 것이 아니다. getter 를 쓰는 것은 인스턴스 변수의 복삿값을 반환하는 거라 변경에 대한 걱정을 하지 않아도된다. 인스턴스 변수가 필요하다면 자바 빈 규약과 객체지향 서로를 만족하는 receiveXXX 로 수정해서 사용한다기 보다 getXXX 를 사용하면 좋을 것 같다
디미터 법칙은 비교를 할 때 getter 로 값을 꺼내서 비교한다기 보다 그 객체로 책임을 넘겨줌으로서 좀 더 객체지향적인 코드가 된다
지금 프로젝트가 아주 작은 프로젝트지만 message chains 가 일어나고 엄청 길어졌다. 디미터 법칙을 적용해서 책임을 넘기고 넘김으로서 캡슐화가 되며 조금 더 안정적인 코드가 되는 것 같다

🙏 놓쳤던 부분

위에 밑줄과 기울어진 문장들을 볼 수 있다. 이는 getter 쓰는 것이 복삿값을 반환하는거라 고정이 되어 있다
단순히 getter 를 구현했다고 복삿값을 항상 전달하는 것이 아니란 것을 알게 되었고 구현 방법에 따라 다르기에 오해를 할 수 있다는 피드백으로 방어적 복사를 이어서 알게 되었다.

getter 구현방법은 세가지가 있을 것 같다
private List<Car> cars 인스턴스 변수가 있다고 가정하면
- 인스턴스 변수의 복삿값 return this.cars;
- 방어적 복사를 사용한 반환값 return new ArrayList(this.cars);
- unmodifiableList() 이용한 반환값 return Collections.unmodifiableList(this.cars);
위에 대해서는 다른 글에서 자세히 다룰 예정이다

'java > ' 카테고리의 다른 글

JVM, JDK, JRE 차이는?  (0) 2022.11.21
Java 란?  (0) 2022.11.21
복사했습니다!