Notice
Recent Posts
Recent Comments
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

9.2 인스턴스 멤버 클래스 본문

이것이 자바다/09 중첩 선언과 익명 객체

9.2 인스턴스 멤버 클래스

빌드이너프 2024. 4. 4. 12:45

인스턴스 멤버 클래스는 다음과 같이

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 실행