에스제이

반응형

 

Java의 접근 제어자(private, default, protected, public)는 클래스, 변수, 메서드, 생성자 등에 대한 접근 범위를 제어하며, 각각의 특징과 용도가 다르다.

 

1. private

 - 가장 제한적인 접근 제어자입니다.

 - 동일 클래스 내에서만 접근할 수 있으며, 외부 클래스나 상속받은 클래스에서도 접근할 수 없습니다.

 - 외부 클래스에서 접근할 필요가 없는 데이터를 보호하고, 캡슐화(Encapsulation)를 구현하는 데 주로 사용됩니다.

 - 외부로부터 데이터나 메서드를 숨겨야 할 때 사용됩니다.

 - 클래스 내부에서만 접근 가능하므로, 데이터 무결성을 유지하는 데 도움을 줍니다.

public class Example {
    private int secretValue = 42; // private 변수

    private void displaySecret() { // private 메서드
        System.out.println("Secret Value: " + secretValue);
    }

    public void showSecret() {
        // private 메서드는 클래스 내부에서만 호출 가능
        displaySecret();
    }
}

class Test {
    public static void main(String[] args) {
        Example ex = new Example();
        // ex.secretValue; // 에러: private 변수에 접근 불가
        // ex.displaySecret(); // 에러: private 메서드에 접근 불가
        ex.showSecret(); // 가능: public 메서드로 간접 접근
    }
}

 

2. protected

 - 같은 패키지 내에서는 default처럼 접근이 가능하며, 다른 패키지에 속한 하위 클래스에서도 접근이 가능합니다.

 - 상속을 통해 재사용할 가능성이 있는 메서드와 변수를 보호할 때 사용됩니다.

 - 다른 패키지에서 접근하려면 반드시 상속받은 클래스여야 합니다.

 - 패키지 외부의 일반 클래스에서는 접근이 불가능합니다.

 - 부모 클래스의 멤버를 하위 클래스에서 재정의(Override)하거나 활용할 때 사용됩니다.

package parent;

public class Parent {
    protected int protectedValue = 100; // protected 변수

    protected void displayValue() { // protected 메서드
        System.out.println("Protected Value: " + protectedValue);
    }
}

package child;

import parent.Parent;

public class Child extends Parent {
    public void useProtected() {
        // 하위 클래스에서는 부모 클래스의 protected 멤버에 접근 가능
        displayValue();
    }
}

class Test {
    public static void main(String[] args) {
        Child child = new Child();
        child.useProtected(); // 가능
        // child.protectedValue; // 에러: 직접 접근 불가능
    }
}

 

3. public

 - 가장 개방적인 접근 제어자입니다.

 - 어디서나 접근 가능하며, 패키지와 클래스의 경계를 넘어서 사용할 수 있습니다.

 - 주로 클래스나 메서드를 외부로 노출하여 다른 클래스와 상호작용할 수 있도록 설계할 때 사용됩니다.

 - 모든 클래스, 모든 패키지에서 자유롭게 접근 가능.

 - 일반적으로 API, 유틸리티 클래스, 공용 메서드, 생성자 등에 사용됩니다.

public class Example {
    public int publicValue = 50; // public 변수

    public void displayPublic() { // public 메서드
        System.out.println("Public Value: " + publicValue);
    }
}

class Test {
    public static void main(String[] args) {
        Example ex = new Example();
        ex.displayPublic(); // 어디서나 접근 가능
    }
}

 

4. default

 - 접근 제어자를 명시하지 않은 경우 적용되는 기본 접근 제어자입니다.

 - 같은 패키지 내에서만 접근할 수 있습니다.

 - 다른 패키지에서는 접근이 불가능합니다.

 - 같은 패키지에 속한 클래스 간의 협력을 위해 주로 사용됩니다.

 - 외부에서 노출할 필요는 없지만, 같은 패키지 내에서 공용으로 사용할 수 있을 때 적합합니다.

 - 별도의 키워드가 없으며, 단순히 접근 제어자를 생략하면 됩니다.

class Example { // default 클래스
    int defaultValue = 10; // default 변수

    void display() { // default 메서드
        System.out.println("Default Value: " + defaultValue);
    }
}

class Test {
    public static void main(String[] args) {
        Example ex = new Example();
        ex.display(); // 같은 패키지 내에서는 접근 가능
    }
}

// 다른 패키지의 클래스에서는 Example 및 그 멤버에 접근 불가

 

5. 정리

접근 제어자 접근 가능 범위 주요 용도
private 같은 클래스 내에서만 접근 가능 데이터 보호 및 캡슐화
default 같은 패키지 내에서 접근 가능 패키지 내 협력 클래스
protected 같은 패키지 또는 다른 패키지의 하위 클래스에서 접근 가능 상속 관계에서의 보호 및 재사용성 제공
public 모든 클래스에서 접근 가능 공용 API 및 외부 인터페이스

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band