HihoBookStudy / EffectiveJava

이펙티브 자바 북스터디입니다.
1 stars 0 forks source link

[아이템 7] 변수의 범위를 최소가 되게 정의하는 것 #10

Closed Limgayoung closed 3 months ago

Limgayoung commented 3 months ago

38페이지를 보면 변수의 범위를 최소가 되게 정의했다면 참조를 담은 변수를 유효 범위 밖으로 밀어내는 것이 자연스럽게 이뤄진다고 나와 있습니다. 코드 7-1의 스택은 메모리를 직접 관리하기 때문에 null 처리로만 참조를 해제할 수 있는 것 같은데, 스택의 객체가 비활성 영역이 되었다는 것을 자동으로 카비지 컬렉터에 알릴 수 있는 방법은 없나요?

ForteEscape commented 3 months ago

Q.

코드 7-1의 스택은 메모리를 직접 관리하기 때문에 null 처리로만 참조를 해제할 수 있는 것 같은데, 스택의 객체가 비활성 영역이 되었다는 것을 자동으로 가비지 컬렉터에 알릴 수 있는 방법은 없나요?

A.

없습니다.

GC의 관점에서는 Object[] elements = new Object[MAX_CAPACITY]로 객체 배열이 생성되면 객체 배열 전체를 활성화된 객체로 인지합니다. 이를 이해하기 위해서는 GC가 어떻게 동작하는지 볼 필요가 있습니다.

public class Stack {
    private Object[] element;
    private static final int DEFAULT_CAPACITY = 16;
    private int size = 0;

    public Object pop() {
        if(size == 0) {
            throw new EmptyStackException();
        }

        Object result = elements[--size];

        Object[] temp = new Object[size];
        for(int i = 0; i < size; i++) {
            temp[i] = createElement(element[i]); // element[i]의 내부 값들을 이용하여 새로운 객체 생성 및 반환
        }
        element = temp;

        return result;
    }
}