왜 Inner class에 Static을 붙이는거지?

dropKick·2020년 6월 5일
5

Deep Java See

목록 보기
5/21
post-custom-banner

목표

클래스를 사용하면서 외부 인스턴스에 대한 참조가 필요없는 클래스를 선언 시
"Inner class may be static'이라는 경고가 떠서 알아봄

  • Nested Class
  • Inner Class
  • Inner Static Class
  • 결론

Nested Class


자바는 일반 클래스를 제외하고 일반적으로 클래스의 중첩을 이렇게 나눈다.

Nested Class

  • 패키지가 되는 클래스가 아닌 나머지 클래스

  • 하나의 패키지에 대해 여러 클래스를 사용할 수 있고, 서로간 결합만이 존재하는 클래스의 경우 가독성이 좋고 관리하기 편하다.

    클래스가 다른 클래스에만 유용 할 경우 해당 클래스에 클래스를 포함시키고 두 클래스를 함께 유지하는 것이 논리적입니다. 이러한 "헬퍼 클래스"를 중첩하면 패키지가 더욱 간소화됩니다.

  • 중첩 클래스들은 패키지 클래스 내부에 숨겨져있으므로 캡슐화에 도움이 된다.

    A와 B라는 두 가지 최상위 클래스를 고려하십시오. 여기서 B는 선언 될 A의 멤버에 액세스해야합니다. 클래스 A 내에 클래스 B를 숨기면 A의 구성원을 비공개로 선언하고 B가 액세스 할 수 있습니다. 또한 B 자체는 외부 세계에서 숨길 수 있습니다.

non-static nested class

  • Inner class라고 하며 외부 인스턴스에 대한 참조가 유지된다.
  • 외부 인스턴스는 내부 클래스를 new를 통한 인스턴스 할당으로 멤버변수처럼 사용할 수 있다.
  • 외부에 대한 참조가 유지되므로 내부 클래스도 외부 클래스의 자원을 사용할 수 있다.
public class Outer {
	class Inner {
    }
  }
  
Outer outer = new Outer();
Outer.Inner inner = new Outer.new Inner(); 

static nested class

  • static이 붙는 중첩 클래스
  • 동일한 static 멤버들을 사용 가능
  • static의 특징에 따라 외부 인스턴스 멤버의 직접참조가 불가능
public class Outer {
	static class staticNasted {
    }
  }
  
Outer.Inner staticNasted = new Outer.Inner();

결론

외부 참조로 인한 기능들 사용하지 못함에도 IDE에서 내부 클래스를 static으로 만들라고 하는 이유는 다음과 같다.

  • 외부 참조가 유지된다는 것은 메모리에 대한 참조가 유지되고 있다는 뜻
    GC가 메모리를 회수할 수 없다. 당연히 이는 메모리 누수를 부르는 치명적인 단점이다.
  • 항상 외부 인스턴스의 참조를 통해야 하므로 성능 상 비효율적이다.

결국 외부 인스턴스에 대한 참조가 필요하지 않다면 static nested class로 만드는 것이 낫다.

참고

중첩 클래스를 알아보자
Inner class vs Inner Static class
Oracle Java Tutorial
[Effective Java 3/E 멤버클래스는 가능하면 static으로 선언하라]

post-custom-banner

2개의 댓글

comment-user-thumbnail
2021년 11월 29일

non-static nested class 예시에서 잘못된 부분이 있습니다.
Outer.Inner inner = new Outer.Inner();
=> Outer.Inner inner = new Outer.new Inner(); 로 수정이 필요할 것 같네요

1개의 답글