현재 Java 공부와 Spring 공부를 함께 진행하고 있다. 며칠 전 Java의 static에 관해서 학습했었고 클래스에서 static을 사용했을 때의 특징을 기억하고 있었다.
오늘 Spring을 학습하면서 DTO를 생성했고 DTO를 정리하기 위해서 하나의 클래스 내에 클래스가 존재하는 내부 클래스로 DTO를 관리했다.
이 때, 내부 클래스의 접근 제한자를 강의 자료를 참고해 public static으로 설정했다. 막상 적고 보니 아래의 두가지 의문이 생겼다.
1. static이면 인스턴스를 생성했을 때 메모리에 하나만 올라가고 이것을 공유하는 것인가?
2. 그럼 다양한 사용자가 동일한 DTO를 사용하는 API를 호출하면 하나의 인스턴스를 활용하기 때문에 잘못된 것이 아닌가?
이런 의문을 해소하기 위해서 내부 정적 클래스를 살펴보았다.
dto
1. 내부 정적 클래스 생성
MemoRequestDto requestdto1 = new MemoRequestDto(); // 1번
MemoRequestDto requestdto2 = new MemoRequestDto(); // 2번
내부 정적 클래스 객체를 2개 생성했다. 그럼 현재 MemoRequestDto는 static이니 두가지 객체는 동일한 인스턴스일까?
우선 정답은 두개는 다른 인스턴스이다.
public class Temp{
int num;
int age;
static int PI = 3.14;
}
혼동이 오는 이유는 'static'이라는 키워드 때문이다. 위 Temp 클래스를 보면 PI는 static으로 선언되었기에 Temp를 사용해 만들어진 많은 인스턴스들은 PI를 함께 공유한다.
하지만 내부 정적 클래스에서의 static은 다르다. 우리가 만드는 모든 클래스는 모두 static 메모리에 올라간다. 내부 정적 클래스의 static은 이때의 static을 의미한다.
내부 클래스에 static 키워드를 붙이면, 외부 인스턴스 없이 내부 클래스의 인스턴스를 바로 생성하여 static 메모리에 올린다는 의미인 것이다.
즉, 어떻게 생성할 수 있냐는 차이일 뿐이지 기능의 차이는 없는 것이다.
static 키워드를 사용하고 싶지 않으면 내부 클래스를 사용해 DTO를 만드는 것이 아닌 각각의 DTO를 만들어 사용하면 된다.
하지만 내부 클래스로 사용할거라면 꼭 static을 붙여줘야 한다.