바깥 클래스의 멤버 접근 제한
- 정적 멤버 클래스 내부에서는 바깥 클래스의 필드와 메소드를 사용할 때 제한이 따름
출처, 이것이 자바다
- 정적 멤버 클래스는 바깥 객체가 없어도 사용 가능해야 하므로 바깥 클래스의 인스턴스 필드와 인스턴스 메소드는 사용하지 못함
package ch09.sec05.exam01;
public class A {
//new 연산가가 힙영역에 메모리 생성시 사용.
int field1;
void method1() {}
//JVM이 A클래스가 사용시, 먼저 단 1번만 메소드영역에 메모리 생성
static int field2;
static void method2() {}
//인스턴스 멤버 클래스 A a = new A(); A.B b = a.new B(); b.method();
class B {
void method() {
field1 = 10;
method1();
field2 = 10;
method2();
}
}
//정적 멤버 클래스 A클래스 객체 생성 없음. A.C c = new A.C(); c.method();
static class C {
void method() {
//C클래스 입장에서 A클래스 객체 생성 하지않고, 독립적으로 생성되었기 때문
// field1 = 10;
// method1();
field2 = 10;
method2();
}
}
}
바깥 클래스의 객체 접근
- 중첩 클래스 내부에서 바깥 클래스의 객체를 얻으려면 바깥 클래스 이름에 this를 붙임
출처, 이것이 자바다
package ch09.sec05.exam02;
/*
* 인스턴스 클래스에서 바깥 클래스 멤버 호출시 클래스명.this.멤버 호출
*/
public class A {
String field = "A-field";
void method() {
System.out.println("A-method");
}
//A a = new A(); A.B b = a.new B(); b.print();
class B {
String field = "B-field";
void method() {
System.out.println("B-method");
}
void print() {
//B객체의 필드와 메소드 사용
System.out.println(this.field);
this.method();
//A객체의 필드와 메소드 사용
System.out.println(A.this.field);
A.this.method();
}
}
//A클래스의 메소드
void useB() {
B b = new B();
b.print();
}
}
package ch09.sec05.exam02;
public class AExample {
public static void main(String[] args) {
//A 객체 생성
A a = new A();
// A.B b = a.new B();
//A 메소드 호출
a.useB();
}
}
'객체 지향 프로그래밍 - 중첩 선언과 익명 객체' 카테고리의 다른 글
익명 객체 (0) | 2023.01.25 |
---|---|
로컬 클래스 (0) | 2023.01.25 |
정적 멤버 클래스 (0) | 2023.01.25 |
중첩, 인스턴스 멤버 클래스 (0) | 2023.01.25 |