인프런 커뮤니티 질문&답변

갈색곰님의 프로필 이미지
갈색곰

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

ArrayList (전반전)

ArrayList 사이즈 값 초기화

작성

·

199

0

안녕하세요 나도코딩 선생님:)
따로 코드를 작성해서 연습중에 있습니다. 클래스 내에서 멤버변수로 ArrayList와 int를 지정했습니다.

하지만 ArrayList 내에 사이즈가 초기화 되지 않아서 이유가 무엇인지 질문드립니다!

 

private int heapSize; private ArrayList<PointerAddress> memory = new ArrayList<>(heapSize); // 여기 ArrayList의 사이즈가 변하지 않습니다! public void init(int heapSize) { if (validateInit(heapSize)) { int memorySize = heapSize / BYTE_LENGTH; this.heapSize = memorySize; } else { System.out.println("[ERROR] : 잘못된 값을 입력했습니다."); } }

답변 2

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?

유럽불곰 님께서 원하시는 동작은 제가 유추하기로는 다음과 같습니다.

  1. init( ) 메소드를 통해 전달받은 heapSize 로 memorySize 를 계산한다

  2. memorySize 를 인스턴스 변수인 heapSize 로 설정한다

  3. heapSize 크기에 맞게 ArrayList<PointerAddress> memory 를 초기화한다.

하지만 최초 질문주신 소스코드의 동작 순서는 이렇습니다.

private int heapSize; // 1. heapSize 인스턴스 변수 선언 (기본값인 0)
private ArrayList<PointerAddress> memory = new ArrayList<>(heapSize);
// 2. memory 리스트 초기화 (이 때 heapSize의 초기값(0)으로 초기화)

public void init(int heapSize) { // 3. init 메소드 정의
    if (validateInit(heapSize)) { // 4. validateInit 메소드 호출: heapSize 체크
        int memorySize = heapSize / BYTE_LENGTH; // 5. memorySize 계산
        this.heapSize = memorySize; // 6. heapSize 를 memorySize 로 설정
    } else { // 7. heapSize가 유효하지 않은 경우
        System.out.println("[ERROR] : 잘못된 값을 입력했습니다."); // 8. 에러 출력
    }
}

위 코드가 작성되어 있는 클래스로부터 객체가 생성되는 시점에 인스턴스 변수인 heapSize 와 memory 는 이미 만들어집니다. 이때 heapSize 를 별도로 명시하지 않으면 int 변수이므로 0 으로 초기화가 되며, memory 의 capacity 는 heapSize 에 의해 0 으로 초기화가 됩니다.

이 상태에서는 init() 메소드의 동작이 수행되지 않습니다. 그래서 계산을 하는 코드가 있어도 실제로 수행되지는 않아요.

이후에 init() 메소드가 호출이 되더라도 heapSize 값만 업데이트가 될 뿐 memory 는 새롭게 초기화(또는 크기 변경) 가 되지 않아요. 이미 초기화가 되어 있는 상태인 것이죠.

제가 유추한 동작을 원하시는 것이 맞다면 이전 답변에 드린 것처럼 memory 는 선언만 해두고 init() 메소드 내에서 memory 리스트를 초기화해주셔야 합니다. 그래야 init() 메소드가 호출될 때 heapSize 에 의해 계산이 되고 원하는 capacity 에 맞게 memory 리스트가 초기화 될 수 있답니다.

capacity 는 데이터를 담을 수 있는 처음 용량입니다. 처음에 10 으로 설정하면 10 개만큼 데이터를 담을 수 있는 용량을 확보하라는 것이죠. 반면에 size 는 현재 담겨 있는 데이터의 개수입니다. 만약 add() 를 통해 3번 데이터를 담았다면 capacity 는 그대로 10 이며, size 는 3 이 됩니다.

여기서는 capacity 와 size 의 차이보다는, 코드의 실행 순서 부분을 숙지하시는 것이 더 우선순위가 높아 보이네요 😊

감사합니다.

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?

ArrayList 를 생성하실 때 입력한 값은 리스트의 초기 용량 (capacity) 을 설정하기 위함입니다. 그리고 size() 를 통해 확인할 수 있는 크기 값은 정확히 말하면 리스트에 저장된 객체의 개수입니다. 작성하신 코드에서는 아직 리스트에 어떤 값도 추가하지 않았기 때문에 size() 를 통해 확인되는 값은 0 입니다. 가령 capacity = 10 으로 설정하면 빈 바구니 10개를 미리 준비 시켜두는 것과 같습니다. 여기에 add() 를 통해서 값을 하나씩 추가하게 되면 바구니에 하나씩 물건이 담기게 되겠죠. 그에 따라 size 도 1씩 커지게 될 겁니다. capacity 와 size 의 차이를 잘 이해해두시면 좋겠습니다 😊

작성하신 코드는 다음과 같은 형태로 변경하시면 init() 메소드가 호출되는 과정에서 메모리의 크기에 따라 리스트의 용량을 다르게 하여 초기화할 수 있게 되는 점 참고해주세요!

public class MyClass {
    private int heapSize;
    private ArrayList<PointerAddress> memory; // 여기서는 리스트를 선언만 해요

    public void init(int heapSize) {
        if (validateInit(heapSize)) {
            int memorySize = heapSize / BYTE_LENGTH;
            this.heapSize = memorySize;
            this.memory = new ArrayList<>(this.heapSize); // 여기서 초기화 해요
        } else {
            System.out.println("[ERROR] : 잘못된 값을 입력했습니다.");
        }
    }

    ...
}

감사합니다.

갈색곰님의 프로필 이미지
갈색곰
질문자

선생님 친절한 답변 감사합니다 !! (__ __)
그렇다면 멤버변수에는 new로 생성을 하면 size 초기화가 되지 않는다는 말씀으로 이해하면 되는 것일까요?

capacity 와 size 의 차이가 아직 잘 와닿지 않는 것 같습니다 ㅠㅠ!

두 메소드의 작성 차이에 따라 결과값이 달라지는 부분이 잘 와닿지 않아 capacity 와 size 의 개념을 공부하면 되는것일지 여쭈어봅니다 감사합니다 :)

class MyClass {

private int heapSize;
private
ArrayList<PointerAddress> memory; // 여기서는 리스트를 선언만 해요
rivate ArrayList<PointerAddress>memory =new ArrayList<>(heapSize);

public void
init(int heapSize) {
if (validateInit(heapSize)) {
int memorySize = heapSize / BYTE_LENGTH;
this
.heapSize = memorySize;
this
.memory = new ArrayList<>(this.heapSize); // 여기서 초기화 해요
} else {
System.out.println("[ERROR] : 잘못된 값을 입력했습니다.");
}
}

public void init(int heapSize) {
if (validateInit(heapSize)) {
int memorySize = heapSize / BYTE_LENGTH;
this
.heapSize = memorySize;
} else {
System.out.println("[ERROR] : 잘못된 값을 입력했습니다.");
}
}
}

 

갈색곰님의 프로필 이미지
갈색곰

작성한 질문수

질문하기