24. 멤버 클래스는 되도록 static 으로 만들어라

신명철·2022년 2월 20일
0

Effective Java

목록 보기
22/80

중첩 클래스의 종류

  1. 정적 멤버 클래스
  2. 비정적 멤버 클래스
  3. 익명 클래스
  4. 지역 클래스

이 중 첫번째를 제외한 나머지는 inner class 에 해당한다.

정적 멤버 클래스

정적 멤버 클래스는 바깥 클래스의 private 멤버에 접근할 수 있다. 이 점만 제외한다면 나머지 일반 클래스와 똑같다.

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

정적 멤버 클래스와 비정적 멤버 클래스의 차이는 단순히 static 붙냐 안붙냐의 차이이지만, 의미상 차이는 꽤 크다.

  • 비정적 멤버 클래스의 인스턴스는 바깥 클래스의 인스턴스와 암묵적으로 연결된다. 따라서, 정규화된 this를 사용해서 바깥 인스턴스의 메서드를 호출하고나 참조를 가져올 수 있다.

    정규화된 this ?
    클래스명.this 형태로 바깥 클래스의 이름을 명시하는 용법

public class Outer {
    private final String name;

    public Outer(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    class Inner {
        private final String InnerName;
        
        public Inner(String InnerName) {
            this.InnerName = InnerName;
        }

        public String getNameWithOuter() {
            return InnerName + Outer.this.getName();
        }
    }
    
   	static class Static{
    	private final String staticName;
    	public Static(String staticName) {
    		this.staticName = staticName;
    	}
    }
}

public class Test {
	
	public static void main(String[] args) {
		
		Outer outerClass = new Outer("hello");
        // Inner :: Outer 인스턴스가 있어야 생성 가능
		Outer.Inner innerClass = outerClass.new Inner("Inner");
        // Static :: Outer 인스턴스가 없어도 생성 가능
		Outer.Static staticClass = new Outer.Static("Static"); 
		
	}	
}
  • 중첩 클래스의 인스턴스가 바깥 인스턴스와 독립적으로 존재할 수 있다면 정적 멤버 클래스로 만들어야 한다. 비정적 멤버 클래스는 바깥 인스턴스 없이는 생성할 수 없기 때문이다.
  • 바깥 클래스와 비정적 클래스의 참조 관계에 대한 정보는 비정적 클래스 인스턴스 안에 만들어진다. 메모리 공간을 차지하고 생성 시간도 더 걸리게 된다.
  • static 을 생략하면 외부 인스턴스로의 숨은 외부 참조를 갖게 되며 GC 가 외부 클래스의 참조를 찾지 못해 메모리 누수가 생길 수 있다.

    멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 정적 멤버 클래스로 만들자!

profile
내 머릿속 지우개

0개의 댓글