inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Iterator (전반전)

Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의

70

mibhf6919

작성한 질문수 1

0

안녕하세요,

하기 코드 중에서 it는 list.iterator의 return값을 담은, 또 다른 Iterator로 판단됩니다.

저는 그 다른 it를 while 돌려서 (알 수 없음)을 모두 삭제했습니다.(첫 번째 while문)

그러고나서 다시 it = list.iterator 코드를 입력하면, 사실상 앞에서 (알 수 없음)을 삭제했던 작업은 다 날아가고 새로운 Iterator return값으로 덮어 씌워지고, 이후 두 번째 while문에서는 (알 수 없음)도 모두 출력되어야 하는 상황으로 이해되는데

그렇지 않고 강사님께서 의도하신대로 정상 출력되더라고요. 혹시 사유가 어떻게 되나요?

자바에서 x = A 라는 수식은 x에 A값을 집어넣는 게 아닌가요? x는 A의 메모리 주소를 가리키고 x를 수정하면 A 내부 값이 함께 수정되는건가요??

// (알 수 없음) 데이터 삭제
        it = list.iterator();
        while (it.hasNext()) {
            String s = it.next();
            if (s.contains("(알 수 없음)")) {
                it.remove();
            }
        }

        // 삭제 정리된 데이터 재순회
        it = list.iterator();   // 데이터 삭제 간 맨 마지막으로 가 있는 위치 초기화
        while (it.hasNext()) {
            System.out.println(it.next());
        }

java 객체지향

답변 1

0

나도코딩

안녕하세요?

결론부터 말씀드리면, 질문자분께서 말씀하신 "x는 A의 메모리 주소를 가리키고, x를 통해 수정하면 실제 객체인 A 내부 값이 바뀐다"는 올바른 설명입니다.

왜 코드가 그렇게 동작하는지, 세부 원리를 하나씩 살펴볼게요.

1. 먼저 it.remove()는 리스트 자체를 수정합니다. 가장 중요한 포인트는 it.remove() 메소드의 역할인데요. Iterator는 단순히 리스트를 '읽기'만 하는 도구가 아니라, 리스트와 연결되어 그 내부 데이터를 직접 조작할 수 있는 통로입니다. 그래서 it.remove()를 호출하면, Iterator는 자신이 현재 가리키고 있는 원소를 list라는 원본 데이터 저장소에서 실제로 삭제한답니다. 즉, 첫 번째 while 문이 끝나면 메모리상에 있는 list 객체 자체가 이미 수정된 상태가 되는 거죠.

2. 첫 번째 while문이 끝나고 다시 it = list.iterator()를 실행하는 코드는 다음과 같은 의미를 갖습니다.

1) 초기화

Iterator는 한 번 끝까지 가면 다시 앞으로 돌아올 수 없습니다. 그래서 처음부터 다시 읽기 위해 새로운 "커서(포인터)"를 리스트의 맨 앞에 놓는 작업입니다.

2) 새로운 객체, 같은 대상

코드를 실행하면 새로운 Iterator 객체가 생성되지만, 이 녀석이 바라보는 대상은 여전히 아까 삭제 작업이 끝난 그 list입니다. 따라서 이미 list 내부에서 "(알 수 없음)"이 제거되었기 때문에, 새로 만든 it로 리스트를 훑어도 삭제된 데이터는 보이지 않는 거죠.


마지막으로, x = A 라는 수식은 A 라는 변수(상자) 안에 있는 값을 x 에 넣는 것은 맞습니다. 하지만 그 상자 안에 들어있는 내용물이 무엇이냐에 따라 결과가 달라져요. 기본 타입(Primitive Type)과 참조 타입(Reference Type)의 차이인데요.

기본 타입인 int, double, boolean 과 같은 변수들은 상자 안에 실제 데이터 값을 직접 가지고 있으며 x = A 라고 하면 A 가 가진 실제 값이 x로 복사됩니다.

반면에 ArrayList, Iterator 등 기본 타입을 제외한 나머지는 모두 참조 타입으로 이들은 상자 안의 데이터가 아니라 데이터가 저장된 메모리 주소를 가지고 있습니다. 그래서 x = A 라고 하면 A가 가진 메모리 주소가 x로 복사됩니다. 이제 x와 A 는 같은 메모리 주소(같은 객체)를 가리키게 되는거죠. 리모컨이 2개인데, 조종하는 TV 는 한 대인 상황과 같아요 😊

학습에 도움되길 바라겠습니다.

감사합니다.

0

mibhf6919

아아 이해되네요... 감사합니다.

첫 제가 선언한 it이 문제가 아니라 애초에 선언된 list 자체가 it.remove에서 수정이 되었고

두 번째 선언된 it은 새로운 객체가 맞지만, 문제는 그 객체를 만든 list가 이미 수정(remove)가 반영되어있는거군요.

도움이 많이 되었습니다. 감사합니다.

자바를 처음 배울 때 이런 고민이 드는 게 정상일까요?

0

133

2

static이 뭐였는지 기억이 안나요 ㅜㅜ

0

110

2

사고력 키우는 법이 어떤게 있나요?

0

88

2

getter setter

0

100

2

섹션9. 66 메소드 오버로딩 시 질문이 있습니다.

0

77

1

안녕하세요 갑자기 프로그램 에러가 떠서 안되네요

0

75

2

변수 이름짓는법

0

114

2

intelli J 실행오류

0

114

2

혹시 이건 수학적 사고가 부족한 걸까요?

0

152

2

영상이 재생이 안됩니다.

0

165

3

이중 반복문 (후반전) 오른쪽으로 치우친 별 쌓기에 질문이 있습니다.

0

114

2

응용이 어렵습니다.

0

203

2

IntelliJ가 보이지 않습니다.

0

182

3

JDK 버전 문의

0

128

2

BlackBox 파일 내에서 메소드 정의

0

136

1

동기화

0

120

2

Iterator 문의

0

101

1

코드 순서 문의

0

139

1

클래스 메소드

0

148

2

Quiz_05 관련 질문드립니다 !

0

117

2

다운로드가 안됩니다

0

165

2

다형성

0

118

2

HashMap

0

80

2

재생이 안됩니다ㅠㅠ

0

121

2