[Java] 접근 제한자

박세진·2024년 4월 4일
0

Java

목록 보기
1/2
post-thumbnail

접근 제한자 (access modifier)

  • 클래스, 변수, 메서드 등의 멤버에 대한 접근 권한을 제어험
  • public, protected, default (package-private), private
  1. public: 어떤 클래스에서든 접근 가능
  2. protected: 동일 패키지 내에서는 접근 가능, 서브클래스에서도 접근이 가능
  3. default (package-private): 아무런 접근 제한자를 명시하지 않을 경우 기본적으로 적용되는 것으로, 동일한 패키지 내에서만 접근 가능
  4. private: 해당 멤버에 대한 접근을 선언한 클래스 내에서만 접근 가능
  • 이 접근 제한자들은 객체 지향 프로그래밍에서 캡슐화, 정보 은닉 등의 개념을 구현하는 데 사용됨

🐸 public (공개)

해당 멤버(변수, 메서드 등)는 모든 클래스에서 접근 가능
다른 패키지의 클래스에서도 접근 가능
주로 외부에서 해당 클래스의 인스턴스를 생성하거나 메서드를 호출할 때 사용됨

✔ 예제1

public class MyClass {
    public void publicMethod() {
        System.out.println("This is a public method");
    }
}
public class Main {
    public static void main(String[] args) {
        MyClass obj = new MyClass();  // MyClass의 객체 생성
        obj.publicMethod();          // publicMethod 호출
        // 출력: This is a public method
    }
}

public class MyClass는 다른 클래스에서 MyClass에 대한 객체를 생성하고 해당 클래스의 메서드를 호출할 수 있다.

🐸 protected (보호)

동일한 패키지 내의 클래스 또는 해당 클래스를 상속받은 하위 클래스에서만 접근 가능
외부 패키지에서는 접근할 수 없지만, 상속 관계에 있는 클래스에서는 접근이 가능
주로 상속 관계에서 부모 클래스의 멤버를 자식 클래스에서 사용할 때 사용됨

✔ 예제1

ProtectedExample.java
package example;
public class ProtectedExample {
    protected int protectedVar; // 보호 변수
    protected void setProtectedVar(int value) { // protectedVar의 값을 설정하는 메서드
        protectedVar = value;
    }
}
OtherClass.java
package otherpackage;
import example.ProtectedExample;
public class OtherClass {
    public static void main(String[] args) {
        ProtectedExample obj = new ProtectedExample();
        // 다른 패키지에 속한 클래스에서는 protectedVar에 직접 접근할 수 없음
        // obj.protectedVar = 10; //에러 발생   
        // 하지만 protectedVar를 설정하는 메서드를 사용하여 값을 설정할 수 있음
        obj.setProtectedVar(10);
    }
}

protected int protectedVar는 같은 패키지 내의 클래스나 해당 클래스를 상속받은 하위 클래스에서는 접근 가능하지만, 외부 패키지에서는 접근할 수 없다.

🐸 default (아무것도 명시하지 않음)

동일한 패키지 내에서만 접근 가능
접근 제한자를 명시하지 않으면 기본적으로 적용됨
패키지 내의 다른 클래스들은 이 멤버에 접근 가능

✔ 예제1

package example;
class DefaultExample {
    int defaultVar;        / 아무것도 명시하지 않은 경우의 변수 (패키지 내에서 접근 가능)
    DefaultExample() {    // 생성자
        defaultVar = 3;
    }
    // 아무것도 명시하지 않은 경우의 메서드 (패키지 내에서 접근 가능)
    void defaultMethod() {
        System.out.println("This is a default method");
    }
}

int defaultVar는 같은 패키지 내의 다른 클래스에서는 접근할 수 있지만, 외부 패키지에서는 접근할 수 없다.

✔ 예제2

AnotherClass.java
package example;
public class AnotherClass {
    public static void main(String[] args) {
        DefaultExample obj = new DefaultExample();
        // 같은 패키지 내의 클래스에서는 defaultVar에 접근 가능
        System.out.println("Default variable: " + obj.defaultVar);
        obj.defaultMethod(); // 출력: This is a default method
    }
}
OtherClass.java
package otherpackage;
import example.DefaultExample;
public class OtherClass {
    public static void main(String[] args) {
        DefaultExample obj = new DefaultExample();
        // 다른 패키지에 속한 클래스에서는 defaultVar에 접근할 수 없음
        // System.out.println("Default variable: " + obj.defaultVar); // 에러 발생
        // obj.defaultMethod(); // 에러 발생
    }
}

같은 패키지 내에 있는 클래스인 AnotherClass에서는 defaultVar에 접근할 수 있지만, 다른 패키지에 있는 클래스인 OtherClass에서는 접근할 수 없다.

🐸 private (비공개)

해당 클래스 내에서만 접근 가능
외부 클래스나 상속 관계에 있는 클래스에서도 접근 불가
주로 해당 클래스의 내부 동작을 구현하는 데 사용됨

✔ 예제1

package example;
public class PrivateExample {
    private int privateVar; // 비공개 변수
    private PrivateExample() {     // 생성자
        privateVar = 4;
    }
    private void privateMethod() {     // 비공개 메서드
        System.out.println("This is a private method");
    }
    // 비공개 변수에 접근하여 값을 출력하는 메서드
    public void printPrivateVar() {
        // 같은 클래스 내의 다른 메서드이므로 privateVar에 접근 가능
        System.out.println("Private variable: " + privateVar);
    }
    // 외부에서 비공개 메서드 호출을 위한 공개 메서드
    public void callPrivateMethod() {
        // 같은 클래스 내의 다른 메서드인 privateMethod() 호출
        privateMethod();
    }
    public static void main(String[] args) {
        // PrivateExample 클래스의 객체 생성
        PrivateExample obj = new PrivateExample();
        // 비공개 변수에 접근하여 값을 출력하는 메서드 호출
        obj.printPrivateVar(); // 출력: Private variable: 4 
        // 비공개 메서드 호출
        obj.callPrivateMethod(); // 출력: This is a private method
    }
}

private int privateVar는 해당 클래스 내부의 다른 메서드들에서만 접근 가능

0개의 댓글