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

동긔·2024년 9월 10일
1

JAVA

목록 보기
2/11

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. 접근 지정자 비교

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

접근 지정자동일 클래스동일 패키지다른 패키지의 자식 클래스그 외의 외부 클래스
publicOOOO
protectedOOOX
defaultOOXX
privateOXXX

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. 결론

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

profile
배우고 느낀점들을 기록합니다. 열정 넘치는 백엔드 개발자로 남고싶습니다.

0개의 댓글