2 분 소요

자바 접근 제어자(Access Modifier)는 클래스·필드·메서드·생성자의 접근 범위를 조절해 정보 은닉모듈화를 보장하는 핵심 장치입니다. 적절한 접근 제어는 코드의 안정성·가독성·재사용성을 크게 높여 줍니다.


접근 제어자의 4가지 종류

접근 제어자 접근 범위 대표 용도
public 모든 패키지·모든 클래스 외부에 공개할 API
protected 같은 패키지 + 상속받은 클래스 상속 전용 멤버 공유
(default) 같은 패키지 패키지 내부 전용 유틸
private 선언 클래스 내부 캡슐화·데이터 보호

1. private — 가장 강력한 정보 은닉

public class Account {
    private int balance;          // 외부 직접 접근 차단

    public int getBalance() {     // 간접 접근
        return balance;
    }
    public void deposit(int amt) {
        if (amt > 0) balance += amt;
    }
}
  • 장점 : 내부 구현 변경 시 외부 영향 최소화
  • Tip : 필드는 기본적으로 private, 외부 노출은 Getter/Setter만

2. (default) — 패키지 전용 접근

class PackageHelper {           // 키워드 없음 → default
    void log(String msg) { ... } // 같은 패키지에서만 호출
}
  • 활용 : 동일 패키지 모듈 간 헬퍼 클래스
  • 주의 : 다른 패키지에선 보이지 않아 협업 시 의도치 않은 제한 발생 가능

3. protected — 패키지 + 상속 관계

package animal;
public class Animal {
    protected String name;
}

package zoo;
import animal.Animal;
public class Tiger extends Animal {
    void roar() { System.out.println(name + " roars!"); } // OK
}
  • 사용 : 자식 클래스에게만 노출할 공통 로직
  • 주의 : 무분별한 protected 남용은 설계 결합을 높임

4. public — 공개 API

public class StringUtils {
    public static String capitalize(String s){ ... } // 어디서나 호출
}
  • 역할 : 라이브러리·도메인 모델의 외부 계약
  • Tip : 공개 범위가 넓을수록 변경 비용 ↑, 꼭 필요한 멤버만 public

접근 범위 한눈에 보기

  같은 클래스 같은 패키지 자식 클래스 외부 패키지
public
protected
default
private

접근 제어 설계 Best Practice

  1. 필드는 무조건 private + Getter/Setter
  2. 상속 고려 멤버만 protected
  3. 패키지 모듈 유틸은 default
  4. 외부 API 최소한만 public
  5. IDE 기능(Encapsulation, Generate Getter/Setter) 적극 활용

질문 정리

Q1. protected와 default 차이가 헷갈려요.

  • protected패키지 + 상속
  • default → 패키지 한정 (상속 무관)

Q2. private 필드가 많은데 성능에 문제 없나요?

접근 제어는 컴파일 단계 정보이므로 런타임 성능에 거의 영향 없습니다.

Q3. 패키지 이름만 달리해 같은 클래스명을 써도 괜찮을까요?

가능하지만 가독성·의존성이 떨어질 수 있어 의미 있는 패키지 구조가 중요합니다.

Q4. public 필드를 쓰면 안 되나요?

데이터 무결성·유연성 관점에서 권장되지 않습니다. 필드 변경 로직을 메서드로 캡슐화하세요.

Q5. 모듈 시스템(JPMS)에서도 접근 제어자가 동일하게 적용되나요?

네. 다만 module-info.java 로 공개/은닉 패키지를 추가로 제어할 수 있습니다.

카테고리:

업데이트:

댓글남기기