static inner class

jyleever·2022년 6월 6일
0

자바

목록 보기
1/2

프로젝트를 진행하면서 RequestDTO 객체와 ResponseDTO 객체를 각각 다른 클래스로 생성하지 않고 DTO라는 한 클래스 내에 static inner class로 각각 생성했다. static inner class에 대해 살짝 공부해봤다.

inner class(내부 클래스)

하나의 클래스 내부에 선언된 또 다른 클래스

  • 이러한 내부 클래스는 외부 클래스(outer class)에 대해 두 개의 클래스가 서로 긴밀한 관계를 맺고 있을 때 선언

문법

class Outer {     // 외부 클래스

    ...

    class Inner { // 내부 클래스

        ...

    }

    ...

}

내부 클래스의 장점

내부 클래스를 사용하면 다음과 같은 장점이 존재한다.

  1. 내부 클래스에서 외부 클래스의 멤버에 손쉽게 접근할 수 있다.
  2. 서로 관련 있는 클래스를 논리적으로 묶어서 표현함으로써, 코드의 캡슐화를 증가시킨다.
  3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드의 복잡성을 줄일 수 있다.

내부 클래스의 종류

내부 클래스는 필드와 마찬가지로 선언된 위치에 따라 다음과 같이 구분된다.

  1. 정적 클래스(static class)
  2. 인스턴스 클래스(instance class)
  3. 지역 클래스(local class)
  4. 익명 클래스(anonymous class)

외부 클래스 영역에 선언된 클래스 중에서 static 키워드를 가지는 클래스를 정적 클래스(static class)라고 한다.
이러한 정적 클래스는 주로 외부 클래스(outer class)의 클래스 메소드에 사용될 목적으로 선언된다.

static inner class

non-static inner class

  • non-static inner class, 즉 InnerClass는 자신을 만들어준 인스턴스에 대한 '외부 참조'를 갖는다. 그리고 이 참조는 숨겨져 있어서 '숨은 외부 참조' 라고 불린다.
  • 외부 인스턴스는 내부 클래스를 new를 통한 인스턴스 할당으로 멤버변수처럼 사용할 수 있다.
  • 외부에 대한 참조가 유지되므로 내부 클래스도 외부 클래스의 자원을 사용할 수 있다.
public class Outer {
	class Inner {
    }
  }

Outer outer = new Outer();
Outer.Inner inner = new Outer.new Inner(); 

static inner class

원래 'inner 혹은 내부'라는 키워드는 static class에 사용하지 않는다고 한다. 단지 차이점을 비교하기 위해서 편의상 사용하며, 정확한 명칭은 static member class (혹은 정적 멤버 클래스) 라고 해야한다.

public class Outer {
	static class staticInner {
    }
}
  
Outer.staticInner inner = new Outer.staticInner();

inner static class는 new 연산자를 한번만 사용해도 새로운 인스턴스를 만들 수 있다. 외부 클래스에 대한 인스턴스가 굳이 필요 없다. 따라서 외부참조가 존재하지 않는다.

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

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

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

결론

외부 참조가 불가능해도 내부 클래스를 가능한 static으로 선언하라는 이유는 다음과 같다.

  • 외부 참조가 유지된다는 것은 외부 인스턴스에 대한 참조가 존재한다는 것, 즉 가비지 컬렉션이 인스턴스 수거를 하지 못 해 메모리 누수가 생길 수 있다는 치명적인 단점이 있다.
    따라서 항상 외부 인스턴스 참조를 통해야 하므로 성능 상 비효율적이다.

inner class를 선언할 때에는 외부 인스턴스 참조가 필요하지 않다면 static 키워드를 붙여준다.


참조
http://www.tcpschool.com/java/java_usingClass_innerClass
https://velog.io/@agugu95/%EC%99%9C-Inner-class%EC%97%90-Static%EC%9D%84-%EB%B6%99%EC%9D%B4%EB%8A%94%EA%B1%B0%EC%A7%80
https://siyoon210.tistory.com/141

0개의 댓글