개발일지/JAVA,SPRING

📌 Java 접근 제어자(private / default / protected / public) 완전 정리

recording or reCoding 2025. 12. 12. 15:01

Java에서 클래스와 필드를 설계할 때 가장 먼저 고민해야 하는 게 **접근 제어자(Access Modifier)**다. 접근 제어자는 말 그대로 “어디까지 접근을 허용할 것이냐”를 결정한다.
잘 쓰면 객체의 안정성이 올라가고, 잘못 설계하면 유지보수가 지옥이 된다.

그래서 네 가지 접근 제어자를 정확하게 알고 쓰는 게 중요하다.


🔒 1. private — 가장 강력한 캡슐화

클래스 내부에서만 접근 가능.

 
class User { private String name; private void validate() { ... } }
  • 같은 클래스 안에서만 접근할 수 있음
  • 외부에서 절대 접근 불가
  • 필드, 메서드를 완전히 숨기고 싶을 때 사용
  • 객체지향에서 캡슐화의 핵심

실무에서 제일 자주 쓰는 접근 제어자
(필드는 거의 대부분 private + getter/setter 로 처리)


🟦 2. (default) — 패키지 내부 공개 (아무것도 안 쓰는 상태)

패키지 안에서만 접근 가능.

 
class UserService { ... } // ← default 클래스
  • 접근 제어자를 안 쓰면 default
  • 같은 패키지에 있는 클래스들은 접근 가능
  • 다른 패키지에서는 접근 불가

언제 쓰냐?

  • 외부에 절대 노출할 필요 없는 내부 유틸 클래스
  • 패키지 단위의 모듈 경계 설정할 때

🟡 3. protected — 패키지 + 상속 관계 내부 공개

default 범위 + 상속받은 클래스에서 접근 가능.

 
class User { protected String role; } class Admin extends User { void checkRole() { System.out.println(role); // 가능 } }
  • 같은 패키지면 접근 가능 (default와 같음)
  • 다른 패키지여도 상속받은 클래스라면 접근 가능

실무에서 주로 쓰는 곳

  • 상속 구조에서 서브클래스가 필요한 정보만 넘겨줄 때
  • 확장 가능성을 열어두고 싶을 때

🟢 4. public — 전역 접근 허용

모든 곳에서 접근 가능.

 
public class UserController { public void createUser() { ... } }
  • 어디서든 접근 가능
  • API 엔드포인트, 라이브러리에서 외부 공개용 클래스 등에 사용

진짜 필요한 경우에만 사용해야 한다.
불필요하게 public을 쓰면 모듈 경계가 흐려지고 유지보수 난이도가 올라감.


📚 접근 제어자 비교표

접근 제어자같은 클래스같은 패키지상속받은 클래스외부
private ✔️
default ✔️ ✔️
protected ✔️ ✔️ ✔️
public ✔️ ✔️ ✔️ ✔️