getter, setter란?(+사용하는 이유, 지양하는 이유)

토끼는 개발개발·2024년 6월 16일
0

Spring Boot

목록 보기
18/18
post-thumbnail

이번 포스팅은 묵히고 묵혔던 getter setter에 대한 포스팅이다.

업무에서 getter setter 생성을 통해 VO, DTO를 사용한다.
(getter setter 생성 단축키: 이클립스 alt+shift+s / 인텔리제이 alt+insert)

'왜 getter setter를 사용하는가?'라는 질문이 생겼다.
대충 캡슐화, 보안적인 문제라는 것은 알고 있는데 좀 더 정확하게 알기위해 포스팅 해보고자 한다.

여기에선 <자바의 제어자> 개념을 알고 있어야 하므로,
접근제어자 개념을 모른다면 하단 포스팅을 미리 보고 오는 것을 추천한다.

[Java] Ch07_4. 제어자


📌 1. getter, setter란?

데이터의 직접적인 접근을 막고, getter와 setter 메서드를 사용하여 데이터의 값을 꺼내오거나 수정하는 일종의 기법.

  • getter: 외부에서 객체의 데이터를 읽을 때 사용하는 메서드(return값 필요)
  • setter: 외부에서 객체의 데이터를 수정할 때 사용하는 메서드(매개변수 필요)

먼저 생긴걸 보자.

1) 필드(멤버변수)는 private 접근제어자를 통해 객체 외부에서 객체의 필드에 직접적으로 접근하는 것을 막는다.

2) getter, setter 메서드는 public 접근제어자를 통해 외부에서 접근 가능하도록 하고, getter, setter 메서드를 통해 필드값을 사용하고 수정한다.

3) get/set+필드이름(대문자시작)으로 명명한다.


외부 객체에서 getter, setter를 사용해 데이터에 접근해보자.

Student student = new Student();
Int age = student.getAge(); //getter를 통해 age값 가져오기.
student.setAge(5); //setter를 통해 age값 수정.

getter메서드는 데이터를 가져와야 하므로 return이 필요하다.
setter메서드는 값을 수정해야하므로 매개변수(위의 예시에서는 5)가 필요하다.




📌 2. getter, setter 사용하는 이유

1. 데이터의 무결성이 지켜진다.
: getter, setter를 통해 데이터에 접근 및 생성하므로 한 번 검증하고 처리할 수 있게 된다.
(무분별한 setter는 무결성을 해칠 수 있다. 이는 아래 3번 지양하는 이유에서 설명.)

2. 정보은닉이 가능하다.
: 객체의 필드를 private 접근제어자로 두면서 객체지향의 목적인 정보은닉이 가능하다.

💡 데이터의 무결성은 데이터의 정확성, 일관성, 유효성이 유지되는 것을 말한다

쉽게 말해, 데이터는 소중하니 중간에 메서드로 중개자를 두겠다는 것이다. (like a 부동산 중개업자)

아까 위의 Student클래스의 멤버변수 age가 private이 아닌 public이라고 가정해보자.

student.age = -30;

이렇게 학생의 나이가 '-30'이라는 말도 안되는 값을 데이터에 넣게 된다.
하지만, age가 private 접근제어자이고 setter를 통해 값을 변경한다면,

public void setAge(int age) {
		if(age < 1){
        	this.age = 1;
        }else{
        	this.age = age;
        }
	} 

위와같이 사전 검증을 통해 데이터를 넣을 수 있게 된다.




📌 3. getter, setter를 지양하는 이유


위의 2번의 내용을 보며 의문이 들 것이다.
private로 정보를 은닉했는데 결국, getter와 setter를 통해 외부에서 데이터에 쉽게 접근 할 수 있다.
기껏 숨긴 필드들을 메서드라는 수단을 통해 외부로 노출시키고 있는 것이다.
이는 캡슐화를 위반한다.

또한, setter로 데이터를 수정하면 어떤부분을 어디서 왜 수정하는지 알 수가 없다.
그러므로 setter 메서드는 도메인의 의미나 의도를 표현하지 못하고,
도메인 로직을 도메인 객체가 아닌 응용 영역이나 표현 영역으로 분산시킨다.

아 그럼 어쩌라고?
=> 요즘엔 setter대신 의도와 목적이 명확한 메서드를 사용하는 것을 지향하는 추세이다.

getter, setter가 지양되는 OOP 4대원칙, SOLID 개방폐쇄원칙
그리고 이를 해결하기 위한 방법은 더 긴긴 포스팅이 될 것이므로 다음에 추가적으로 자세히 포스팅하겠다.




포스팅 한마디

getter setter를 수없이 쓰면서 그 의도와 목적에 대해서는 '어렴풋이' 알 뿐, 제대로 설명하지 못했다.
우리가 습관적으로, 자연스럽게 쓰는 것들에 대해 '왜?'라는 의문을 가지고, 그것에 대한 답변을 찾아갈때 비로소 '코드를 짠다.'라고 할 수 있는 것 같다.
꼬리의 꼬리를 무는 묵은 포스팅들이 임시저장소에 엄청 많은데 하나씩 해결해가는 재미가 있다.

profile
하이 이것은 나의 깨지고 부서지는 기록들입니다

0개의 댓글