Item 24. 멤버 클래스는 되도록 static으로 만들라

중첩 클래스

  • Static 멤버 클래스

  • (Non-static) 멤버 클래스

  • 익명 클래스

  • 지역 클래스

멤버 클래스

Static 멤버 클래스

  • 바깥 클래스의 private 멤버에 접근할 수 있음

  • 바깥 클래스와 연결되지는 않음

Non-static 멤버 클래스

  • 해당 클래스의 인스턴스는 바깥 클래스의 인스턴스가 먼저 생성된 후 생성되어야 함

  • 바깥 클래스의 인스턴스와 연결됨

    • 바깥 클래스의 인스턴스의 참조를 가져올 수 있음

Non-static 멤버 클래스의 단점

  • 바깥 인스턴스와의 참조를 저장하기 위한 시간/메모리를 소모 (비효율적)

  • GC가 바깥 클래스의 인스턴스의 수거 여부를 결정하기 어렵게 만듦 (메모리 누수 위험성)

  • 따라서, 멤버 클래스에서 바깥 인스턴스에 접근해야 하는 게 아니라면 멤버 클래스는 static으로 만드는 것이 좋음

익명 클래스와 지역 클래스

익명 클래스

  • 선언 지점에서만 인스턴스를 만들 수 있는 클래스

  • 람다의 도입 이전에는 작은 메서드를 갖는 객체, 처리(process) 객체 등을 지원하고자 사용

    • 람다가 도입되면서 이 자리를 람다가 대체함

지역 클래스

  • 지역변수를 선언하는 위치(메서드 내, block 내 등)에서 사용하는 클래스

  • Non-static 멤버 클래스와 유사하나 선언 범위에 더 제약이 없음

  • 잘 사용하지 않음

익명 클래스와 람다

익명 클래스

MyClass class = new MyClass() {
		@Override
		public void add(int n1, int n2) {
				return n1 + n2;
		}
}
  • 해당 스코프에서만 유효한 새로운 클래스를 만들어 이 클래스의 메서드를 호출

람다

MyClass class = (n1, n2) -> n1 + n2;
  • 클래스를 생성하는 대신, 메서드만을 구현

  • 훨씬 가독성이 좋고 간결

  • 클래스를 생성할 필요가 없음 (실제 바이트코드에서도 클래스를 생성하는 대신 메서드만 만듦)

  • Java 8부터 사용 가능

Last updated