본문 바로가기

Programming/JAVA

중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 1

java logo image

 

 

중첩 클래스의 종류를 다시 한번 상기해 보도록 하겠습니다. 잘 기억이 나지 않는다면, 이전에 설명했던 내용을 다시 한번 살펴보도록 하세요. [멤버 클래스]와 [로컬 클래스]로 대분류가 있고, 멤버 클래스는 [인스턴스 멤버 클래스]와 [정적 멤버 클래스]로 구분된다고 했습니다. 참고로 멤버 클래스는 '메서드 내부에 선언되는' 로컬 클래스와 구분되죠? 

 

 

 

중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 1 : 인스턴스 멤버 클래스

중첩 클래스는 '클래스 내부에' 선언되는 클래스입니다. 이때, 이 중첩 클래스는 내부에 선언되는 위치에 따라서 종류가 분류됩니다. 종류는 크게 다음 두 가지가 있습니다. · 멤버 클래스 · 로

nozeroslope.tistory.com

 

 

일단 멤버 클래스(인스턴스/정적 멤버 클래스)들의 객체 생성을 중심으로 살펴보겠습니다. 예를 들어 클래스 A 내부에 중첩 클래스로서 인스턴스 멤버 클래스인 B와 정적 멤버 클래스인 C가 있다고 가정해 보겠습니다. 그리고 클래스 A 내부에서 이 멤버 클래스들의 객체를 생성해서 사용하는 상황이라고 보면, 사용에 어떤 제한이 있을까요?

 

 

· 인스턴스 멤버 클래스 B

- 바깥 클래스 A의 인스턴스 필드에서 초기 값으로 객체 생성 가능
- 바깥 클래스 A의 인스턴스 메서드에서 객체 생성 가능
- 바깥 클래스 A의 정적(static) 필드나 정적 메서드에서 객체 생성 불가
※ 클래스 A의 인스턴스 멤버 클래스로서(즉 static 없이) 선언된 경우에는, 반드시 클래스 A의 인스턴스 생성 후 사용 가능하므로

 

· 정적 멤버 클래스 C

- 바깥 클래스 A의 인스턴스 필드에서 초기 값으로 객체 생성 가능
- 바깥 클래스 A의 인스턴스 메서드에서 객체 생성 가능
- 바깥 클래스 A의 정적(static) 필드나 정적 메서드에서 객체 생성 가능
※ 클래스 A의 정적 멤버 클래스(static)으로 선언된 경우에는, 반드시 클래스 A에서 자유롭게 선언 가능함

 

 

바깥 클래스인 A 안에서 선언된 멤버 클래스 B, C에 대한 내용을 살펴보도록 하겠습니다. 

 

public class A {
	/* 인스턴스 멤버 클래스 */
	class B {}
	/* 정적 멤버 클래스 */
	static class C {}
	
	
	/* 클래스 A의 인스턴스 필드 */
	B field1 = new B();
	C field2 = new C();
	
	/* 클래스 A의 인스턴스 메서드 */
	void method1() {
		B var1 = new B();
		C var2 = new C();
	}
	
	/* 클래스 A의 정적 필드 초기화 */
	// static B field3 = new B(); 사용 불가
	static C field4 = new C();
	
	/* 클래스 A의 정적 메서드 */
	static void method2() {
		// B var1 = new B(); 사용 불가
		C var2 = new C();
	}
}