본문 바로가기

java

[Java] Nested Class (중첩 클래스)

중첩 클래스 : 다른 클래스 안에 정의된 클래스

중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임이 있으면 중첩 클래스로 구현하면 안된다. 

Nested Class를 사용하는 이유 

  • 소스의 가독성, 유지보수
  • 오직 한 곳에서 사용되는 클래스들의 논리적인 그룹핑 방법
    • 한 클래스가 다른 하나의 클래스에서만 사용될 경우 → 두 클래스를 함께 두는 것이 논리적임
  • 캡슐화 증대
    • private으로 다른 클래스들로 부터 감추자 

Nested Class의 종류

  1. static nested class
  2. local inner class (non-static)
  3. anonymouse inner class 

static nested class

public class University {
  static class Student {
  }
}
public class HighSchool {
  static class Student {
  }
}
  • 사용 : 
    HighSchool.Student zinn = new HighSchool.Student();
  • HighSchoolStudent, UniversityStudent처럼 하나의 클래스로 선언할 수도 있지만 위처럼 staic nested class로 개발하면 더 명시적이다. 
  • 각각의 내부 클래스 Student는 서로 멤버가 다르고(내부적 구현이 다름), 각각 University, HighSchool 클래스에서만 사용된다.
  • Student클래스 내부에서는 바깥 클래스에 접근할 수 없다.

inner class (non-static)

  • 비정적 중첩 클래스는 내부 클래스에서 바깥 클래스에 접근할 수 있다. 
  • @Getter
    public class HighSchool {
      private final String schoolName;
    
      public HighSchool(String schoolName) {
        this.schoolName = schoolName;
      }
    
      class Student {
        public String getName() {
          // 정규화된 this를 이용해서 바깥 클래스의 인스턴스 메소드 사용 
          return HighSchool.this.getSchoolName();
        }
      }
    }
  • 사용 : 
    HighSchool highSchool = new HighSchool("hangsin");
    Student student = highSchool.new Student();

static nested class vs inner class (non-static)

  • 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 static을 붙여서 정적 멤버 클래스로 만들자.
  • 즉, 외부 클래스와 독립적으로 존재 가능하다면 static!!
  • 이유 : static을 생략하면 바깥 인스턴스로의 숨은 외부 참조를 갖게 되고, 이 때문에 시간과 공간이 소비됨. + 가비지 컬렉션이 바깥 클래스의 인스턴스를 수거하지 못하는 메모리 누수가 발생할 수 있음 
 
반응형