카샤의 만개시기

중첩클래스 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스) 본문

Java/POJO

중첩클래스 (내부클래스, 정적 중첩클래스, 지역클래스, 익명클래스)

SKaSha 2019. 6. 30. 17:18

중첩 클래스는 하기와 같은 구조를 가지고 있습니다.

  • Nested Classes
    • Static Nested Classes (정적 중첩 클래스)
    • Inner Classes
      • Inner Classes (내부 클래스)
      • Method Local Inner Classes (지역 클래스)
      • Anonymous Inner Classes (익명 클래스)

중첩 클래스를 사용하는 이유

  1. 한 곳에서만 사용되는 클래스를 논리적으로 그룹화하는 방법
  2. 캡슐화 증가
  3. 좋은 가독성과 유지보수성

Static Nested Classes (정적 중첩 클래스)

내부클래스는 밖에 있는 클래스의 자원을 마음대로 사용할 수 있지만 중첩클래스는 static 키워드가 안붙었다면 사용할 수 없습니다.
Outer 클래스가 인스턴스화 되어있지 않아도 객체를 생성이 가능합니다.
정적 중첩 클래스는 행동 상으로는 패키징 편의를 위해 다른 최상위 클래스에 중첩 된 최상위 클래스입니다.

class OuterClass {
    static class StaticNestedClass {

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

Inner Classes (내부 클래스)

밖에 있는 클래스는 내부클래스를 멤버변수처럼 사용할 수 있으며 내부클래스는 자신의 밖에 있는 클래스의 자원을 직접 사용할 수 있습니다.

class OuterClass {
    class InnerClass {

    }
}
OuterClass outerClass = new OuterClass();
OuterClass.InnerClass innerClass = outerClass.new InnerClass();

Method Local Inner Classes (지역 클래스)

메소드 내부에 클래스를 정의하여 메소드 내의 지역변수처럼 사용하며, 메소드 밖에서 사용할 수 없다(지역변수 룰)

class OuterClass {
    public void fuc() {
        class LocalClass {

        }
        LocalClass localClass = new LocalClass();
    }
}

Anonymous Inner Classes (익명 클래스)

익명클래스는 말그대로 이름이 없는 클래스이며 new 와 동시에 부모클래스를 상속받아 내부에서 오버라이딩해서 사용합니다. 매개변수로도 사용이 가능하며 상속은 받아야하지만 일회성으로 사용할때 주로 사용합니다.
익명클래스는 외부의 자원을 이용할때 final이 붙은 자원만 사용 가능합니다.

class OuterClass {
    interface AnonymousClass {
        public void hello();
    }
       public void fuc() {
        new AnonymousClass() {
            public void hello() {
                System.out.println("hello world");
            }
        }.hello();
    }
}

대표적인 예

Collections.sort(list, new Comparator<String>() {
    public int compare(String s1, String s2) {
        return Integer.compare(s1.length(), s2.length());
    }
});
Comments