들어가며
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
'Java & JSP' 카테고리의 다른 글
[Java] JAVA Collection Framework 정리 (2) | 2021.11.20 |
---|---|
[Java] Arrays.sort()와 Collections.sort()의 시간복잡도 비교 (0) | 2021.11.20 |
[Java] Java와 Spring의 싱글톤 차이 (0) | 2021.09.29 |
[Java] 객체 정렬 - Comparable, Comparator (0) | 2021.07.16 |
[Java] compareTo 숫자, 문자열 비교 (0) | 2021.07.14 |