본문 바로가기
language/java

Java 접근 제어자(private/protected/public/default) 완벽 이해하기

by 죄니안죄니 2026. 5. 22.
반응형

Java 접근 제어자(private/protected/public/default) 완벽 이해하기

Java 객체지향 프로그래밍(OOP)에서 매우 중요한 개념 중 하나가 바로:

접근 제어자(Access Modifier)

입니다.

초보 시절에는 보통:

private = 숨김
public = 공개
 

정도로만 외우고 넘어가기 쉽습니다.

하지만 실제 접근 제어자는 단순 문법이 아니라:

  • 캡슐화
  • 객체 보호
  • 모듈화
  • 유지보수성
  • 아키텍처 안정성

과 깊게 연결됩니다.

실무에서도 접근 제어자를 잘못 사용하면:

  • 객체 내부 상태가 무분별하게 변경되고
  • 결합도가 증가하며
  • 유지보수가 매우 어려워집니다.

이번 글에서는:

  • 접근 제어자의 진짜 의미
  • private/protected/public/default 차이
  • JVM 관점 접근 범위
  • 캡슐화와의 관계
  • 실무 설계 전략

까지 정리해보겠습니다.


1. 접근 제어자란?

접근 제어자는:

클래스, 변수, 메서드의 접근 범위를 제한하는 키워드

입니다.

즉:

누가 접근 가능한가?
 

를 결정합니다.


2. Java 접근 제어자 종류

Java 접근 제어자는 총 4가지입니다.

접근 제어자접근 범위
private 같은 클래스
default 같은 package
protected package + 상속
public 전체 공개

3. private

가장 강한 제한.

 
private String password;
 

의미:

현재 클래스 내부만 접근 가능
 

4. private 사용 이유

핵심 목적:

  • 객체 상태 보호
  • 무결성 유지
  • 캡슐화 강화

예시:

 
account.balance = -10000;
 

같은 잘못된 접근 방지.


5. private 메서드

 
private void validate() {

}
 

특징:

  • 내부 구현 전용
  • 외부 호출 불가

실무에서:

공통 검증 로직
내부 유틸 메서드
 

등에 자주 사용.


6. private는 상속도 불가능

 
class Parent {

    private int value;
}
 

자식 클래스에서도 접근 불가.

왜냐하면:

private는 클래스 내부만 허용
 

이기 때문.


7. default 접근 제어자

아무것도 안 쓰면 default.

 
class User {

}
 

의미:

같은 package 내부 접근 가능
 

8. default 특징

예시:

com.example.user
 

package 내부 클래스끼리는 접근 가능.

하지만 다른 package에서는 접근 불가.


9. default는 어디서 많이 사용할까?

실무에서는:

  • package 내부 전용 객체
  • 내부 구현 클래스
  • 숨기고 싶은 구조

등에 사용.


10. protected

 
protected int age;
 

의미:

같은 package
+
상속 관계 접근 가능
 

11. protected 예시

 
class Parent {

    protected void hello() {

    }
}

class Child extends Parent {

    void test() {
        hello();
    }
}
 

가능.


12. protected의 진짜 목적

핵심은:

상속 구조 지원
 

입니다.

즉:

  • 외부 전체 공개는 싫고
  • 자식 클래스는 허용하고 싶을 때

사용.


13. public

 
public class User
 

의미:

어디서든 접근 가능
 

14. public 남용 문제

초보자가 자주 하는 실수:

 
public String name;
public int age;
 

문제:

  • 객체 상태 보호 불가
  • 캡슐화 붕괴
  • 유지보수 어려움

15. 접근 범위 표

접근 제어자같은 클래스같은 package상속외부
private O X X X
default O O X X
protected O O O X
public O O O O

16. 접근 제어자와 캡슐화

캡슐화 핵심:

내부 상태 보호
 

접근 제어자는 이를 위한 핵심 도구.

대표 예시:

 
private int balance;
 

17. Getter/Setter와 접근 제어자

보통:

 
private 필드
+
public getter/setter
 

구조 사용.


18. 하지만 Setter 남용 주의

 
user.setAge(-100);
 

가능해지면:

  • 객체 무결성 깨짐
  • 캡슐화 약화

발생 가능.


19. 실무에서 좋은 설계 방식

setter 대신:

 
increaseBalance()
changePassword()
completeOrder()
 

처럼:

의미 있는 행동 제공

추천.


20. 클래스 접근 제어자

클래스에도 접근 제어자 사용 가능.

가능한 것:

키워드가능 여부
public O
default O
private X
protected X

21. 왜 클래스는 private 불가능할까?

Top-level class는:

package 기준 관리
 

되기 때문.

대신:

 
inner class
 

에서는 private 가능.


22. Inner Class와 private

 
class Outer {

    private class Inner {

    }
}
 

가능.


23. 접근 제어자와 유지보수

접근 범위를 최소화하면:

  • 의존성 감소
  • 변경 영향 감소
  • 버그 감소

효과.

좋은 설계 원칙:

최소한만 공개
 

24. 정보 은닉(Information Hiding)

접근 제어자는:

내부 구현 숨김

과 연결됩니다.

예시:

 
public void pay()
 

사용자는 내부:

  • DB 저장
  • API 호출
  • 로그 처리

몰라도 사용 가능.


25. 접근 제어자와 Spring

Spring에서도 매우 중요.

예시:

 
@Service
@RequiredArgsConstructor
 

보통:

 
private final
 

필드 사용.

왜냐하면:

  • 외부 변경 차단
  • 불변성 강화
  • 의존성 보호

가능하기 때문.


26. 실무에서 자주 하는 실수

1) 모든 필드 public

캡슐화 완전 붕괴.


2) 무조건 public 메서드

외부 노출 과도 증가.


3) util/common 남용

default/package 구조 활용 부족.


27. 좋은 접근 제어 전략

추천 순서:

private
↓
필요 시 protected/default
↓
정말 필요한 경우만 public
 

즉:

최대한 숨기고 최소한만 공개

가 핵심.


28. 접근 제어자와 객체지향

좋은 객체지향 설계는:

  • 객체 내부 상태 보호
  • 책임 명확화
  • 외부 의존 최소화

를 지향합니다.

접근 제어자는 이를 구현하는 핵심 도구입니다.


29. 접근 제어자의 진짜 목적

접근 제어자의 핵심 목적은:

객체 보호
+
변경 영향 최소화
 

입니다.

즉:

  • 유지보수 쉬운 구조
  • 안전한 객체 설계
  • 안정적인 시스템

을 위한 기능.


30. 정리

Java 접근 제어자는 단순히:

접근 범위 제한 문법

이 아닙니다.

실제로는:

  • 캡슐화
  • 객체 보호
  • 정보 은닉
  • 유지보수성
  • 안정적인 아키텍처

를 위한 핵심 객체지향 기능입니다.

특히 실무에서는:

  • private 우선 설계
  • 최소 공개 원칙
  • setter 남용 방지
  • 객체 무결성 보호

를 이해하는 것이 매우 중요합니다.

다음 글에서는:

this / super 키워드

를 JVM 메모리와 객체 참조 관점까지 포함해서 정리해보겠습니다.

반응형

댓글