[JAVA 기초] 여기서 가비지 컬렉션이 발생하는 이유가 뭔가요?

조회수 1019회
int[ ] n = new int [10];

for(int i=0;  i<10; i++) {

    Scanner s = new Scanner(System.in);
    n[i] = s.nextInt();
    }

이 코드에서 for 문이 10번 반복되는 동안 new Scanner(System.in); 으로 할당받은 9개의 객체들이 가비지가 된다는데

10개의 배열 원소(주소)에 객체를 하나씩 넣는건데 왜 가비지가 되는건가요?

가비지가 되면 n[0] ~n[8] 까지는 아무 값도 없는건가요?

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기
    int[] n = new int [10];
    
    for(int i=0;  i<10; i++) {
    
        Scanner s = new Scanner(System.in);
        n[i] = s.nextInt();
    }
    

    코드를 잘 보시기 바랍니다.

    n은 int 배열입니다. 즉 int 값이 저장됩니다.

    for 반복문의 s 객체는 int 값만 얻는 용도이고 그렇게 얻은 int값은 배열에 저장됩니다. s객체의 scope 은 for 반복문안에 한정됩니다.

    for 가 반복하면 다시 s는 다른 새로운 객체가 할당됩니다. 그전의 객체 s는 접근할 수 없는 객체가 되고 가비지 대상이 됩니다.

    즉 배열의 값들과 Scanner 객체는 무관합니다. int 값은 배열에 복사되어 저장된 것이고 Scanner 객체는 gc 대상이되고 정리 됩니다.

    c/c++ 같은 gc가 없는 언어에서는 위와 같은 코드는 메모리 leak 되는 것이지만(s를 delete 안했으므로) 자바는 gc가 제공되므로 무척 편리한 겁니다.

    • int값을 가진 배열이 아니라 scanner 객체에 문제가 있던거군요 감사합니다! HchanGwon 2018.12.15 17:18

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)