1. 내부클래스(inner class)

- 클래스 내에 선언된 클래스이다.

- 특정 클래스 내에서만 주로 사용되는 클래스를 내부 클래스로 선언한다.

- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.

- 코드의 복잡성을 줄일 수 있다.(캡슐화)


2. 내부클래스 종류와 특징

- 내부 클래스의 종류는 변수의 선언위치에 따른 종류와 동일하다.

- 유효범위와 성질도 변수와 유사하므로 비교해보면 이해하기 쉽다.

- 인스턴스 클래스 (instance class)

- 외부 클래스의 멤버변수 선언위치에 선언, 인스턴스 멤버처럼 다루어진다.

- 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다.

- 스태틱 클래스 (static class)

- 외부 클래스의 멤버변수 선언위치에 선언, static 멤버처럼 다루어진다.

- 주로 외부클래스의 static멤버, 특히 static 메서드에서 사용될 목적으로 선언된다.

- 지역 클래스 (local class)

- 외부 클래스의 메서드나 초기화블럭 안에 선언, 선언된 영역 내부에서만 사용될 수 있다.

- 익명 클래스 (anonymous class)

- 클래스의 선언과 객체의 생성을 동시에하는 이름없는 클래스(일회용)

public class Outer {
	class InstanceInner {} // Instance 클래스
	static class StaticInner {} // static 클래스
	
	void myMethod() {
		class LocalInner {} // local 클래스
	} // myMethod
} // Outer

3. 내부클래스의 제어자와 접근성

- 내부클래스의 접근제어자는 변수에 사용할 수 있는 접근제어자와 동일하다.

- static 클래스만 static 멤버를 정의할 수 있다.

- 내부클래스도 외부클래스의 멤버로 간주되며, 동일한 접근성을 갖는다.

public class InnerTest {
	class InstanceInner { }
	static class StaticInner { }
	
	InstanceInner iv = new InstanceInner(); // 인스턴스멤버 간에는 서로 직접 접근이 가능하다.
	static StaticInner cv = new StaticInner(); // static 멤버 간에는 서로 직접 접근이 가능하다.
	
	static void staticMethod() {
//		InstanceInner obj1 = new InstanceInner(); static 멤버는 인스턴스멤버에 직접 접근할 수 없다.
		StaticInner obj2 = new StaticInner();
		
		// 굳이 접근하려면 아래와 같이 객체를 생성해야한다.
		InnerTest outer = new InnerTest(); // 인스턴스클래스는 외부 클래스를 먼저 생성해야만 생성할 수 있다.
		InstanceInner obj1 = outer.new InstanceInner();
	} // staticMethod
	
	void instanceMethod() {
		InstanceInner obj1 = new InstanceInner();
		StaticInner obj2 = new StaticInner(); // 인스턴스메서드에서는 인스턴스멤버와 static 멤버 모두 접근 가능하다.
//		LocalInner lv = new LocalInner(); 메서드 내에 지역적으로 선언된 내부클래스는 외부에서 접근할 수 없다.
	} // instanceMethod
	
	void myMethod() {
		class LocalInner { }
		LocalInner lv = new LocalInner();
	} // myMethod
	
} // InnerTest

- 외부클래스의 지역변수는 final이 붙은 변수(상수)만 접근 가능하다.

- 지역클래스의 인스턴스가 소멸된 지역변수를 참조할 수 있기 때문이다.

public class InnerTest2 {
	private int outerIv = 0;
	static int outerCv = 0;
	
	class InstanceInner {
		int iiv = outerIv; // 외부클래스의 private 멤버도 접근가능하다.
		int iiv2 = outerCv;
	} // InstanceClass InstanceInner
	
	static class StaticInner {
//		int siv = outerIv; 스태틱클래스는 외부클래스의 인스턴스 멤버에 접근할 수 없다.
		static int scv = outerCv;
	} // staticClass StaticInner
	
	void myMethod() {
		int lv = 0;
		final int Lv = 0;
		
		class LocalInner {
			int liv = outerIv;
			int liv2 = outerCv;
//			int liv3 = lv; 외부클래스의 지역변수는 final이 붙은 변수(상수)만 접근가능하다.
			int liv4 = Lv;
		} // InnerClass LocalInner
	} // myMethod
	
} // InnerTest2

4. 익명 클래스(anonymous class)

- 이름이 없는 일회용 클래스, 단 하나의 객체만을 생성할 수 있다.

- 생성자도 가질 수 없고, 하나의 클래스로 상속받는 동시에 인터페이스를 구현하거나 하나 이상의 인터페이스를 구현할 수 없다.

- 오로지 단 하나의 클래스를 상속받거나 단 하나의 인터페이스만을 구현할 수 있다.

public class InnerTest3 {
	
	Object iv = new Object() {
		void method() {
		}
	};
	
	static Object cv = new Object() {
		void method() {
		}
	};
	
	void myMethod() {
		Object lv = new Object() {
			void method() {
			}
		};
	}
	
} // InnerTest3

'Java > Java SE' 카테고리의 다른 글

Java Deep Copy, Shallow Copy  (0) 2013.08.12
Java 컬렉션 프레임웍(Collection Framework)  (2) 2013.08.12
Java 예외처리(exception handling)  (1) 2013.08.08
Java 인터페이스(interface)  (2) 2013.08.07
Java 추상클래스(abstract class)  (0) 2013.08.07

+ Recent posts