기존에 InnerClass와 Nested Class에 대해서 정리해놓은 부분 확인
https://joey-program.tistory.com/16?category=993236
중첩 클래스란 다른 클래스 안에 정의된 클래스를 말한다. 중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야한다.
중첩클래스의 종류
- 정적 멤버 클래스 / nested class
- (비정적) 멤버클래스 / inner class
- 익명 클래스 / inner class
- 지역 클래스 / inner class
정적 멤버 클래스
class A{
private int a;
static class B{
private int b;
}
}
정적 멤버 클래스는 클래스 안에 선언되고, Top 클래스의 private멤버에도 접근할 수 있다는 점을 제외하고는
다른 정적 멤버와 똑같은 규칙을 적용받는다.
static 예약어가 있어 독립적으로 생성가능하며 private로 선언하면 Top클래스에서만 접근할 수 있고 다른 클래스에서는 절대 접근불가하다.
선언 시에는 다음과 같이 객체생성이 가능하다.
void foo(){
A.B b = new B();
}
비정적 멤버클래스
class A{
private int a;
class B{
private int b;
}
}
비정적 멤버 클래스의 인스턴스와 Top클래스 인스턴스 사이의 관계는 멤버 클래스가 인스턴스화 될 때 확립되며 더는 변경할 수 없다.
선언 시에는 다음과 같이 객체생성이 가능하다.
void foo(){
A a = new A();
A.B b = a.new B();
}
//or
void foo(){
A.B b = new A().new B();
}
비정적 멤버 클래스를 생성하는 경우에는 반드시 A객체를 생성 후 객체를 이용해서 생성해야 한다.
비정적 멤버 클래스는 Top클래스에 대한 참조가 필요하다.
차이점
가장 큰 차이점은 static의 유무이다.
이 static의 유무는 굉장히 큰 차이를 가져다준다.
static은 클래스로더가 클래스를 로딩해서 메모리의 메소드영역에 적재할 때 클래스별로 관리된다.
따라서 정적 멤버 클래스 로딩이 끝나는 즉시 사용가능하며 GC의 관리를 받지않아 프로그램 종료까지 메모리에 할당된 채 존재한다.
비정적 멤버 클래스의 경우 Top클래스에 대한 참조를 가지고 있기 때문에 메모리 누수가 발생할 수 있다. Top클래스는 더이상 사용되지 않지만 멤버클래스의 참조로 인해 GC가 수거해가지 못해서 Top클래스의 메모리를 해제하지 못하는 경우가 발생한다.
메모리 누수가 발생할 수 있는 문제점이 있기에 만약 멤버 클래스가 독립적으로 사용된다면 정적클래스로 선언해서 사용하는 것이 Top클래스에 대해 참조를 가지지않아 메모리 누수가 발생하지않기 때문에 좋다.
비정적 클래스는 어댑터 패턴을 이용해서 Top클래스를 다른 클래스로 제공할 때 사용하면 좋다.
(Android Adapter에 비유해서 생각하면 좋다.)
참고
https://tecoble.techcourse.co.kr/post/2020-11-05-nested-class/
'언어 > JAVA' 카테고리의 다른 글
정적 팩터리 메서드(Static Factory Method) (0) | 2022.05.18 |
---|---|
SingleTon Pattern (0) | 2022.02.15 |
strategy pattern (0) | 2022.01.22 |
Adapter Pattern (0) | 2022.01.21 |
[UML]클래스 다이어그램 (0) | 2022.01.19 |