Map을 만들고 넣었어 거기까진 이해해.
근데 iterator를 쓰기 위해서 객체를 만들고 거기에 map을 Set으로 만들고 iterator로 만들어.
map이 Set으로 되는거 맞아? list set이 collection인데 map은 아니라서 iterator를 못쓰는건 알겠는데 iterator 역할이 뭐야???
추가로 hasNext에서 빠져나오는 순서는 뭐야? while문에 나오는대로 입력해서 출력하는 결과는 무작위인것 같던데 132 순서로 계속 나오고
이 댓글은 게시물 작성자가 삭제하였습니다.
제발 컴퓨터과학을 공부하자
오우 쉣 삭제했다
ㅋㅋㅋㅋㅋ 뜬금없이 왜 삭제했나 했네 실수였냐
길어질것같으니까 별도의 글로 설명 써준다
웅쓰 항시 대기 중
아 별도의 글로 쓰려다가 귀찮아서 말았다 그냥 댓글로 달게
keySet이나 entrySet은 Map을 Set으로 만든다기보다는 Map을 Set으로서 볼 수 있는 옵션을 제공 (실제로 Set을 따로 만드는 게 아니라)한다고 보는 게 맞을 것임. 이런걸 일반적인 용어로 "뷰(view, 관점)"라고 하는데, 어떤 저장된 구조를 실제와는 다른 특정한 구조로 볼 수 있게 해주는 것임. 여기서 keySet은 Map을 key들의 Set으로 볼 수 있게 해주는 뷰이고, entrySet은 Map을 key와 value의 짝들의 Set으로 볼 수 있게 해주는 뷰일 듯 (Java는 모르지만 이름으로 추측할 때).
이게 왜 필요하냐면, Map은 값이 2개씩 (key와 value) 짝지어서 들어있다는 점에서 본질적으로 List 같은 다른 자료구조와는 다르게 생겼기 때문임. Map의 사용자는 key만 필요할 수도 있고 key와 value가 둘 다 필요할 수도 있기 때문에 각각의 경우를 위해 keySet과 entrySet이라는 별도의 사용 방법을 제공함으로써 사용자가 원하는 대로 사용할 수 있을뿐더러, 이런 식으로 설계하면 Map을 고려하지 않고 설계된 함수에도 Map을 Set인 척 해서 넘길 수 있게 되기 때문에 Map을 사용할 수 있는 범위가 훨씬 넓어지게 되어 효율적인 설계임.
참고로 그렇다면 왜 value만 볼 수 있게 해주는 옵션은 없을까? 왜냐하면 key를 알면 value를 알 수 있지만 value를 안다고 해서 key를 알 수는 없기 때문이다. 이건 한영사전과 영한사전이 따로 있는 이유랑 비슷한데, 한영사전에서 "배"를 찾으려면 ㅂ 아래로 가면 되지만 영한사전에서 "배"를 찾으려면 모든 페이지를 다 넘겨봐야함
응 key를 얻은 다음에 map에 get에 매개변수로 key를 넣어서 value를 끌어내잖아
hasNext를 통해 순회(traverse, 자료구조에 있는 모든 자료를 순서대로 한번씩 확인하는 일)할 때의 순서가 무작위해 보이는 것도 종이 사전을 생각하면 간단하다. 종이 사전이 사람이 빠르게 찾을 수 있도록 알파벳순, 가나다순으로 되어있는 것처럼 Map은 내부적으로 컴퓨터가 빠르게 검색할 수 있는 특정한 규칙을 유지하도록 만들어져 있기 때문에, 그 규칙에 따른 순서가 나오는것임. 이 규칙은 사람이 바로 이해하기는 어렵지만 컴퓨터 입장에서는 아무튼 규칙이 있기 때문에 같은 환경 (같은 언어 버전)에서 실행하면 매번 일정하게 나온다.
이게 귀찮으면 entrySet을 하면 되는거지?
와 그래서 0번째 2번째 1번째로 나온거구나
반복자(iterator)가 왜 존재하냐면 일단 Map은 위에 설명한것처럼 내부적으로 컴퓨터가 빠르게 검색할 수 있는 특정한 구조로 되어있기 때문에, 거기서 "다음 페이지를 넘기는 동작"이 단순하지 않고 복잡한 여러 과정으로 이루어져 있기 때문임. 이것을 Java로 프로그래밍하는 사람이 이해하거나 깊게 생각하지 않고도 Map을 자유롭게 사용할 수 있게 하기 위해 iterator라는 것을 만들어서, 이러한 복잡한 과정을 iterator가 자동으로 처리하도록 해둠.
Map, List, ArrayList (맞나? Java는 잘 모름) 등등 다양한 컬렉션들은 전부 내부구조가 다르고, ArrayList 같은 것들은 훨씬 간단하지만, 간단한 구조든 복잡한 구조든 간에 똑같이 iterator를 이용해서 처리할 수 있게 만듦으로써, 개발자가 각각의 컬렉션에 대해 전부 따로 공부하지 않더라도 그냥 iterator만 알면 모든 컬렉션을 순회할 수 있도록 설계되어 있음
iterator를 사용하는건 성능 측면에서도 의미가 있는데, 자료구조는 내부 구조에 따라서 각각 "단방향 순차적 접근 가능" (앞에서 뒤로 순서대로만 효율적으로 접근할 수 있는 애들), "양방향 순차적 접근 가능" (앞에서 뒤 또는 뒤에서 앞으로 순서대로만 효율적으로 접근할 수 있는 애들), "무작위 접근 가능" (몇번째인지 지정만 하면 막 접근할 수 있는 애들)으로 나뉘는데, 무작위 접근가능이면 당연히 순차적 접근을 해도 문제가 없기 때문에, 모든 데이터를 한번씩 돌고 싶다면 단방향 순차적 접근이 어느 자료구조에도 사용할 수 있어서 안전하다고 할수있는데
iterator와 next를 사용하면 앞에서 뒤로 순차적으로 접근할 때 (순방향 순차적 접근)에 맞춰서 만들어진 동작을 해주기 때문에 효율적으로 데이터에 접근할 수가 있다
어떻게 지식이 교과서처럼 작은 정보-큰 정보 순으로 나오는거지? 하나 알려주면 그 다음거에 이해하기 좋게 말해주네. 강사야??
많이 설명해봤으니까 ㅋㅋㅋ 대학생때 동기, 선후배들 상대로 전공과목 과외하면서 먹고살았다
오늘 알려준 지식 다 내껄로 만들게 진짜 땡큐
꾸준히 할껀데 컴퓨터 과학 공부방향좀 잡아주겠어??
나는 교재 보고 공부한 게 아니라서 잘 몰라 갤에 물어보는게 나을듯