[JAVA] 내부 클래스를 static으로 선언해야 하는 이유

Kevin·2024년 2월 28일
0

JAVA

목록 보기
5/16
post-thumbnail

왜 내부 클래스를 정적 클래스로 선언해야 하는가?

왜냐하면 inner 클래스는 inner static 클래스보다 메모리를 더 먹고, 더 느리고, 외부 클래스가 GC 대상에서 빠져 버려 메모리 관리가 안될 수 있기 때문이다.

일반적으로 내부 인스턴스 클래스를 만들기 위해서는 먼저 외부 클래스를 초기화한뒤 내부 클래스를 초기화해야 한다.

  • 내부 클래스가 외부의 멤버를 사용하지 않아도, 숨겨진 외부 참조가 생성되게 된다.
    • 내부 클래스의 생성자에서 외부 클래스를 매개변수로 받아 인스턴스 변수로 저장함을 볼 수 있다.

반면 아래 코드처럼 내부 클래스가 외부 참조를 생성함으로, 외부클래스.this를 통해서 내부에서 외부 클래스를 참조할 수 있다.

public class Outer_Class {
   int field = 10;
   int getField() {
       return field;
   }

   class Inner_Class {
       int inner_field = 20;
       int getOuterfield() {
           return Outer_Class.this.getField(); // 숨은 외부 참조가 있기 때문에 가능
       }
   }
}
  • 이를 통해서 메모리를 더 먹는다.

이 경우에 외부 클래스는 필요가 없어지고 내부 클래스만 남아있을경우, 필요없어진 외부 클래스를 GC 대상으로 삼아 메모리에서 제거해야 하지만,

외부 참조로 내부 클래스와 연결되어 있기 때문에 메모리에서 제거가 안되고 잔존하게 되고 이는 곧 메모리 누수로 프로그램이 터지게 된다.

원래라면 메소드 호출용도로만 쓰여진 일회용 객체는 바로 GC 수거 대상이 되어 제거되어야 되지만, 내부 클래스에서 외부 클래스를 참조하고 있는 관계 때문에, 내부 클래스 데이터가 살아있는 한 외부 클래스 데이터도 계속살아있어 데이터가 지속적으로 메모리에 쌓이게 되어 프로그램이 위험에 빠질 수 있다.

위의 이유들로 내부 클래스를 static으로 선언해야한다.


static으로 하면 위의 문제들을 어떻게 해결해줄 수 있는가?

  1. static 클래스는 외부 참조를 하지 않는다.

    1. 그렇기에 this로 사용하지 못한다.
  2. static 클래스는 외부 참조를 하지 않고, 외부 인스턴스 없이 만들어질 수 있으므로 외부 클래스가 GC 수거 대상이 되기에 메모리 관리가 된다.


레퍼런스

☕ 내부 클래스는 static 으로 선언 안하면 큰일 난다

profile
Hello, World! \n

0개의 댓글

관련 채용 정보