Computer Science/Java / / 2024. 4. 28. 18:21

Inner Class

Inner class는 말 그대로 Class 내부에서 선언된 Class를 의미합니다. 이는 중첩 클래스(nested class)라고도 말하며, Outer Class와 연관성이 높은 Class를 객체화 시킬 때 사용합니다.

하지만 Inner Class를 그저 아래와 같이 사용한다면 몇 가지 문제점이 생깁니다

package record;

public class InnerClass {
    int num;
    String name;

    public InnerClass(int num, String name) {
        this.num = num;
        this.name = name;
    }

    class Inner {
        int innerNum;
        String innerName;

        public void print() {
            System.out.println(innerNum);
            System.out.println(innerName);
        }
    }
}

이러한 코드는 IDE 상에서 다음과 같은 Warning Message를 보여주게 됩니다

말 그대로 Inner Class는 static을 선언해달라는 의미입니다. 도대체 왜 이런 경고 문구가 나오는 걸까요?

정답은 Inner Class에 static을 사용하지 않는다면 Outer Class를 참조하여 메모리 누수가 발생할 수 있기 때문입니다.

비정적(non-static) 멤버 클래스의 인스턴스는 바깥 클래스의 인스턴스와 암묵적으로 연결됩니다.

위 코드를 조금 변경하여 다음과 같이 작성하였습니다.

public class InnerClass {
    int num;
    String name;

    public InnerClass(int num, String name) {
        this.num = num;
        this.name = name;
    }

    class Inner {
        int innerNum;
        String innerName;

        public void printOuter() {
            System.out.println(num);
            System.out.println(name);
        }
    }
}

이전 코드와 다르게 Outer Class의 멤버변수인 num, name을 참조한 모습입니다.

이러한 코드에서는 Outer Class를 사용하지 않음에도 불구하고 Inner Class에서 Outer Class의 멤버변수들을 참조하고 있기 때문에 GC가 발생하지 않고, 메모리를 참조한 채로 남아있게 됩니다.

이러한 메모리 누수가 연속된다면 OOM이 발생하여 서버에 매우 안좋은 영향을 끼치게 됩니다.

이에 대한 해결법은 Warning Message 와 같이 static 으로 선언해주면 해결됩니다.

static Inner Class 는 외부 참조를 하지 않기 때문에, Outer Class 의 멤버변수를 사용하지 못합니다.

이러한 특성 덕에 더 이상 Outer Class에 대한 참조 관계가 사라져 자연스레 메모리 누수에서 자유로워 집니다.

따라서 모든 Inner Class 에는 static을 사용하여 메모리 누수에 대한 예방을 하는 것을 강력히 권장드립니다.

“JAVA를 공부하셨던 분들이라면 그럼 static 영역에 Inner Class 가 계속 존재하는 거 아니야?” 라는 의문점이 생기실 수 있는데, 이는 다음 static과 JVM 영역에 관한 게시글에서 설명하겠습니다.

Reference

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%82%B4%EB%B6%80-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%8A%94-static-%EC%9C%BC%EB%A1%9C-%EC%84%A0%EC%96%B8%ED%95%98%EC%9E%90

 

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

Inner 클래스의 문제점 인텔리제이와 같은 IDE에서 내부 클래스를 선언하여 사용하면 다음과 같이 경고 메세지가 뜰 것이다. (내부 클래스가 외부의 멤버를 참조하여 사용하지 않을 경우) 메세지

inpa.tistory.com

 

'Computer Science > Java' 카테고리의 다른 글

Class Loading  (0) 2024.05.05
JAVA 8 vs JAVA 11 vs JAVA 17  (2) 2024.04.21
JAVA record란?  (1) 2024.04.03
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유