-
Java 접근제한자와 entity 설계(getter/setter, lombok)Spring 2023. 3. 7. 09:09
프로젝트를 진행하다가 문득 접근제한자에 대해 궁금증이 생겼다.
Entity를 설계할 때, 나는 자연스럽게 멤버 변수에 기본 접근제한자로 생성했었고, 다른 분들의 블로그를 보면 private으로 선언을 하셨다.
내가 한 것과 어떤 차이가 있을까.
우선 접근제한자부터 정리하자면,
public > protected > default > private
- public : 접근 제한 없음
- protected : 같은 패키지 내에 존재하거나 자손클래스에서만 접근 가능
- default : 접근제한자를 명시하지 않으면 default 값이 되며, 같은 패키지 내에서만 접근 가능
- private : 같은 클래스 내에서만 접근 가능
캡슐화
접근제한자는 객체지향의 캡슐화를 위한 도구라고 할 수 있다.
캡슐화는 다음과 같은 성격을 지닌다.
- 유사한 기능이나 변수를 한 집합으로 하여 더 관리하기 쉽게하고 코드를 명확히 한다.
- 외부에서 멤버 변수를 접근하는 방법을 제한할 수 있도록 직접 접근을 막거나, 접근 전 부가적인 처리를 요구함.
- 정보를 외부에 은닉하여 외부에서는해당 집합의 세부 내용에 집중하지 않도록 함.
1번은 클래스를 예시로 들 수 있따. 객체의 속성이나 행위를 집합화 하는 것을 의미한다.
2,3번은 Getter/Setter에 대한 설명을 말하고 있다.
다시 본래의 주제로 돌아가서, 왜 멤버 변수를 private으로 선언을 할까?
우선 default로 설정하여 Test를 진행해보도록 하겠습니다.
default
public class Test { public static void main(String[] args){ Member member = new Member(); member.name = "ckdals"; member.age = 28; member.test(); } } class Member{ String name; int age; void test(){ System.out.println(age); System.out.println(name); } }
Member 클래스에 직접적으로 접근하여 멤버 변수를 설정해 줄 수 있습니다.
실제로 이 코드가 쓰인다면 아무데서나 활용될 수 있으니 위험할 것 같습니다.
하지만 패키지를 분리한다면 어떻게 될까요?
public class Member { String name; int age; public void test(){ System.out.println(age); System.out.println(name); } }
Member 클래스를 다른 패키지에서 public으로 생성하고, test 메서드도 public으로 해줍니다.
사진을 보시면 default 접근제한자로 되어 있는 변수는 에러가 나고, public으로 수정해 준 것은 정상 접근 가능합니다.
public, private
이번에는 처음의 코드에서 Member 클래스를 아래와 같이 수정해 봅시다.
public class Test { public static void main(String[] args){ Member member = new Member(); member.name = "ckdals"; member.age = 28; member.test(); } } class Member{ private String name; int age; public void test(){ System.out.println(age); System.out.println(name); } }
인텔리제이 덕분에 미리 결과를 알 수 있을 것 같네요!
private으로 선언한 name은 직접 접근이 되지 않고, public 과 default는 정상적으로 접근이 가능합니다.
protected는 default와 같이 다른 패키지에 있으면 접근할 수 없습니다.
다만 Member 클래스를 상속받게 된다면 정상 접근이 가능합니다.
테스트를 진행하려 했지만 귀찮은 관계로.. 원했던 결과는 얻었으므로 생략하도록 하겠습니다.
Setter
위의 설명처럼 변수에 직접 접근이 되는 것은 위험하다. 따라서 접근제한자로 임의의 곳에서 접근 하는 것을 막고, 메서드를 통해 필요한 때에만 수정이 가능하도록 하기 위해 쓰인다.
Getter
객체에 대한 정보를 조회하고 싶을 때, 불필요하게 모든 정보가 다 가져오게 된다.
예를 들어 Member의 이름만 필요한데 불필요하게 나이와 주소, 이메일 등의 정보들이 한꺼번에 가져오게 된다.
다른 사람에게 보이면 안되는 변수들의 외부 노출을 제한하고, 필요한 정보만 노출시켜주기 위해 사용된다.
Lombok
Getter / Setter를 직접 만드는 것은 멤버 변수가 많아질수록 가독성이 떨어지게된다.
이럴 때 Spring에서는 Lombok 라이브러리를 추가하여 어노테이션으로 사용하면 getter와 setter를 깔끔하게 처리할 수 있다.
결론
Entity 객체에 임의로 접근하여 수정하는 것을 제한하기 위해 private을 사용한다.
다만 나는 이 때까지 패키지를 분리해 왔기 때문에 private을 사용한 것과 같은 결과를 얻고 있었다.
여기서 또 하나 드는 의문은 과연 entity 패키지를 분리해 주어도 private을 쓰는 것이 더 좋을까?
이건 조금 더 고민을 해봐야겠다.
- 같은 패키지 : private 선언 필요
- 다른 패키지 : default를 해도 다른 곳에서 접근 불가능
'Spring' 카테고리의 다른 글
Java, Database, Synchronized 등 다양한 동시성 제어 방법 in Java (2) (0) 2023.03.23 Java, Database, Synchronized 등 다양한 동시성 제어 방법 in Java (1) (0) 2023.03.21 JDBC Template을 이용한 회원정보 변경 내역 저장 (4) (0) 2023.02.25 JDBC Template을 이용한 회원정보 변경 기능 구현(3) (0) 2023.02.24 JDBC Template을 이용한 회원정보 조회 기능 구현(2) (0) 2023.02.23