본문 바로가기

Java & JSP

[Java] inner class 와 inner static class 차이

728x90
반응형

들어가며

fastcampus 강의를 듣던 중 application layer 단의 DTO class를 만드는데 inner static class 로 request, response를 만들었다. 이전에 개발 시 dto 생성을 찾아보면서 따라해본 적있는 방법이지만 inner static class 에 대한 개념을 정확히 인지하지 못했다. 강사님이 "inner static class로 만들겠다. 멀티 쓰레드 환경에서 동시성 이슈는 발생하지 않기 때문에 안전하다." 라는 이야기를 하시며 코드를 작성하셨는데 이 말이 잘 이해가 안되서 inner static class에 대해 다시 찾아보고 정리하였다.

 


inner class, inner static class ?
class MyClass {
    class InnerClass{}

    static class InnerStaticClass{}
}

클래스 내부에 종속되어 사용하는 클래스이다.

 

MyClass -> 외부 클래스

InnerClass -> 내부 클래스

InnerStaticClass -> 정적 멤버 클래스 (static member class)

(※ 원래 inner(내부) 라는 말은 정적 클래스에서 사용하지 않는다고 한다.)

 

inner class와 inner static class의 참조 차이

1. 선언문의 차이

// 1. 내부 클래스로 인스턴스 2개 생성
MyClass.InnerClass a = new MyClass().new InnerClass();
MyClass.InnerClass b = new MyClass().new InnerClass();

// result: a != b (다른 참조)


// 2. 내부 정적 클래스로 2개 생성
MyClass.InnerClass c = new MyClass.InnerStaticClass();
MyClass.InnerClass d = new MyClass.InnerStaticClass();

// result: c != d (다른 참조)

놀랍게도 두 경우 모두 '다른 참조' 이다. 보통 static 을 붙이면 메모리에 한번만 올라가서 하나만 사용한다고 생각한다.

 

클래스의 역할은 인스턴스를 만드는 '설계도'의 역할일 뿐 그 자체가 인스턴스처럼 존재할 수 없다. static이라는 키워드가 클래스에 붙게 된다면 인스턴스를 생성하는 방식이 달라지는 것이지 클래스가 갑자기 인스턴스의 역할을 하는 건 아니다.

 

 

2. 외부 참조의 차이

MyClass a = new MyClass();
MyClass.InnerClass b = a.new InnerClass(); //b은 a에 대한 숨은 외부 참조"를 갖는다.

MyClass.InnerStaticClass c = new MyClass.InnerStaticClass(); // c는 해당X

innerClass는 외부 클래스의 인스턴스를 만들고, 다시 InnerClass 생성 시 참조할 수 있다. -> '외부 참조를 갖는다'의 의미

innerStaticClass 는 해당되지 않는다.

 

class MyClass {
    void myMethod() {
        ...
    }

    class InnerClass{
        void innerClassMethod() {
            MyClass.this.myMethod(); //숨은 외부 참조가 있기 때문에 가능
        }
    }

    static class InnerStaticClass{
        void innerClassMethod() {
            MyClass.this.myMethod(); //컴파일 에러
        }
    }
}

따라서 내부 코드에서도 외부클래스의 속성 참조에서 차이를 보인다.

 

 

그러면 어떤 것을 써야 하나?

innerClass의 경우 외부 참조가 가능한데 이 것은 단점이 더 크다.

 

1) 참조값을 담아야 하기 때문에, 인스턴스 생성시 시간적, 공간적으로 성능이 낮아진다.
2) 외부 인스턴스에 대한 참조가 존재하기 때문에, 가비지 컬렉션이 인스턴스 수거를 하지 못하여 메모리 누수가 생길 수 있다.

 

따라서 innerClass를 생성해야할 경우 외부 클래스로 빼도록 하고,

그게 아니면 내부 클래스 생성 시 static으로 사용하는게 적합하다.

 

 

참고

https://siyoon210.tistory.com/141

 

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

개요 class MyClass { class InnerClass{} static class InnerStaticClass{} //내부 클래스에 static이 붙는다면? } 클래스 내부에 선언된 두개의 내부 클래스에 대한 차이점에 대해서 얘기해보겠습니다. 만약에 '..

siyoon210.tistory.com

 

728x90
반응형