Nested 클래스

내부 클래스 구분

  • Nested class

    • Static nested class

    • inner class

      • Local inner class

      • Anonymous inner class

Static nested 클래스 특징

  • 내부 클래스는 감싸고 있는 외부 클래스의 어떤 변수에도 접근할 수 있다.

    • 심지어 private 로 선언 된 변수까지도 접근이 가능하다.

  • 하지만 Staic nested 클래스를 그렇게 사용하는 것은 불가능하다.

    • static 변수, 메소드만 접근이 가능하다. -> 만약 static 이 붙어 있지 않은 변수, 메소드에 접근하면 컴파일 에러가 발생한다.

public class OutherOfStatic {
    static class StaticNested {
        private int value = 0;
        public int getValue() {
            return value; 
        }
        
        public void setValue(int value){
            this.value=value; 
        }
    }
}
  • 위 코드에서 내부에 있는 Nested 클래스는 별도로 컴파일 할 필요가 없다.

    • 왜냐면, 여기서 OuterOfStatic 이라는 감싸고 있는 클래스를 컴파일하면 자동으로 컴파일되기 때문이다.

  • 컴파일하면 다음과 같이 두 개의 클래스가 만들어진다.

    • OuterOfStatic.class

    • OuterOfStatic$StaticNested.class

Static nested 클래스 객체를 만드는 방법

왜 이렇게 귀찮게 Static Nested 클래스를 만들까?

  • 일반적으로 Static Nested 클래스를 만드는 이유는 클래스를 묶기 위해서이다.

  • 고등학교, 대학교 별 학생을 관리하고 싶다면 어떻게 만들 수 있을까?

  • 위 코드와 같이 겉으로 보기에는 유사하지만, 내부적으로 구현이 달라야 할 때 Static Nested 클래스를 사용한다.

내부 클래스와 익명 클래스

내부 클래스

  • 내부 클래스는 위에서 살펴 본 Static Nested 클래스와 겉으로 차이는 Static 을 쓰느냐 쓰지 않느냐의 차이만 있을 뿐이다.

  • 위 코드에서 객체를 생성한 후 사용하는 방법은 차이가 없지만, 객체를 생성하는 방법에는 차이가 있다.

    • 내부 클래스는 바깥을 감싸고 있는 OuterOfInner 클래스를 먼저 생성해야 한다.

    • 그 후 Inner 클래스를 생성할 수 있다.

왜 이렇게 귀찮게 내부 클래스를 만들까?

  • 내부 클래스를 만드는 이유는 캡슐화 때문이다.

  • 하나의 클래스에서 어떤 공통적인 작업을 수행하는 클래스가 필요한데, 다른 클래스가 전혀 필요가 없을 때 이러한 내부 클래스를 만들어 사용한다.

    • 내부 클래스는 GUI 관련 프로그램을 개발할 때 가장 많이 사용한다.

    • 하나의 애플리케이션에서 어떤 버튼이 눌렸을 때 수행해야 하는 작업은 대부분 상이하다. 그러니 하나의 별도 클래스를 만들어 사용하는 것보다 내부 클래스를 만드는 것이 훨씬 편하다.

익명 클래스

  • 내부 클래스를 만드는 것보다도 더 간단한 방법은 "익명 클래스" 를 만드는 것이다.

  • 위 코드와 같이 클래스를 생성하는 것이 아닌, 실행 시점에 클래스에 필요한 구현들을 초기화해주고 사용하면 된다.

왜 이렇게 귀찮게 익명 클래스를 만들까?

  • 만약 재사용하지 않는 클래스를 정의해야 한다고 했을 때 새로운 클래스를 정의하는 것은 유지보수 측면에서 불필요한 자원 낭비일 수 있다.

  • 이 때, 익명 클래스를 사용해 인스턴스를 바로 만들어 사용하는 것이 유지보수 측면에서 이점이 클 것이다.

Last updated