클래스가 여러 클래스와 관계를 맺는 경우에는 독립적으로 선언하는 것이 좋으나, 특정 클래스와 관계를 맺을 경우에는 관계 클래스를 클래스 내부에 선언하는 것이 좋다.
중첩 클래스란 클래스 내부에 선언한 클래스를 말하는데 이 것을 사용하면 두 클래스의 멤버드을 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 관계 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.
선언 위치에 따른 분류 |
선언 위치 |
설명 | |
멤버 클래스 |
인스턴스 맴버클래스 |
class A{ class B{ } } |
A 객체를 생성해야만 사용할 수 있는 B 클래스 (Inner Class) |
정적 멤버 클래스 |
class A{ static class B { } } |
A 클래스로 바로 접근할 수 있는 B 중첩 클래스 (Nested Class) | |
로컬 클래스 |
class A{ void method(){ class B{ } } } |
Method()가 실행할 때만 사용할 수 있는 B 중첩 클래스 (local Class) |
인스턴스 맴버 클래스는 static 키워드 없이 선언된 클래스를 말한다. 인스턴스 멤버 클래스는 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.
1 2 3 4 5 6 7 8 9 10 11 |
class A{ class B{ B() {} //생성자 int field; //인스턴스 필드 //static int filed2 //정적 필드 -> 사용불가 void method() {} //인스턴스 메소드 //static void method2() {} //정적 메소드 -> } } Colored by Color Scripter |
A 클래스 외부에서 B 클래스 객체를 생성하려면 A객체를 생성하고 B 객체를 생성해야 한다.
A a = new a( );
A.B b = a.new B( );
b.field1 = 3;
b.method();
와 같이 사용한다.
정적 멤버 클래스는 static 키워드로 선언된 클래스를 말한다. 정적 멤버 클래스는 모든 종류의 필드와 메소드를 선언할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 |
class A{ static class C{ C() {} //생성자 int field1; //인스턴스 필드 static int field2 //정적 필드 void method1() {} //인스턴스 메소드 static void method2() {} //정적 메소드 } } Colored by Color Scripter |
A클래스 외부에서 정적 멤버 클래스 C의 객체를 생성하기 위해서는 A 객체를 생성할 필요가 없고 다음과 같이 하면 된다.
A.C c = new A.C( );
c.field1 = 3;
c.method1( );
A.C.field2 = 3;
A.C.method2( );
중첩 클래스는 메소드 내에서도 선언할 수 있다. 이것을 로컬 클래스라고 한다. 로컬 클래스는 접근 제한자(public, private) 및 static을 붙일 수 없다. 로컬 클래스는 메소드 내부에서만 사용되므로 접근을 제한할 필요가 없기 때문이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void method() { class D { D() {} //생성자 int field1 //인스턴스 필드 //static int field2; //정적 필드 -> 사용 불가 void method1() { } //인스턴스 메소드 //static void method2() {} //정적 메소드 -> 사용 불가 } D d = new D(); d.field1 = 3; d.method1(); } Colored by Color Scripter |
즉 static못쓰고 public, private 못쓴다. 로컬 클래스는 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다.
멤버 클래스(Inner, Nested)클래스에선 사용 제한이 있다.
먼저 Inner class는 다음과 같다
그리고 Nested class 에선 다음과 같다
이러한 특징을 가지고 있는 것이 내부 클래스들이다.
'java' 카테고리의 다른 글
자바 예외처리(try catch) (0) | 2017.08.17 |
---|---|
자바 중첩 인터페이스, 익명 인터페이스(익명 객체) (0) | 2017.08.17 |
자바 인터페이스 - 2 (0) | 2017.08.16 |
자바 인터페이스 - 1 (0) | 2017.08.16 |
자바 추상 클래스, 추상 메소드, 자동 타입 변환 (0) | 2017.08.16 |