카테고리 없음

중첩 클래스

나주나주 2024. 1. 3. 16:55

nested class

: 내부에 선언된 클래스, 관계 클래스

 

클래스가 여러 클래스와 관계를 맺을 경우: 독립적으로 선언하는 것이 좋다.

BUT 특정 클래스와 관계를 맺을 경우: 관계 클래스로 선언하는 것이 좋다

 

장점

1. 두 클래스의 멤버들은 서로 쉽게 접근할 수 있다. 

2. 복잡성을 줄일 수 있다. (외부에 불필요한 관계 클래스를 감춤)

 

package ch09.nested_class;

public class A { // new 연산자를 사용해야 하는 인스턴스(객체)
	// 필드
	class B { // new 연산자를 사용해야 하는 인스턴스(객체)
		// 필드
		int field1;
		static int field2; // 17버전 이후 부터 가능
		// 생성자

		B() {
		}

		// 메서드
		void method1() {
			System.out.println("B클래스 인스턴스 메서드 실행");
		}

		static void method2() {
			System.out.println("B클래스 정적 메서드 실행");
		}
	} // 중첩 클래스(관계 클래스, 내부 클래스)

	static class C { // new 연산자가 필요 없는 클래스
		int field1;
		static int field2;
		C() {} //생성자
		void method1() { //추상 클래스
			System.out.println("정적 C클래스 인스턴스 메서드 실행");
		}; 
		static void method2() {
			System.out.println("정적 C클래스 정적 메서드 실행");
		}
	}
	// 생성자
	// 메서드
	void method() { //외부 A클래스의 메서드
		class D { //메서드 내부에 있는 클래스기 때문에 내부에서만 호출 가능!
			D() {}
			int field1;
			static int field2;
			
			void method1() {
				System.out.println("A클래스 > 메서드 > D클래스 > 메서드1 인스턴스 실행");
			}
			
			static void method2() {
				System.out.println("A클래스 > 메서드 > D클래스 > 정적 메서드2 실행");
			}
		} //A클래스 > 메서드 > D클래스
		D d = new D();
		d.field1 = 50;
		d.method1();
		d.method2();
		D.method2();
	}
}
package ch09.nested_class;

import ch09.nested_class.A.B;
import ch09.nested_class.A.C;

public class AExam {
	public static void main(String[] args) {
		A.B.field2 = 50; //17부터 정적 필드 사용 가능
		A.B.method2();
		
		//방법1
		A.B b = new A().new B(); //A의 객체를 만든 뒤 (A 안의)B의 객체 생성 가능
		
		//방법2
		A a = new A();
		A.B b2 = a.new B();
		
		b.field1 = 50;
		b.method1();

		A.C c = new A.C();
		c.field1 = 50;
		c.method1();
		A.C.method2();
	}
}