들어가기
엘레강트 오브젝트 책을 읽으면서, getter, setter에 대해서 궁금증을 가질 수 있었습니다. 자바 진영에서는 Lombok 때문에라도 Getter, Setter를 더욱 편하게 쓸수 있습니다.
또한, 뜻이 맞는 이와 소통하는 방에서도 비슷한 질문이 나와서 아래와같이 답변했습니다.
왜 Getter와 Setter를 사용할까?
Getter와 Setter를 이해하기 위해선는, 자료구조와 객체의 차이점을 먼저 이해해야한다고 생각합니다.
클린코드에서나 또는 구글에서 객체와 자료구조에 대한 차이점을 검색하면 여러 결과물이 나옵니다. 몃가지 내용을 정리하면 아래와 같습니다.
객체와 자료구조의 차이점은 무엇일까?
객체는 추상화된 인터페이스 뒤로 자료를 숨긴 채 데이터를 다루는 함수만 공개합니다.
자료구조는 데이터를 그대로 공개하며 별다른 함수를 제공하지 않습니다.
엘레강트 오브젝트에서는 이렇게 설명하기도 합니다.
자료구조와 객체의 차이점은 자료구조는 투명하지만, 객체는 불투명하다. 자료구조는 글래스 박스(glass box)라면, 객체는 블랙 박스(black box)이다. 자료구조는 수동적이지만, 객체는 능동적이다.
왜 자료구조와 객체에 대한 설명을 했을까요?
자바에서 자료구조를 만들기 위한 방법과 객체를 만드는 방법이 무엇일까요?
C언어에서는 struct 라는 키워드로 구조체(자료구조)를 만들 수 있는 방법이 있는 반면에, Java의 경우에는 그런 키워드가 없기 때문에, 객체를 자료구조처럼 만들기 위해서 Getter, Setter를 쓰는 것이 아닐까요?
우리는 개발할 때 기계처럼 Getter와 Setter를 사용하고 있습니다. 이펙티브자바 책에서는 Setter를 사용하지 않고, 의미있는 이름을 부여하라는 말도 있듯이, Getter도 마찬가지라고 생각합니다. getXXX() 라는 말의 깊이있게 이해해봅시다.
GetXXX()
"Class 멤버 변수 중 XXX 라는 데이터를 찾아서 반환해주세요."
만약, 객체였다면 위 형태의 메소드는 OOP에서 캡슐화를 위반한다고 생각합니다. 왜 찾아서 반환해야될까요? 나는 XXX가 뭔지 모르겠지만, 객체에서 물어보고 있는 중인데, "XXX 있어?" 이렇게, 근데 왜 찾아서 반환해줘야 하는걸까요? XXX() 라는 함수로 작성했다면 조금더 나은 코드라고 말할 수 있지 않을까요?
"찾아서 반환해주세요!" > "XXX"
결론
먼저 Lombok에서 제공해주는 편리한 Getter, Setter는 연습용 프로젝트에서만 사용하자. 실제로 동작되는 서비스에서는 조심하고 또 조심해서, 메서드명이 객체에서 의미하는 바가 무엇인지 고민하자.
Getter, Setter는 Java에서 구조체처럼 만들기 위해서 만들어진 것이기 때문에 객체를 만들기 위해서라면 자제하자.
[참고자료]
stackoverflow.com/questions/3211162/java-method-naming-conventions-too-many-getters
nesoy.github.io/articles/2018-01/CleanCode-Object
'가치관 쌓기' 카테고리의 다른 글
계약에 의한 설계(Contract By Design) 더 잘 활용하기(with java) (0) | 2021.04.05 |
---|
댓글