1.중첩 클래스


중첩 클래스란 클래스 안의 클래스라고 보면 된다.


중첩 클래스는 바깥의 클래스에 접근하기 용이하고 다른 사람이 읽기에도 좀 더 편리하며


유지 보수에도 효율적이다.


인스턴스, 정적, 로컬 멤버가 있으며 다음 예제를 통해 확인해보자.

package chap07.exam01.overClass;

public class Exclass {
	public Exclass() {
		System.out.println("외부 클래스 생성");
	}
	
	// 1. 인스턴스 멤버 - 객체화 해야 사용 할 수 있는 클래스 (클래스 영역에 생성)
	
	public class InsClass {
		public InsClass() {
			System.out.println("인스턴스 멤버 생성");
		}
		int field = 0;
		void method() {
			System.out.println(field + "을 출력하는 메서드");
		}
	}
	
	// 2. 정적 멤버 - 객체화를 하면 사용 할 수 없는 클래스

	public static class StaticClass{
		public StaticClass() {
			System.out.println("인스턴스 멤버 생성");
		}
		int field = 0;
		void method() {
			System.out.println(field + "을 출력하는 메서드");
		}
		
		static int sfield = 0;
		static void smethod() {
			System.out.println(sfield + "을 출력하는 메서드");
		}
	}
	
	// 3. 로컬멤버 - 메서드가 실행되어야 사용할 수 있는 클래스
	
	void localMethod() {
		// 메서드 안에서만 사용 할 수 있는 클래스
		// 메서드 안에서 선언 생성 전부 해야한다.
		class Local{
			Local(){
			System.out.println("Local 객체 생성");
			}
			int field = 0;
			void method() {
				System.out.println(field + "을 출력하는 메서드 실행");
			}
		}
		Local lo = new Local();
		lo.field = 10;
		lo.method();
	}
}


package chap07.exam01.overClass;

import chap07.exam01.overClass.Exclass.InsClass;

public class Main {

	public static void main(String[] args) {
		// Exclass에 있는 InsClass 사용 하기
		Exclass ex = new Exclass();
		Exclass.InsClass ins = ex.new InsClass();
		// Exclass를 import를 통해서 명시 하여도 됨
		InsClass ins2 = ex.new InsClass();
		ins.field = 3;
		ins2.field = 4;
		ins.method();
		ins2.method();
		
		System.out.println();
		
		
		
		// Static 멤버 가져오기, static 멤버의 static도 객체화 하지 않아야 접근 가능
		Exclass.StaticClass.sfield = 40;
		Exclass.StaticClass.smethod();
		// field와 method 호출 해 보기
		Exclass.StaticClass sta = new Exclass.StaticClass();
		sta.field = 99;
		sta.method();
		
		System.out.println();
		
		// Local member 호출
		ex.localMethod();
	}

}



2.중첩 인터페이스


인터페이스는 중첩 클래스의 인터페이스 버전으로 생각하면 된다.


중첩 클래스와 같이 직관적으로 보이고 특징들은 비슷하다.


예제를 통해 이해해보자.



package chap07.exam02.overInter;

public class Element {
	
	EventListener listener;
	
	void regist(EventListener listener) { // 특정 감시자를 등록
		this.listener = listener;
	}
	
	void trigger() {
		listener.call();
	}

	// Element와 EventListener의 관계가 직관적으로 보인다.
	interface EventListener{
		void call(); // 이벤트 발생 시 호출 할 메소드 구현
	}
	
}

package chap07.exam02.overInter;

public class Main { // 중첩인터페이스

	public static void main(String[] args) {
		// Element에 Listener 등록
		// 이벤트 발생 시 어떻게 되나?
		Element ele = new Element();
		ele.regist(new OnClickListener());
		
		ele.trigger();
		

		Element ele2 = new Element();
		ele2.regist(new OnKeyListener());
		
		ele2.trigger(); // 이벤트 발생 시 호출 할 메소드 구현
	}

}


'개념 및 코딩 > 06.기타' 카테고리의 다른 글

[JAVA]06-06.Generic  (0) 2018.09.03
[JAVA]06-05.Object  (0) 2018.09.03
[JAVA]06-04.String  (0) 2018.09.03
[JAVA]06-03.Throw 예외처리, 커스텀 예외처리  (0) 2018.09.03
[JAVA]06-02.예외처리 instance of, try catch  (0) 2018.09.03

+ Recent posts