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());
 
→ 익명 클래스 오버라이딩