앞서서 우리는 바깥 클래스에서 중첩 클래스에 접근하는 경우에 대해서 주로 살펴보았습니다. 그렇다면 이번에는 "중첩 멤버 클래스 내부에서" 바깥 클래스의 필드에 접근하는 경우에 발생하는 접근 제한에 대해서도 한번 살펴보도록 하겠습니다.
멤버 클래스로 선언된 중첩 클래스의 경우, 인스턴스 멤버 클래스로 선언되었는지 정적 멤버 클래스로 선언되었는지 여부에 따라서 내부 클래스에서 바깥 클래스로 접근하는 경우에 대한 접근 가능 범위가 달라집니다. 잠깐 생각해 보면, 쉽게 차이를 알 수 있습니다. 바로 정적 멤버 클래스의 경우 접근할 수 있는 바깥 클래스의 멤버가 달라지게 되지요.
원리는 단순합니다. 정적 멤버 클래스는 바깥 클래스의 인스턴스 생성이 없더라도 사용이 가능하기 때문에 - 바깥 클래스의 인스턴스 필드 / 메서드에는 접근이 불가능합니다. 역시 바깥 클래스의 정적 멤버와 메서드에만 접근이 가능하게 됩니다.
아래의 예시를 보겠습니다.
public class A {
int field1;
void method1() {}
static int field2;
static void method2() {}
/* 인스턴스 멤버 클래스 */
class B {
void method() {
field1 = 10;
method1();
field2 = 10;
method2();
}
}
/* 정적 멤버 클래스 */
static class C {
void method() {
// field1= 10;
// method1();
field2 = 10;
method2();
}
}
}
정적 멤버 클래스인 C의 경우, 클래스 내부에서 정적 필드/메서드인 field2와 method2()에는 접근이 가능하지만, 인스턴스 필드/메서드인 field1과 method1()은 접근이 불가능한 것을 확인할 수 있습니다.
이제 로컬 클래스의 접근에 대해서도 살펴보아야 하는데요, 로컬 클래스의 경우 인스턴스 / 정적 멤버 클래스에 비해 다소 복잡한 내용이 있어서 따로 다음 아티클에서 살펴보도록 하겠습니다. 로컬 클래스에 대한 개념을 아래 아티클에서 다시 한번 복기한 다음 살펴보는 것을 추천드립니다.
로컬 클래스의 특성을 요약하면, 아래의 내용과 같습니다.
· 로컬 클래스는 접근 제한자(public, private) / static을 붙이지 않는다.
: 메서드 내에서만 사용되므로 접근 제한을 선언할 필요가 없음
· 정적 필드와 메서드는 선언할 수 없다.
void method() {
/* 로컬 클래스 */
class D {
D() { }
int field1;
void method1() { }
}
/ * 로컬 클래스의 사용 */
D d = new D();
d.field1 = 3;
d.method1();
}
'Programming > JAVA' 카테고리의 다른 글
중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 4 : 로컬 클래스 (0) | 2023.04.10 |
---|---|
중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 3 : 로컬 클래스 (0) | 2023.04.09 |
중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 1 (0) | 2023.04.04 |
중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 2 : 정적 멤버 / 로컬 클래스 (0) | 2023.04.03 |
중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 1 : 인스턴스 멤버 클래스 (0) | 2023.04.02 |