[JAVA] 접근 지정자 (Access Modifiers) 정리

2025. 1. 6. 22:58·BackEnd/JAVA

1. 접근 지정자란?

자바에서 접근 지정자(access modifier)는 클래스, 메서드, 변수 등에 대한 접근 범위를 설정하는 키워드입니다. 접근 지정자는 클래스 외부에서 해당 멤버에 대해 어디까지 접근할 수 있는지를 제어합니다. 접근 범위를 설정함으로써 캡슐화(encapsulation)를 강화하고, 코드의 보안성과 유지보수성을 높일 수 있습니다.

접근 지정자는 총 네 가지가 있으며, 각각은 해당 멤버에 대해 접근할 수 있는 범위(동일 패키지, 자식 클래스, 외부 클래스 등)를 제한하거나 허용하는 역할을 합니다. 클래스 설계 시 접근 지정자를 적절히 사용함으로써 데이터 보호, 코드의 모듈화, API의 안정성 등을 보장할 수 있습니다.

2. 접근 지정자의 종류

2.1 public 접근 지정자

  • 정의: public으로 선언된 클래스, 메서드, 변수는 모든 곳에서 접근 가능합니다. 즉, 동일 패키지와 다른 패키지에서 모두 접근할 수 있습니다.
  • 사용 시기: 클래스나 메서드가 외부에서 자유롭게 사용되기를 원할 때, 특히 API나 라이브러리의 공개된 기능을 제공하는 경우에 사용합니다.
// 모든 패키지 내에서 해당 클래스 접근 가능 (ex. 객체 생성)
// 다른 패키지에서도 import 후 자유롭게 객체를 생성할 수 있음
public class PublicClass {
    // 모든 패키지에서 해당 필드에 접근 가능
    public String name;

    // 모든 패키지 내에서 해당 메서드 자유롭게 사용 가능
    // 다른 패키지에서 해당 객체를 import하고 객체를 생성하고 나서 메서드를 호출
    // ex) PublicClass publicClass = new PublicClass();
    // publicClass.display(); 이렇게 사용 가능

    public void display() {
        System.out.println("Public method");
    }
}

2.2. protected 접근 지정자

  • 정의: protected로 선언된 멤버는 동일한 패키지 내에서 자유롭게 접근할 수 있으며, 다른 패키지에 있더라도 해당 클래스를 상속받은 하위 클래스에서는 접근 가능합니다.
  • 사용 시기: 상속을 통해 하위 클래스에서만 접근 가능하도록 허용하면서, 패키지 외부의 직접적인 접근을 제한하고 싶을 때 사용합니다.
// ParentClass는 public으로 선언되어 있기 때문에 모든 패키지에서 접근 가능
public class ParentClass {
    // protected 필드: 동일 패키지 내에서는 접근 가능하고,
    // 다른 패키지에서는 상속받은 자식 클래스에서만 접근 가능
    protected String name;

    // protected 메서드: 동일 패키지 및 다른 패키지의 자식 클래스에서만 접근 가능
    protected void display() {
        System.out.println("Protected method");
    }
}
// childClass는 ParentClass를 상속받음
public class ChildClass extends ParentClass {
    // 자식 클래스에서는 부모 클래스의 protected 필드에 접근 가능
    public void showName() {
        System.out.println(name);  // 상속받은 클래스에서 접근 가능
    }

    // 자식 클래스는 부모 클래스의 protected 메서드도 호출 가능
    public void showDisplay() {
        display();  // 부모 클래스의 protected 메서드에 접근 가능
    }
}

2.3 default 접근 지정자 (package-private)

  • 정의: 접근 지정자를 명시하지 않을 때 자동으로 적용되는 접근 수준입니다. 동일한 패키지 내에서만 접근이 가능하며, 다른 패키지에서는 접근할 수 없습니다.
  • 사용 시기: 패키지 내부에서만 접근을 허용하고, 패키지 외부로 노출되지 않도록 하고 싶을 때 사용합니다.
// default 접근 지정자 (접근 지정자를 명시하지 않음)
// 해당 클래스는 동일 패키지 내에서만 접근 가능하고, 다른 패키지에서는 접근 불가
class DefaultClass {
    // 필드도 default 접근 지정자
    // 동일 패키지 내에서만 접근 가능, 다른 패키지에서는 접근 불가
    String name;

    // 메서드도 default 접근 지정자
    // 동일 패키지 내에서만 접근 가능, 다른 패키지에서는 접근 불가
    void display() {
        System.out.println("Default method");
    }
}

2.4 private 접근 지정자

  • 정의: private로 선언된 멤버는 동일한 클래스 내에서만 접근이 가능하며, 다른 클래스에서는 접근할 수 없습니다. 상속받은 하위 클래스에서도 접근이 불가능합니다.
  • 사용 시기: 클래스 내부 구현을 숨기고, 외부에서 직접 접근할 수 없도록 보호하고자 할 때 사용합니다. 특히 데이터 무결성을 보장하고, 캡슐화를 통해 내부 데이터를 보호할 때 사용합니다.
public class PrivateClass {
    // private 필드: 해당 클래스 내에서만 접근 가능
    // 외부 클래스나 상속받은 클래스에서도 접근 불가
    private String name;

    // private 메서드: 해당 클래스 내에서만 호출 가능
    // 외부에서 이 메서드를 직접 호출할 수 없음
    private void display() {
        System.out.println("Private method");
    }

    // public 메서드: 외부에서 접근 가능
    // private 필드에 대한 간접 접근을 허용하는 getter 메서드
    public String getName() {
        return name; // private 필드인 name을 반환
    }

    // public 메서드: 외부에서 접근 가능
    // private 필드에 값을 설정하는 setter 메서드
    public void setName(String name) {
        this.name = name; // private 필드인 name에 값을 설정
    }
}

3. 접근 지정자 비교

자바의 접근 지정자들은 각기 다른 접근 범위를 제공합니다. 다음 표는 접근 가능 여부를 비교한 것입니다.

접근 지정자 동일 클래스 동일 패키지 다른 패키지의 자식 클래스 그 외의 외부 클래스
public O O O O
protected O O O X
default O O X X
private O X X X

3.1 요약

  • public: 모든 곳에서 접근 가능합니다. 클래스, 메서드, 변수 모두에 사용할 수 있습니다.
  • protected: 동일 패키지와 다른 패키지의 하위 클래스에서 접근 가능합니다. 메서드와 변수에만 사용할 수 있으며, 클래스에는 사용이 불가능합니다.
  • default: 동일 패키지에서만 접근 가능합니다. 클래스, 메서드, 변수에 사용할 수 있습니다. 이 지정자는 명시적으로 사용하지 않으며, 접근 지정자가 생략된 경우 적용됩니다.
  • private: 동일 클래스 내에서만 접근 가능합니다. 메서드와 변수에만 사용할 수 있으며, 클래스에는 사용이 불가능합니다. (단, 내부 클래스에는 private을 사용할 수 있습니다.) ->

4. 접근 지정자 활용 예시

4.1 클래스 설계에서의 활용

접근 지정자를 적절히 사용하여, 캡슐화와 보호를 구현하는 방법을 예시로 보여드리겠습니다.

public class Account {
    private String accountNumber; // 계좌번호 (해당 클래스 내에서만 접근 가능)
    private double balance; // 잔액 (해당 클래스 내에서만 접근 가능)

    // 생성자: 객체 생성 시 계좌번호와 초기 잔액을 설정
    public Account(String accountNumber, double balance) {
        this.accountNumber = accountNumber;
        this.balance = balance;
    }

    // private 메서드: 외부에서 계좌번호를 가져올 수 있는 getter 메서드
    public String getAccountNumber() {
        return accountNumber; // private 필드인 accountNumber 반환
    }

    // public 메서드: 외부에서 잔액을 가져올 수 있는 getter 메서드
    public double getBalance() {
        return balance; // private 필드인 balance 반환
    }

    // public 메서드: 외부에서 입금할 때 사용
    // 입금할 금액이 0보다 크면 잔액에 추가
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount; // 잔액(balance)에 입금 금액 추가
        }
    }

    // public 메서드: 외부에서 출금할 때 사용
    // 출금할 금액이 0보다 크고, 잔액이 충분한 경우에만 잔액에서 차감
    public void withdraw(double amount) {
        if (amount > 0 && balance >= amount) {
            balance -= amount; // 잔액(balance)에서 출금 금액 차감
        }
    }
}

4.2 예시를 통해 확인한 접근 지정자의 선택

  • private 필드: 계좌 번호와 잔액은 외부에서 직접 변경할 수 없도록 보호하고, 데이터의 무결성을 유지합니다.
  • public 메서드: 외부에서 접근 가능한 메서드를 통해 계좌 정보를 가져오거나 입출금 작업을 구행할 수 있습니다.
    이러한 설계를 통해 캡슐화가 이루어지며, 내부 데이터를 보호하면서 외부에서는 필요한 기능만 사용하도록 제한할 수 있습니다.

5. 결론

자바에서 접근 지정자는 클래스 설계에서 매우 중요한 역할을 하며, 캡슐화와 데이터 보호를 구현하는 데 필수적인 요소입니다. 각 접근 지정자는 클래스, 메서드, 변수의 접근 범위를 제어하며, 개발자는 이를 통해 코드의 가독성, 안정성, 유지보수성을 높일 수 있습니다.

'BackEnd > JAVA' 카테고리의 다른 글

[JAVA] try-with-resources 정리  (2) 2025.01.19
[JAVA] 자바 부모클래스 및 인터페이스 심화: 오버라이딩과 메서드 동작  (1) 2025.01.17
[JAVA] 인터페이스 정리  (0) 2025.01.12
[JAVA] 추상 클래스 (Abstract Class) 정리  (0) 2025.01.09
[JAVA] 자바에서 main 메서드가 static인 이유  (0) 2025.01.06
'BackEnd/JAVA' 카테고리의 다른 글
  • [JAVA] 자바 부모클래스 및 인터페이스 심화: 오버라이딩과 메서드 동작
  • [JAVA] 인터페이스 정리
  • [JAVA] 추상 클래스 (Abstract Class) 정리
  • [JAVA] 자바에서 main 메서드가 static인 이유
개발자 동긔
개발자 동긔
배우고 느낀점들을 기록합니다. 열정 넘치는 백엔드 개발자로 남고싶습니다.
  • 개발자 동긔
    Donker Dev
    개발자 동긔
  • 전체
    오늘
    어제
    • Category (39)
      • BackEnd (23)
        • JAVA (15)
        • Spring & JPA (7)
      • Database (4)
      • Computer Science (2)
        • Network (0)
        • Security (0)
        • Web (1)
      • DevOps (6)
        • Docker (1)
        • Jenkins (0)
        • Monitoring (2)
        • CICD (1)
      • 트러블 슈팅 (3)
      • 성능 개선 (1)
      • Project (0)
  • 인기 글

  • 태그

    @RequestBody
    Jenkins
    java
    interface
    master/slave db 이중화 처리
    restful api
    SSH
    CICD
    spring cloud msa
    restful api 설계
    nginx
    docker compose
    mysql master/slave replication
    인터페이스
    JPA
    spring boot
    와일드카드
    docker
    Database
    Spring
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
개발자 동긔
[JAVA] 접근 지정자 (Access Modifiers) 정리
상단으로

티스토리툴바