Java 개념정리 14일차

2026. 1. 19. 16:58대우개발원 수업 내용/Java 정리

반응형

중첩 클래스 (nested class)
▪ 클래스 내부에 선언한 클래스
▪ 두 클래스의 멤버들을 서로 쉽게 접근하게 하고, 외부에는 불필요한 관계 클래스 감춤
▪ 코드 복잡성 줄임


 중첩 인터페이스 (nested interface)
▪ 인터페이스 역시 클래스 내부에 선언 가능
▪ 해당 클래스와 긴밀한 관계 갖는 구현 클래스 만들기 위함

 

중첩 클래스
▪ 클래스 내부에 선언한 클래스. 클래스의 멤버를 쉽게 사용할 수 있고 외부에는 중첩 관계 클래스를

   감춤으로써 코드의 복잡성을 줄일 수 있음
▪ 멤버 클래스: 클래스의 멤버로서 선언되는 중첩 클래스
▪ 로컬 클래스: 메소드 내부에서 선언되는 중첩 클래스

 

[중첩 클래스]

중첩 클래스를 컴파일하면 바이트 코드 파일(.class)이 별도로 생성
▪ 멤버 클래스 경우

  A $ B .class (A는 바깥 클래스 B는 맴버 클래스)
▪ 로컬 클래스 경우

  A $1 B .class (A는 바깥 클래스 B는 로컬 클래스)

 

인스턴스 멤버 클래스
▪ static 키워드 없이 중첩 선언된 클래스
▪ 인스턴스 필드와 메소드만 선언 가능하고 정적 필드와 메소드는 선언할 수 없음

 

인스턴스 멤버 클래스
▪ A 클래스의 멤버로 선언된 B 클래스
▪ 인스턴스 멤버 클래스 B는 주로 A 클래스 내부에서 사용되므로 private 접근 제한을 갖는 것이 일반적

예제 코드

실행 사진 및 출력결과

더보기
더보기
더보기

 

출력결과

A 객체가 생성됨
B 객체가 생성됨

 

실행코드

더보기
더보기
더보기
package sec01;


/** 바깥 클래스 **/
public class APlus {
	public APlus() {System.out.println("A 객체가 생성됨");}
	
	/** 인스턴스 멤버 클래스 **/
	public class B {
		public B() { System.out.println("B 객체가 생성됨");	}
		int field1;
		// static int field2;
		void method1() {}
		// static void method2() {}
	}
}
package sec01;

public class APlusEx {

	public static void main(String[] args) {
		APlus a = new APlus();
		// 인스턴스 멤버 클래스 객체 생성
		APlus.B b = a.new B();
		b.field1 = 3;
		b.method1();

	}

}

 


예제코드

실행 사진 및 출력결과

더보기
더보기
더보기

 

출력결과

B-생성자 실행
B-생성자 실행
B-생성자 실행
B-생성자 실행
1
B-metod1 실행
2
B-method2 실행

실행코드

더보기
더보기
더보기
package sec01;

/** 바깥 클래스 **/
public class A {
	// 인스턴스 멤버 클래스
	class B {
		// 인스턴스 필드
		int field1 =1;
		
		// 정적 필드
		static int field2= 2;
		
		// 생성자
		B() {
			System.out.println("B-생성자 실행");
		}
		
		// 인스턴스 메소드
		void method1() {
			System.out.println("B-metod1 실행");
		}	
		// 정적 메소드(Java 17부터 허용)
		static void method2() {
			System.out.println("B-method2 실행");
		} //Java 17부터 허용
	}
	
	
	// 인스턴스 필드 값으로 B 객체 대입
	B field = new B();
	
	// 생성자
	A() {
		B b = new B();
	}
	
	// 인스턴스 메서드
	void method() {
		B b = new B();
	}
	
	// 인스턴스 메서드
	void useB() {
		//B 객체 생성 및 인스턴스 필드 및 메서드 사용
		B b = new B();
		System.out.println(b.field1);
		b.method1();
		
		//B클래스의 정적 필드 및 메소드 사용
		System.out.println(B.field2);
		B.method2();
	}
}

 

package sec01;

public class AEx {

	public static void main(String[] args) {
		// A 객체 생성
		A a = new A();
		
		// B 객체 생성
		A.B b = a.new B();
		
		// A 인스턴스 메소드 호출
		a.useB();
	}

}

[정적 멤버 클래스]

정적 멤버 클래스
▪ static 키워드와 함께 A 클래스의 멤버로 선언된 B 클래스
▪ 정적 멤버 클래스는 주로 default 또는 public 접근 제한을 가진다.

 

[중첩 클래스]

정적 멤버 클래스
▪ static 키워드로 선언된 클래스
▪ 모든 종류의 필드와 메소드 선언 가능

 

예제코드

실행 사진 및 출력결과

더보기
더보기
더보기

 

출력결과

B-생성자 실행
1
B-method1 실행
2
B-method2 실행

실행코드

더보기
더보기
더보기
package AStatic;

public class AStatic {
	//인스턴스 멤버 클래스
	static class B {
		// 인스턴스 필드
		int field1 = 1;
		
		// 정적 필드
		static int field2= 2;
		
		// 생성자
		B() {
			System.out.println("B-생성자 실행");
		}
		
		// 인스턴스 메소드
		void method1() {
			System.out.println("B-method1 실행");
		}
		
		// 정적 메소드(Java17부터 허용)
		static void method2() {
			System.out.println("B-method2 실행");
		} // Java17부터 허용
		
	}
	
	// 인스턴스 필드 값으로 B객체 대입
	B field1 = new B();
	
	// 정적 필드 값으로 B 객체 대입
	static B field2 = new B();
	
	// 생성자
	AStatic() {
		B b = new B();
	}
	
	// 인스턴스 메소드
	void method1() {
		B b = new B();
	}
	
	// 정적 메소드
	static void method2() {
		B b = new B();
	}
}
package AStatic;

public class AStaticEx {

	public static void main(String[] args) {
		// B객체 생성
		AStatic.B b = new AStatic.B();
		System.out.println(b.field1);
		b.method1();
		
		// B 클래스의 정적 필드 및 메소드 사용
		System.out.println(AStatic.B.field2);
		AStatic.B.method2();
	}

}

 


[중첩 클래스]

▪ A 클래스 외부에서 정적 멤버 클래스 C 객체 생성할 경우 A 객체 생성 필요하지 않음

예제코드 2

실행 사진 및 출력결과

더보기
더보기
더보기

 

출력결과

B-생성자 실행
1
B-method1 실행
2
B-method2 실행

실행코드

더보기
더보기
더보기
package sec01;


/** 바깥 클래스 **/
public class APlus {
	public APlus() {System.out.println("A 객체가 생성됨");}
	
	/** 인스턴스 멤버 클래스 **/
	public class B {
		public B() { System.out.println("B 객체가 생성됨");	}
		int field1;
		 static int field2;
		void method1() {}
		static void method2() {}
	}
	/** 정적 멤버 클래스**/
	static class C {
		C() { System.out.println("C 객체가 생성됨"); }
		int field1;
		static int field2;
		void method1() {}
		static void method2() {}
	}
}

 

package sec01;

public class APlusEx {

	public static void main(String[] args) {
		APlus a = new APlus();
		// 인스턴스 멤버 클래스 객체 생성
		APlus.B b = a.new B();
		b.field1 = 3;
		b.method1();
		
		// 정적 맴버 클래스 객체 생성
		APlus.C c = new APlus.C();
		c.field1 = 3;
		c.method1();
		APlus.C.field2 = 3;
		APlus.C.method2();

	}

}

 

'대우개발원 수업 내용 > Java 정리' 카테고리의 다른 글

Java 개념정리 16일차  (0) 2026.01.21
Java 개념정리 15일차  (0) 2026.01.20
Java 개념 정리 13일차  (1) 2026.01.15
Java 개념정리 12일차  (2) 2026.01.15
Java 개념정리 11일차  (1) 2026.01.13