이펙티브 자바 #item24 멤버 클래스는 되도록 static 으로 만들라

임현규·2023년 1월 30일
0

이펙티브 자바

목록 보기
24/47

중첩 클래스

중첩 클래스란 nested class로 불리고 클래스 내부에 선언한 클래스이다. 해당 클래스는 바깥 클래스가 활용하며, 그 외에 활용도가 있다면 다른 톱 클래스로 만들어야 한다.

클래스의 종류는 멤버 클래스, 지역 클래스, 정적 멤버 클래스, 익명 클래스 이렇게 4가지이다.

중첩 클래스를 왠만하면 static으로 만들어야 하는 이유

중첩 static 클래스의 장점은 static이기 때문에 outer class의 인스턴스 생성 없이도 내부 클래스를 활용할 수 있기 때문이다. 물론 static class를 outer class 외에 사용한다면 톱 클래스로 빼는 것이 낫지만, 인스턴스 생성을 outer class에게 위임하거나, private을 활용해 outer class에 활용한다면 내부 static class를 사용하는 것이 안정적이고 유용하다.

비정적 중첩 클래스를 사용하는 경우

non-static nested class의 경우 바깥 인스턴스와의 관계가 인스턴스화 될 때 확립된다. 주로 쓰이는 곳은 어댑터를 정의할 때 자주 쓰인다. 마치 어떤 클래스의 인스턴스를 감싸 마치 다른 클래스의 인스턴스처럼 보이게 하는 뷰의 역할로 사용하는 것이다.

또 다른 예제로는 Iterator를 사용할 때 비정적 중첩 클래스를 사용한다.

public class MySet<E> extends AbstractSet<E> {
	
    @Override
    public Iterator<E> iterator() {
    	return new MyIterator();
    }
    
    private class MyIterator implements Iterator<E> {
    	...
    }
}

static을 왠만하면 사용하자

정적 멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조껀 static을 붙이자.. 그 이유는 static을 생략하면 바깥 인스턴스로의 숨은 외부 참조를 가진다. 이러한 참조 때문에 특정한 상황에서 outer class을 GC가 수집하지 못하고 메모리 누수가 생길 우려도 존재한다. 이는 원인을 찾기가 어렵기 때문에 심각한 상황에 직면할 수 있다.

private static class 의 경우는 바깥의 클래스가 표현하는 클래스의 일부분을 표현할 때 쓰곤 한다.

profile
엘 프사이 콩그루

0개의 댓글