JAVA

접근제어자_default

고민말고생각하는사람 2024. 1. 17. 21:12

접근 제어자에는 public, protected, default, private 등이 있다고 들었다.

 

public 은 모든 접근을 허용한다는 것도 알겠고,

private가 인스턴스의 내부에서만 접근가능하게 한다는 것은 이제 알겠다.

그럼 default는 뭐고 protected는 뭘까?

 

우선 알게 모르게 사용되고 있던 default에 대해 알아보자.

package access.scope_check;

public class DefaultAccess {
    int a ;

    public DefaultAccess(int a) {
        this.a = a;
    }

    void showA() {
        System.out.println("a는 " + a);
    }
}

 

package access.scope_check;

public class DefaultAccessMain1 {
    public static void main(String[] args) {
        DefaultAccess defaultAccess = new DefaultAccess(10);
        defaultAccess.a = 50;
        defaultAccess.showA();	// a는 50
    }
}

위의 코드는 정상적으로 돌아간다.

DefaultAccess 의 인스턴스의 멤버변수 a에 직접적으로 접근 했으니

DefaultAccess 의 int a 는 public일까??

 

대답은 아니다! default 이다!

 

접근 제어자는 클래스, 멤버변수, 메서드 등이 사용 가능하다.

class DefaultAccess 에 선언된 int a에 명시된 접근제어자는 없다.

이런 경우, 접근 제어자는 자동적으로 default 가 된다.

 

int a; 이지만 사실상

default int a; 인 것이다.

 

default 접근제어자의 범위는 '같은 패키지' 에서의 접근 허용 이다.

따라서 같은 패키지에 있다면 아래와 같이 직접적인 접근 및 조작이 가능한 것이다.

defaultAccess.a = 50;

 

중간 복습.

1. 접근제어자는 클래스, 멤버변수, 메서드 등에 사용된다.

2. 접근제어자를 명시하지 않을 경우 접근제어자는 default 가 된다.

3. default 는 같은 패키지 패키지 내에서의 접근을 허용한다.

 

자, 1, 2의 내용은 학습하면서 어느 정도 눈에 익다. (아직 class 에 public 외엔 붙는 걸 본 적 없지만)

2,3 에 대한 검증을 해보자.

 

package access.scope_check;

public class DefaultAccess {
    int a ;

    public DefaultAccess(int a) {
        this.a = a;
    }

    void showA() {
        System.out.println("a는 " + a);
    }
}
package access.scope_check;

public class DefaultAccessMain1 {
    public static void main(String[] args) {
        DefaultAccess defaultAccess = new DefaultAccess(10);
        defaultAccess.a = 50;
        defaultAccess.showA();	// a는 50
    }
}

ㅇ위의 코드는 위에서도 봤듯, 외부에서 직접 접근 및 조작이 가능했다.

 

반면, 아래의 코드는 defaultAccess.a = 50; 부분에서 컴파일 에러가 발생한다.

package access.scope_check02;

import access.scope_check.DefaultAccess;

public class DefaultAccessMain2 {
    public static void main(String[] args) {
        DefaultAccess defaultAccess = new DefaultAccess(10);
//        defaultAccess.a = 50;
        defaultAccess.showA();
    }
}

멤버변수 a 의 접근 제어자를 public 으로 바꾸란다.

 

주목할 점은 패키지 명이다.

package access.scope_check;
public class DefaultAccess {}

 

package access.scope_check;
public class DefaultAccessMain1 {}

package access.scope_check02;
public class DefaultAccessMain2 {}

main1 은 class DefaultAccess 와 패키지가 동일하다. => .a = 50; 이 가능했다.

main2 는 class DefaultAccess 와 패키지가 다르다. => .a=50; ? 컴파일 에러.

 

중요한 것 같으니 한 번 더 읇어본다.

default 접근 제어자는 
'같은 패키지 내에서의 접근이라면 허용 해준다.'