개발 공부/Java

내부 클래스에 static이 권장되는 이유

gmelon 2022. 4. 26. 20:24

강의를 듣던 중 강사님께서 내부 클래스를 static으로 선언하시길래 이유가 궁금하여 찾아보았다. 찾아보니 이팩티브 자바에 해당 내용에 대한 설명이 나와있다고 한다. 나중에 꼭 읽어봐야지,,

 

결론은 내부 클래스에서 외부 클래스의 인스턴스 변수에 접근하지 않는다면 내부 클래스는 static으로 선언하는 것이 좋다는 것이다.

 

그 이유는 크게 두 가지로 정리할 수 있는데

  1. static으로 선언되지 않은 내부 클래스는 외부 클래스에 대한 숨은 참조를 저장해야 하기 때문에 이를 위한 시간/공간적 복잡도가 증가해 성능이 떨어진다.
  2. 내부 클래스가 외부 클래스에 대한 숨은 외부 참조를 갖기 때문에 가비지 컬렉션이 제대로 이루어 지지 않아 메모리 누수가 발생할 수 있다.

숨은 외부 참조

숨은 외부 참조라는 개념이 잘 와닿지 않아 아래와 같은 예제 코드를 통해 4가지 경우의 수를 모두 테스트해보았다.

먼저 static으로 선언된 내부 클래스에서 외부 클래스의 인스터스 변수에 접근하려고 하자 오류가 발생했다. 이는 즉 static으로 선언된 내부 클래스는 외부 클래스에 대한 숨은 외부 참조를 갖지 않는다는 것을 의미한다.

 

public class OuterClass {

    static int staticVariable = 0;
    int nonStaticVariable = 0;

    public static class StaticInnerClass {

        void accessStaticVariable() {
            OuterClass.staticVariable += 1; // 접근 가능
        }

        void accessNonStaticVariable() {
            OuterClass.this.nonStaticVariable += 1; // 컴파일 오류
        }

    }

    public class NonStaticInnerClass {

        void accessStaticVariable() {
            OuterClass.staticVariable += 1; // 접근 가능
        }

        void accessNonStaticVariable() {
            OuterClass.this.nonStaticVariable += 1; // 접근 가능
        }
    }

}

반면 non static으로 선언된 내부 클래스에서는 외부 클래스의 인스턴스 변수에 접근이 가능했고 따라서 이는 해당 내부 클래스에서 숨은 외부 참조를 가지고 있다는 것을 의미한다.

 

솔직히 지금은 숨은 외부 참조로 인해 성능이 떨어진다는 것이 잘 와닿지는 않지만 static으로 선언하지 않았을 때 IDE에서 경고해주는 이유가 궁금했는데 이러한 배경이 있었다는 것을 알게 되어 뿌듯하다~