Seren dev's blog

내부 클래스(Nested Class) 다음과 같이 다른 클래스 안에 정의된 클래스를 의미한다.

public class Outer{
	
    // 인스턴스 클래스
    public class Inner{
    }
    
    // 스테틱 클래스
    static public class sInner{
    }
}

 

  • 인스턴스 내부 클래스는 외부 클래스를 참조하는 변수를 선언하지 않아도 바이트 코드 변환시 자동으로 외부를 참조하는 변수를 만든다.
  • 왜냐하면 static이 아닌 내부 클래스는 바깥 인스턴스 없이는 생성할 수 없기 때문이다.
  • 두 클래스의 관계는 내부 클래스의 인스턴스 안에 만들어지며, 메모리를 차지한다.
  • 외부 인스턴스에 대한 참조가 존재하기 때문에, 가비지 컬렉션이 인스턴스 수거를 하지 못하여 메모리 누수가 생길 수 있다.

 

static 내부 클래스는 자신의 바깥 클래스 인스턴스의 임시적 참조를 유지하지 않는다. 즉 static 내부 클래스로 선언하면 메모리 누수의 일반적인 원인을 예방할 수 있고, 클래스의 각 인스턴스당 더 적은 메모리를 사용하게 된다.

 


내부 클래스에서 외부 클래스의 인스턴스에 접근할 일이 없다면 ,무조건 static을 붙여서 정적 클래스로 만들자.

 

static을 생략하면 바깥 인스턴스로의 숨은 외부 참조를 갖게 된다.

앞서도 얘기했듯 이 참조를 저장하려면 시간과 공간이 소비된다.

 

더 심각한 문제는 가비지 컬렉션이 바깥 클래스의 인스턴스를 수거하지 못하는 메모리 누수가 생길 수 있다는 점이다.

static을 사용하지 않으면, 바깥 클래스 인스턴스의 참조를 (내부) 멤버 클래스가 갖고 있으므로, 바깥 클래스 인스턴스가 쓰레기 수거 대상에서 빠지게 된다. 

외부 참조가 눈에 보이지 않으니 문제의 원인을 찾기 어려워 때때로 심각한 상황을 초래하기도 한다.

 

내부클래스가 외부클래스를 참조하지 않는다면, 인스턴스 클래스보다는 static 클래스로 선언하자.

만약 static키워드를 사용하고 싶지 않다면 내부 클래스 보다는 별개의 클래스로 만드는 것이 좋다.

 

 

참고:

Java의 내부 클래스는 static으로 선언하자

내부 클래스는 왜 static 으로 선언할까?

내부(inner) class와 내부(inner) static class 차이

 

728x90
profile

Seren dev's blog

@Seren dev

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!