일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- JXM
- 상수와 Enum
- 백준
- 테스트 성능 개선
- 자바로 만들수 있는 것
- java 1000번 A+B
- 우테코4기
- Oracle JDK와 OpenJDK의 차이
- 우아한테크코스
- 리스코프치환원칙
- 윤년계산하기
- 자바 4334
- 상근날드
- 자판기미션
- PR 오류
- 프로젝트 패키지 구조
- 블랙잭 회고
- throw 와 throws 차이
- 인수테스트
- ServiceTest
- JDK
- Getter Setter
- 방어적 복사
- 제임스고슬링
- 객체지향적인 설계
- 자바 버전 다운 그레이드
- There isn't anything to compare.
- 자바의 종류
- 우테코
- ControllerTest
- Today
- Total
개발새발
Getter Setter 를 쓰지 말아야하는 이유가 뭘까? 본문
Private 로는 데이터를 지키기에 부족한걸까?
맨 처음 객체 지향에 대해 배울 때, 데이터를 다른 곳에서 변경하지 못하도록
접근 제어자를 private 로 두고, getter / setter 를 사용하라고 배웠다.
그런데 이번 요구사항에 최대한 setter 를 쓰지 않고 해보라 는 의문의 메시지가 있었다.. ! 😲😲
왜 그렇게 해야할까?
객체 지향 프로그래밍의 본질
객체 상태를 보호하기 위해 외부에 노출되는 정보를 줄이고, 다른 객체와 메세지를 주고받아 협력하는 것 이라고 생각한다.
여기서 핵심 키워드는 노출되는 정보를 줄임 과 메세지로 협력 이다.
setter 를 사용하게되면 클래스 외부에서 내부를 수정하게 되니, 객체를 보호하는 것에 멀어지고,
getter 를 사용하게되면 정보를 노출한다.
캡슐화
내가 알고 있는 캡슐화란 정보를 은닉해서 데이터 접근을 막는 것 이었다.
흠.. 🤔 조금 더 깊은 이해가 필요할 것 같아 객체 지향에 관련된 책을 펼쳐봤다.
여기서 tell, don't ask 라는 단서를 찾았다. 필요한 액션을 말해, 정보를 묻지말고. 라고 이해했다.
묻지도 따지지지도 말고 (원하는 행동을)말해!
그래!! 정보를 주지말고, 정보에 관련 된 처리를 가지고 있는 당사자가 해보면 어떨까?
만약 자동차 주행 거리가 100km 가 넘었는지 알고싶다고 하자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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 안넘었어요! ");
}
|
s |
여기서 get 을 사용하면 거리가 노출된다. 바꿔보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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 안넘었어요! ");
}
|
cs |
이렇게 하면, 정확한 거리를 알려주지 않더라도 내가 원하는 정보를 알게 된다! 조금더 정보가 숨겨진 것 같지 않은가????
Getter/Setter 을 쓰지 말아야하는 -> 줄여야하는 이유
get/ set 사용을 지양해야 하는 이유는 위에서 보았듯 일차적으로 데이터를 보호하기 위해 사용하지만,
사용하게 되면 데이터가 노출된다. 가 이유인 것 같다.
그렇다고 해서 아예 사용을 하지 않고서는 코딩이 어렵다!! ㅠㅠ
따라서
쓰지 말아야하는
-> 줄여야하는 으로 변경했다.
느낀점
객체 지향에 대해 다각도로 바라본 경험이었다.
무의식으로 get/set 을 만들어서 사용하곤 했는데, 의식해서 줄여봐야겠다.
이번 미션부터 적용해보자!
참고
'java' 카테고리의 다른 글
String.split() (0) | 2022.02.20 |
---|---|
HashSet, TreeSet, LinkedHashSet (0) | 2022.02.20 |
final 과 static final 의 차이? (0) | 2022.02.20 |
private 생성자를 선언하는 목적이 뭘까? (0) | 2022.02.20 |
자바란 Write Once, Run Everywhere. (0) | 2020.12.20 |