본문 바로가기

언어/JAVA

정적 멤버 클래스 vs 비정적 멤버 클래스

 

기존에 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