인프런 커뮤니티 질문&답변
Iterator (알 수 없음) 데이터 삭제 후 초기화 관련 문의
작성
·
20
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());
}답변 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 는 한 대인 상황과 같아요 😊
학습에 도움되길 바라겠습니다.
감사합니다.





