java
Nested, 중첩클래스
1+1은?
2013. 7. 25. 16:51
Nested, 중첩클래스
: 클래스 선언안에 또 다른 클래스를 선언
: 프로그램 구조를 간략화
: 클래스를 클래스의 멤버처럼 취급
: 제한적인 지역에서만 사용하려 할 때
(같은 패키지의 A, B, C 클래스 중 A클래스에서만 필요한 클래스가 있다고 가정할 때)
■ static nested class
: 외부와 내부의 멤버가 private일 경우에도 서로간 모두 접근 가능하다.
: 중첩 클래스는 경로만 지정해주면 단독으로도 직접 사용가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Outer { private static int outerMember; public static class Nested { private static int innerMember; public static void nestedM() { System.out.println(outerMember + innerMember); } } public static void outerMethod() { System.out.println(outerMember + Nested.innerMember); //외부메서드에서도 내부클래스의 멤버에 접근할 수 있다. //같은 클래스로 간주하기 때문에 private은 무시된다. } } |
외부에서 접근하는 방법은 다음과 같다.
1 2 | Outer.Nested.nestedM(); Outer.Nested.innerMember; //private이기 때문에 접근불가 |
■ nested class
: static 중첩 클래스에서 static 속성을 뺀 클래스
: 정적멤버를 선언할 수 없다.
(static이 없는 중첩클래스를 의미하며 외부에서는 객체를 통한 접근방식을 쓴다)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Outer { private static int a = 10 ; private int b = 20 ; public class Inner { //non-static private int c = 40 ; public void innerMethod() { ... } } public void outerMethod() { ... } } |
위와 같은 경우 Inner 클래스에서 Outer 클래스의 멤버변수 a와 b 에 접근하는 방법은 다음과 같다.
1 2 3 4 5 6 7 8 | public void innerMethod() { System.out.println(Outer2.a); //스태틱 외부 멤버 Outer out = new Outer(); System.out.println(out.b); //인스턴스 외부 멤버 System.out.println( this .c); //인스턴스 내부 멤버 } |
이것은 외부클래스의 멤버에도 똑같이 적용된다.
1 2 3 4 5 6 7 8 | public void outerMethod() { System.out.println(a); //스태틱 외부 멤버 System.out.println( this .b); //인스턴스 외부 멤버 Inner inner = new Inner(); System.out.println(inner.c); //인스턴스 내부 멤버 inner.innerM(); } |
즉, 같은 클래스로 인식하지는 않지만 접근제어는 무시한다.
■ local class, 로컬클래스
: 메서드 안에서 선언한 클래스
: 선언한 메서드에서만 사용하기 위한 클래스
1 2 3 4 5 6 7 8 9 10 11 12 13 | class Outer { public void outerM() { int localMember = 30 ; class Local { private int d = 40 ; //static 생성불가 public void localM() { } } } } |
로컬클래스는 선언한 메서드에서만,
위와 같은 경우엔 outerM() 메서드 안에서만 사용할 수 있다. (외부에서 인스턴스 생성 불가)
또한 static 키워드를 사용할 수 없다.
■ anonymous class, 익명 클래스
: 1회용 클래스
: 객체를 한 번만 만들기 위해 선언
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Outer { public Object outerM() { return new Object() { //익명클래스 영역 -> 멤버선언가능 //단, 오버라이딩만 가능하다. @Override public String toString() { return "익명 클래스 오버라이딩" ; } } } } Outer o = new Outer(); System.out.print(o.outerM()); → 익명 클래스 오버라이딩 |