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. 접근 범위 표
| 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 메모리와 객체 참조 관점까지 포함해서 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java 오버라이딩(Overriding) vs 오버로딩(Overloading) 완벽 이해하기 (0) | 2026.05.22 |
|---|---|
| Java this / super 키워드 완벽 이해하기 (0) | 2026.05.22 |
| Java 추상 클래스(Abstract Class) vs 인터페이스(Interface) 완벽 이해하기 (0) | 2026.05.22 |
| Java 다형성(Polymorphism) 완벽 이해하기 (0) | 2026.05.22 |
| Java 상속(Inheritance) 완벽 이해하기 (0) | 2026.05.22 |
댓글