본문 바로가기
학습/JAVA

9. 중첩 클래스와 중첩 인터페이스

by Elfen Lied 2022. 10. 24.
반응형

- 중첩 클래스

  • 선언 위치에 따라 다음과 같이 분류된다.
  • 멤버 클래스
    • 인스턴스 멤버 클래스
    • 정적 멤버 클래스
  • 로컬 클래스

 

 

- 인스턴스 멤버 클래스

  • 인스턴스 필드와 인스턴스 메소드, 상수 필드만 선언 가능하다.
  • 정적필드와 정적 메소드를 선언할 수 없다.
public class AAA {
	// 가능 : 인스턴스 필드, 인스턴스 메소드, 상수
	// 불가능 : 정적 필드, 스태틱 블록, 정적 메소드
	// 멤버 클래스
	class BBB {
		public int bb1; // 인스턴스 필드
//		static int bb2 = 10; // 정적 필드(X)
		static final int BB3 = 10; // 상수
//		static {} // 스태틱 블록(X)
		
		public BBB() {
			System.out.println("중첩클래스 BBB의 생성자");
		}
		
		public void methodBB() { // 인스턴스 메소드
			System.out.println("중첩클래스 메소드");
		}
		
//		public static void methodCC() {} // 정적 메소드(X)
		
	}
}

===================================================================

메인클래스

import exam03.AAA.BBB; // 동일패키지더라도 반드시 임포트 해야 함

public class AAADemo {
	public static void main(String[] args) {
		// AAA의 내부 클래스 BBB의 객체를 생성하려면
		// 반드시 AAA 객체가 생성되어야 한다.
		AAA aaa =  new AAA();
		BBB b = aaa.new BBB();
		System.out.println(b.bb1);
		b.methodBB();
		
		System.out.println(BBB.BB3);
	}
}

 

 

- 정적 멤버 클래스

  • 모든 종류의 필드와 메서드를 선언할 수 있다.
public class AAA {
	
	static class CCC { // 정적 멤버 클래스
		int ccc;
		static int ccc2;
		static final int CONT_CC; // 상수

		static { // 스태틱 블록
			ccc2 = 12345;
			CONT_CC = 1000;
		}
		
		public CCC() { // 생성자
			System.out.println("정적 멤버 클래스 CCC 객체 생성");
		}
		
		// 인스턴스 메소드
		void methodA() {
			System.out.println("정적 멤버 클래스 CCC : 인스턴스 메소드");
		}
		
		// 정적 메소드
		static void methodAA() {
			System.out.println("정적 멤버 클래스 CCC : 정적 메소드");
		}
		
	}
}

==================================================================

메인 클래스
public class MainAAA {
	public static void main(String[] args) {
		System.out.println(AAA.CCC.ccc2);
		System.out.println(AAA.CCC.CONT_CC);
		
		AAA.CCC.methodAA(); // 정적 메소드호출
		AAA.CCC c = new AAA.CCC();
		c.methodA(); // 인스턴스 메소드 호출
		c.methodAA(); // 정적 메소드 호출
	}
}

 

- 로컬 클래스

public class AA {
	void methodA() {
		System.out.println("methodA 호출");
		class DD {
			int dd; // 인스턴스 필드
//			static int dd2; // 정적 필드 X
//			static {} // static 블록 X
			public DD() {
				System.out.println("로컬클래스 DD 객체생성");
			}
			void methodD() {
				System.out.println("로컬 클래스 인스턴스 메소드 : methodD");
			}
		}
		DD dd = new DD(); // 로컬 클래스 객체 생성 : 외부에서 생성 불가능
		System.out.println(dd.dd);
		dd.methodD();
	}
    
    ======================================================================
    
    메인 클래스
    public class AADemo {
	public static void main(String[] args) {
		AA a = new AA();
//		a.new DD(); 로컬 클래스: 외부에서 생성 불가

		a.methodA();
	}
}


값
methodA 호출
로컬클래스 DD 객체생성
0
로컬 클래스 인스턴스 메소드 : methodD

 

 

- 외부 필드에서 사용 제한

public class AA {
	public AA a = new AA();
	public static AA aa = new AA();
	
	BB b = new BB();
//	static BB bb = new BB(); // static 생성 불가
	
	CC c = new CC();
	static CC cc = new CC();
	
	class BB {
		public BB() {
			System.out.println("인스턴스 클래스: BB객체 생성");
		}
	}
	
	static class CC {
		public CC() {
			System.out.println("인스턴스 클래스: CC객체 생성");
		}
	}
	
	void methodA() {
		BB b = new BB(); // 인스턴스 클래스 생성
		CC c = new CC(); // 정적 클래스 생성
	}
	
	static void methodAA() {
//		BB bb = new BB(); // 인스턴스 멤버 클래스 생성 불가
		CC c = new CC(); // 정적클래스 객체생성
	}
}

 

 

 

- 멤버 클래스에서 사용 제한

public class AA { // AA 클래스 : 외부
	
	int aa = 10; // 외부 클래스의 인스턴스 필드
	static int bb = 10; // 외부 클래스의 정적 필드
	
	void methodA() {
		System.out.println("외부클래스의 인스턴스 메소드");
	}
	static void methodAA() {
		System.out.println("외부클래스의 정적 메소드");
	}
	
	class BB { // BB 클래스 : 내부 인스턴스 클래스
		void methodB() {
			System.out.println(aa); // 외부 인스턴스 필드로 접근 가능
			System.out.println(bb); // 외부 클래스의 정적 필드 접근 가능
			methodA(); // 외부 클래스의 인스턴스 메소드 접근가능
			methodAA(); // 외부 클래스의 정적 메소드 접근가능
		}
	}
	
	static class CC { // CC 클래스 : 내부 정적 클래스
		void methodC() {
//			System.out.println(aa); // 외부 인스턴스 필드로 접근 불가능(X)
			System.out.println(bb); // 외부 클래스의 정적 필드 접근 가능
//			methodA(); // 외부 클래스의 인스턴스 메소드 접근 불가능(X)
			methodAA(); // 외부 클래스의 정적 메소드 접근가능
		}
	}
}

====================================================================

메인 클래스
public class AAMain {
	public static void main(String[] args) {
		AA aa = new AA();
		BB bb = aa.new BB();
		bb.methodB();
	}
}

값
10
10
외부클래스의 인스턴스 메소드
외부클래스의 정적 메소드

 

반응형

댓글