충분히 쌓여가는
9.2 인스턴스 멤버 클래스 본문
인스턴스 멤버 클래스는 다음과 같이
A 클래스의 멤버로 선언된 B 클래스를 말한다
pulbic class A {
public|private class B {
}
}
인스턴스 멤버 클래스 B는 주로 A 클래스 내부에서 사용되므로
private 접근 제한을 갖는 것이 일반적
B 객체는 A 클래스 내부 어디에서나 생성할 수 없고,
인스턴스 필드값, 생성자, 인스턴스 메소드에서 생성할 수 있다
A 객체가 있어야 B 객체도 생성할 수 있기 때문
package ch09.sec02.exam01;
public class A {
//인스턴스 멤버 클래스
class B {}
//인스턴스 필드 값으로 B 객체 대입
B field = new B();
//생성자
A() {
B b = new B();
}
//인스턴스 메소드
void method() {
B b = new B();
}
}
B 객체를 A 클래스 외부에 생성하려면 default 또는 public 접근 제한을 가져야 하고,
A객체를 먼저 생성한 다음 B 객체를 생성해야 한다
A a = new A();
A.B b = a.new B();
package ch09.sec02.exam01;
public class AExample {
public static void main(String[] args) {
//A 객체 생성
A a = new A();
//B 객체 생성
A.B b = a.new B();
}
}
인스턴스 멤버 클래스 B 내부에는 일반 클래스와 같이 필드, 생성자, 메소드 선언이 올 수 있다
정적 필드와 정적 메소드는 Java 17부터 선언 가능
package ch09.sec02.exam02;
public class A {
//인스턴스 멤버 클래스
class B {
//인스턴스 필드
int field = 1;
//정적 필드(Java 17부터 허용)
static int field2 = 2;
//생성자
B() {
System.out.println("B 생성자 실행");
}
//인스턴스 메소드
void method1() {
System.out.println("B method1 실행");
}
//정적 메소드(Java 17부터 허용)
static void method2() {
System.out.println("B method2 실행");
}
}
//인스턴스 메소드
void useB() {
//B 객체 생성 및 인스턴스 필드 및 메소드 사용
B b = new B();
System.out.println(b.field);
b.method1();
//B 클래스의 정적 필드 및 메소드 사용
System.out.println(B.field2);
B.method2();
}
}
package ch09.sec02.exam02;
public class AExample {
public static void main(String[] args) {
A a = new A();
a.useB();
}
}
B 생성자 실행
1
B method1 실행
2
B method2 실행
'이것이 자바다 > 09 중첩 선언과 익명 객체' 카테고리의 다른 글
9.5 바깥 멤버 접근 - this (0) | 2024.04.04 |
---|---|
9.5 바깥 멤버 접근 (0) | 2024.04.04 |
9.4 로컬 클래스 - 로컬 변수의 final (0) | 2024.04.04 |
9.1 중첩 클래스 (0) | 2024.04.04 |
이것이 자바다 9장 확인 문제 (0) | 2024.02.05 |