서비스가 증가할수록 사용하는 DTO의 개수가 많아지고 관리가 어려워질 수 있습니다.
이 경우 내부클래스를 사용하면 가독성이 좋고 관리가 편리해지면서, 역할과 책임도 한 번에 파악할 수 있습니다. (제목-목차와 같은 역할)
또한 클래스의 내부에 숨겨져있어 캡슐화에 도움이 됩니다.
이 때 주의할 점은, 내부 클래스에 static 키워드를 사용해야한다는 것입니다.
0️⃣ static
JAVA에서 static 키워드를 사용해 변수/메소드/생성자를 사용하면, 컴파일 시 클래스가 메모리에 로딩될 때 할당되어 프로그램 종료까지 유지됩니다.
따라서 인스턴스를 생성하지 않아도 바로 호출할 있습니다.
💡 JAVA 메모리 영역
- Static(Method) 영역 : JVM이 클래스파일을 읽어 데이터를 저장하는 영역 (변수까지)
- Heap 영역 : 인스턴스(new로 생성)가 저장되는 영역으로, 가비지 컬렉터의 관리를 받게 됩니다.
- Stack 영역
1️⃣ Non-static Nested Class = Inner Class
class Outer {
public Outer() {}
public class Inner {}
}
✔️ 문제점
- 같은 Outer 클래스에 속해있는 Member 클래스들에 접근이 가능합니다. 즉, Inner 클래스도 Outer 클래스의 자원을 사용할 수 있게 됩니다.
- Outer 클래스에 대한 인스턴스 참조가 유지됩니다.
- Outer 클래스의 인스턴스가 생성된 후에 Inner 클래스의 인스턴스를 생성할 수 있습니다. 즉, 내부 클래스만 사용하더라도 Outer클래스를 참조하게 되어 시간과 메모리공간을 더 차지하게됩니다.
- Outer 클래스와 Inner 클래스가 연결되어있어 가비지 컬렉터가 메모리를 회수할 수 없어, 메모리 누수가 생길 수 있습니다.
✔️ 사용법
Outer.Inner inner = new Outer.new Inner();
2️⃣ Static Nested Class
class Outer {
public Outer() {}
public **static** class Inner {}
}
- Outer 클래스에 대한 직접적인 참조를 하지 않습니다.
- Member 클래스 및 인스턴스 메소드/변수에 접근할 수 없습니다.
- 해당하는 Inner 클래스에 대해서만 조회가 가능합니다.
- 연결된 Outer클래스에 대한 참조가 없어, 가비지 컬렉터의 수거 대상이 됩니다.
💡 static 메소드 : 클래스 메소드
static 키워드를 가진 메소드를 클래스 메소드라고 합니다.
이 클래스 메소드는 인스턴스를 생성하지 않고 바로 사용할 수 있는데, 메소드 내부에서 인스턴스 변수를 사용할 수 없습니다.
✔️ 사용법
Outer.Inner inner = new Outer.Inner();
'프로젝트 Project' 카테고리의 다른 글
Spring Security + JWT로 로그인 구현하기 (2) (1) | 2024.08.06 |
---|---|
추상 클래스로 예외 규격 설정하기 (1) | 2024.08.06 |
Spring Security + JWT로 로그인 구현하기 (1) (0) | 2024.08.05 |
멀티 모듈로 프로젝트 구성하기 (0) | 2024.08.05 |
Ehcache로 캐싱하기 (0) | 2024.08.02 |