My Profile Photo

DongChanS's blog


수학과 학생의 개발일지


Java (3) - Class (2) - Nested class

1) Nested Classes

클래스 안의 (멤버)클래스를 의미함.

1-0 Terminology

  • OuterClass : 바깥의 클래스
    • public, private만 선언가능함.
  • InnerClass : NestedCalss but, non-static
    • OuterClass의 모든 멤버변수를 가져올 수 있음 (private여도 상관없음)
  • StaticNestedClass

1-1. Why Use Nested Classes?

  1. 클래스를 구조적으로 잘 묶을 수 있다.
  2. It increases encapsulation
    • 클래스 A,B를 Top-level에 놔둔다면, B를 통해서 A의 멤버변수에 접근하고 싶을 때는 A의 멤버변수를 private으로 설정하면 안된다.
    • 이것을 극복하기 위해서는, 클래스 B를 A 안에 놔둠으로써, A의 멤버변수를 private로 설정해도 접근할 수 있게 되고, 이것은 보안적으로 더 안전하다는 의미입니다.
    • 그리고, B클래스 자체도 숨겨질 수 있다는 장점이 있음.
  3. It can lead to more readable and maintainable code

1-2. StaticNestedClass

  1. OuterClass의 멤버변수나 메소드에 접근할 수 없음.

    오직, object의 레퍼런스를 통해서 사용할 수 있기 때문이다.

  2. 그러니까 StaticNestedClass는 그냥 Top-level-class와 작동하는 형식이 똑같다고 생각하면됨.

사용예시

OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

1-3. Inner Class

  • OuterClass와 직접적으로 연결될 수 있다.

  • because an inner class is associated with an instance, it cannot define any static members itself.

    => OuterClass의 인스턴스 단위로 innerclass를 조작할 수 있는데, 만약 innerclass의 스태틱멤버를 만들게 되면 인스턴스랑 연관되어야 한다는 뜻이기 때문에 성립하지 않는 것입니다.

  • local classanonymous class로 나눠질 수 있습니다.

사용예시

=> OuterClass의 인스턴스 단위로 조작해야만 합니다.

OuterClass.InnerClass innerObject = outerClassInstance.new InnerClass();

2-4. 사용예시

public class InnerClassTest {
    private int id;
    public InnerClassTest(int id){
        this.id = id;
    }

    public static class StaticNestedClass {
        int id;
        public StaticNestedClass(int id){
            this.id = id;
        }
    }

    public class InnerClass {
        int id;
        public InnerClass(int id){
            this.id = id;
        }
        public void print(){
            System.out.println(id);
            System.out.println(InnerClassTest.this.id); // Outer 클래스의 id를 들고올수있음.
            System.out.println(this.id);
        }
    }

    public static void main(String[] args){
        InnerClassTest ict = new InnerClassTest(50);
        InnerClass ic = ict.new InnerClass(40);
        InnerClassTest.InnerClass ic2 = ict.new InnerClass(41);
        // 두가지방법으로 선언이 가능한데 그냥 InnerClass로 하는게 더 직관적일듯?
        StaticNestedClass snc = new InnerClassTest.StaticNestedClass(30);
        ic.print();
        System.out.println();
        ic2.print();
    }
}

40
50
40

41
50
41

1-5. Local Classes

  1. block 안에 클래스가 정의된 형태

    • block : a group of zero of more statements between balanced braces

      (can be used anywhere a single statement is allowed.)

      • statements : unit of execution
        • expression statements
          • Assignment
          • ++, –
          • Method invocations
          • Object creation
        • declaration statements
        • control flow statements
  2. 예를 들면 메소드 안에도 클래스를 정의할 수 있는데,

    이렇게 정의하면 메소드의 파라미터들을 클래스 내에서 참조할 수 있다고 합니다.

  3. 어찌됬건 static member를 선언할 수 없기 때문에 inner class와 비슷합니다.

comments powered by Disqus