0. 이 글을 왜 작성하는가
한국에 있는 아티클 중 이 주제에 대해서는 사용하지 말아야 한다는 사람들이 없었다. 나는 그 주제들에 대해 크게 공감할 수가 없어 해외 아티클을 찾아보기 시작하였고 심심찮게 getter/setter를 피하라는 글을 볼 수 있었다.
https://www.infoworld.com/article/2073723/why-getter-and-setter-methods-are-evil.html
https://dev.to/scottshipp/avoid-getters-and-setters-whenever-possible-c8m
https://ericnormand.me/podcast/why-getters-and-setters-are-terrible
1. 본문
우선 getter/setter는 객체지향에서 필수 요소는 아니다.
객체지향 시스템의 기본 원칙은 객체가 세부 내용을 노출해서는 안된다는 것이다(은닉화). private으로 되어있는 필드를 getter를 이용해 접근하던 .을 통해 바로 접근하던 별 차이가 없다. 심지어는 세부 내용을 더 노출하는 경우를 발생시킬 수 도 있다. 예를 들어 Car라는 클래스에서 다음 API를 제공한다는 가정을 해보자.
Car
+ getGasAmount(): Liters
+ setGasAmount(liters: Liters)
우리는 이 API명세를 보고 해당 차는 Gas차임을 추정해볼 수 있게 된다. 벌써 은닉/캡슐화가 박살났다.
아마 getter/setter를 이런식으로 사용 가능하면 되는 거 아니냐 라는 사람이 있을 수 있다.
public Liter getGasAmount(){
if(this.fuel == null || this.fuel.isEmpty()){
this.fuel.amount = 0;
}
return fuel;
}
public Liter setGasAmount(Fuel _fuel){
if(_fuel == null){
_fuel.amount = 0;
}
this.fuel = _fuel;
}
흔히 경계 설정, 방어 코드 등이라 하는데 이미 이렇게 들어간 순간 getter/setter의 본래 의미를 잃어버렸다.
getter는 null이여도 그대로 반환해서 사용자가 null핸들링을 해야 하고 setter에 들어가기 전 사용자가 핸들링해서 집어넣거나 그래도 넣어야 한다.
2. 마무리 및 내 생각
이전부터 계속 getter/setter에 대해 반드시 써야 하나에 대해 많은 생각을 가지고 있다가 최근에 더욱 검색을 하기 시작하였다.
컨벤션, 가독성 등의 이유로 getter/setter를 사용한다고 하는 것에는 적극 찬성한다. 하지만 그 이유가 아니라면 나는 흠.. 더 이상 할 말이 없다. 대표적으로 kotlin이 java의 단점을 보완해서 만든 언어라고 하는데 getter/setter가 어떤지 비교해보면 알게 된다.
학교, 학원 등에서 getter/setter를 사용해야 한다고 주장할 때 왜 사용해야하는지, .을 찍고 하는 것과 무엇이 다른지 정확히 설명을 요청해보길 원한다.
'주니어 개발자로 일하며 느낀 점' 카테고리의 다른 글
2023년을 어떻게 보냈었더라 (3) | 2024.01.14 |
---|---|
[버그] 231125 야스오 버그 영상을 보며 든 생각 (0) | 2023.11.26 |
교육자료 준비 (0) | 2022.10.30 |
개발에 대한 생각이자 아무말 대잔치 (0) | 2022.04.30 |
2020년 뉴비 1년차 개발자를 마무리하는 회고 (0) | 2020.12.30 |