2024. 1. 17. 21:12ㆍJAVA
접근 제어자에는 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 접근 제어자는
'같은 패키지 내에서의 접근이라면 허용 해준다.'
'JAVA' 카테고리의 다른 글
| 자료구조_스택&큐 (0) | 2024.01.22 |
|---|---|
| 메모리 구조_잡탕 (0) | 2024.01.22 |
| 접근제어자_private (0) | 2024.01.17 |
| 접근제어자 (0) | 2024.01.17 |
| 생성자_this() (0) | 2024.01.15 |