Java

[Java] 접근 제어자

junga 2022. 9. 8. 23:31
  • 아래와 같은 접근제어자를 사용하여 변수나 메서드의 사용 권한을 설정할 수 있다.


  1. public
  2. protected
  3. default
  4. private

위 순서대로 접근이 점점 제한된다.



private


  • private이 붙은 변수, 메소드는 해당 클레스에서만 접근이 가능하다.
public class Main {
    public static void main(String[] args) {
        Access ac = new Access();
        System.out.println(ac.a); // 100
        System.out.println(ac.b); // 에러 발생, java: b has private access in Access

        ac.getB(); // 200
    }
}

class Access {
    int a = 100;
    private int b = 200;

    // 같은 클래스에서는 접근 가능
    public void getB() {
        System.out.println(b);
    }
}


default


  • 접근 제어자를 별도로 설정하지 않는다.
  • 같은 패키지에서만 접근 가능하다.

junga 라는 패키지안에 Main.java와 Test.java 파일이 있다.
Main에서 Test파일안에 있는 Access 클래스에 접근해보자.

// junga/Test.java

package junga;

class Access {
    // default 변수 선언
    int a = 100;
}

// junga/Main.java

package junga;
import junga.Access; 
// 임포트해야 사용 가능, 
// junga.*; 을 사용하면 junga(특정)패키지내에 모든 클래스를 사용할 수 있다.

public class Main {
    public static void main(String[] args) {
        Access ac = new Access();
        System.out.println(ac.a); // 100
        // 잘 출력되는걸 볼 수 있다.
        // Main클래스와 Access클래스가 같은 패키지가 아니었다면 에러가 발생하게 됨
    }
}


protected


  • 같은 패키지나 상속받을 경우 접근이 가능하다.

위 사진의 패키지 구조에서 protected를 사용해보자

// junga2/Access.java

package junga2;

public class Access {
    protected int a = 100;
}
// junga/Main.java

package junga;
import junga2.Access;

public class Main extends Access { // 상속
    public static void main(String[] args) {
        Main ac = new Main();
        System.out.println(ac.a); // 100
        // 상속받는 경우엔 다른패키지여도 접근이 가능하다.
    }
}


public


  • 패키지, 클래스 상관없이 접근이 가능하다.