프로젝트를 검토하던 중 DTO(Data Transfer Object)파일과 entity파일에서 왜 생성자, getter, setter를 사용하는가 객체 내부 값들은 왜 항상 private로 선언을 할까? 라는 의문을 갖게 되었다.
사실 위 내용들은 처음 객체 지향언어를 배울 때 접하는 내용들이지만 실제로 개발을 할 때, 머릿속으로 나중의 일들까지 생각하며 개발하기는 쉽지 않다. 그렇기 때문에 이번에 더 자세히 알고 가자.
먼저 이해를 돕기 위해 내 실제 코드를 예시로 들어보자. 아래 코드는 카카오 로그인시 응답 받는 정보를 받기 위한 객체이다.
public class KakaoDTO {
private long id;
private String nickname;
public KakaoDTO(long id, String nickname) {
this.id = id;
this.nickname = nickname;
}
public long getId() {
return id;
}
public String getNickname() {
return nickname;
}
public void setId(long id) {
this.id = id;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
변수는 왜 private로?
위 코드에서 id와 nickname을 private으로 설정해 주었을까? 이유는 객체 지향 프로그래밍의 기본 원칙 중 하나인 '캡슐화(Encapsulation)'을 지키기 위해서다.
- 캡슐화(Encapsulation) : 데이터의 무결성을 보호하고 객체의 상태를 안전하게 유지하는 것을 목적으로 클래스 내부의 상태를 외부로부터 보호하고 직접적인 접근을 제한하는 것
private 키워드를 사용했다고 캡슐화가 됐다고 하지는 않는다. 생성자와 getter, setter와 같은 메소드를 통해 생성되는 객체의 값을 초기화하고 접근되는 값을 설계까지 해야 캡슐화 했다고 볼 수 있다.
그렇다면 위 코드는 왜 캡슐화를 통해 객체를 외부로부터 지켜야 할까?
위 코드의 목적은 앞에서 말했듯이 카카오 로그인을 통해 응답 받은 정보를 담는 것이다. 그렇다면 카카오 로그인은 언제 발생할까? 사용자가 로그인을 할 때마다 발생한다. 그 말은 즉슨, 클라이언트에서 로그인을 할 때마다 해당 객체를 통해 데이터를 운반해야 하는데, 외부에서 이를 변경할 수 있다면 개발자의 잘못된 설계로 인해 long으로 정해져 있는 값이 string으로 바뀌어서 전달되는 일이 발생할 수도 있다. 이를 접근 제한자를 통해 제한하고, 생성자 getter setter를 통해 외부 접근을 관리한다.
getter와 setter
- setter : 객체가 생성되었을 때, 헤당 객체의 private한 변수의 값을 정해준다.
- getter : 생성된 객체에서 정해진 private한 변수의 값을 받아준다.
추가로 setter의 경우 정해주는 값을 설계할 수 있다. 예를 들어서 위 코드 setNickname 메소드 내부에 nickname값으로 특수문자가 틀어오지 못하게 설계할 수도 있다.
생성자
생성자는 객체가 생성될 때 반드시 호출되는 메소드로 호출될 때 내부 값들을 초기화 시켜주는 역할을 한다. 생성자는 클래스의 이름과 반드시 동일해야 하며 리턴타입을 따로 지정할 수 없다. setter와 마찬가지로 초기 주어지는 값들을 설계할 수 있다.
생성자와 관련해서는 별도의 회고록을 작성하였다.
'개발 > withfriend 🫱🏼🫲🏽🥕' 카테고리의 다른 글
[프로젝트 회고] 테이블 구조도 (0) | 2024.04.25 |
---|---|
[withfriend] 서비스 흐름도 (0) | 2023.11.15 |
[개발 이슈] 회원 탈퇴 (0) | 2023.11.01 |
[개발 이슈] 포인트 출금 (0) | 2023.11.01 |
[개발 이슈] 사용자 간 거래 → point로 구현하다 (0) | 2023.11.01 |