컬렉셔프레임워크의 foreach문에 대한 질문입니다.
다크
import java.util.TreeSet;import java.util.Iterator;import java.util.Comparator;
class StrLenComparator implements ComparatorString{ public int compare(String str1, String str2) { if(str1.length() str2.length()) { return 1; } else if( str1.length() str2.length()) { return -1; } else return 0; }}
public class IntroComparator {
/** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub
TreeSetString tSet = new TreeSetString(new StrLenComparator()); tSet.add(Orange); tSet.add(Apple); tSet.add(Dog); tSet.add(Individual); IteratorString itr = tSet.iterator(); while(itr.hasNext()) System.out.println(itr.next()); for(String e : tSet) System.out.println(e); }
}
위 while과 foreach문은 같은 기능입니다.
질문 내용:위의while문은 순환자 iterator을 이용하여 treeset 컬랙션 데이터를 불러옵니다. 이 while문의 hasnext()나 next()이 동작하는순서 같은것은 알겠습니다.(iterator부분은 대강 이해가 갑니다.)
하지만 아래의 foreach문의 동작순서나 방법같은게 이해가 되지 않습니다. 단순히 배열일때는 foreach문이 이해가 됬는데이렇게 컬랙션프레임워크에서 사용되니 이해가 잘 안되네요.
Iterator은 기본적으로 오름차순으로 데이터에 접근하기때문에 위 main에서 저장된 문자열은 짧은 순으로 출력됩니다.dogappleorangeindividual이런식으로여
근데 아래 foreach문도 위와 같은 결과를 출력합니다.여기서 완전 이해가 되지 않습니다. 어째서 foreach문도 오름차순으로 출력이 되는거죠?treeSet에서도 기본적으로 오름차순으로 데이터를 저장한다는 말인가요?Comparator인터페이스로 단순히 저장되는 String값의 길고 짧은것 만을 기준으로 세웠지 오름차순, 내림차순 등 딱시 어느 한 방법으로 저장하라는 구문은 정의 되지 않았습니다.
책에서 설명은treeSet에서 오름차순, 내림차순이든 어떤식으로 데이터를 저장하는 것은 중요하지 않다.단지 정렬에 대한 기준이 명확해야 하며, 그 기준이 존재한다면 iterator를 이용하여 기준에 따라 오름차순, 내림차순으로데이터를 참조하면 된다.이렇게 설명되어 있습니다.
위 책 설명에서treeSet에서 오름차순, 내림차순이든 어떤식으로 데이터를 저장하는 것은 중요하지 않다.라는 부분이 있습니다. 이 말인즉 프로그래머는 treeSet에 데이터가 어떤식(오름,내림)으로 저장되는 지 알필요가 없다. 라고 하지만 분명이 어떤식으로든 데이터가 저장이 되긴 한다는 말인거 같습니다.
그렇다면 foreach문에서 출력된 오름차순 결과는 treeSet에서 자체적으로 오름차순으로 저장한 것인가요?아니면 foreach문이 오름차순으로 데이터를 가져온 것인가요?
그리고 for(String e : tSet) 이 부분에서 foreach문이 treeSet에 저장된 String형태의 데이터를 스스로 찾아서참조한 건가요? 여기서 foreach문의 동작방식을 좀 자세히 알고싶습니다.
-
더글러스
Set안에는 Map을 가지고 있습니다. Map이라는 자료구조를 찾아보시면 도움이 될거에요.
순서는 없습니다.단지 꺼낼때 일정한 규칙으로 꺼냅니다.. 그 규칙이 comparator 이고요 -
네코
흐음 그렇다면 저장될때 어떤 기준을 가지고 저장되며, iterator뿐만 아니라 foreach문도 그 기준을 받아들여서 데이터를 참조한다고 볼수 있겠네요. 답변감사합니다.
-
리카
foreach와 정렬과의 관계는 없습니다. iterator도 마찬가지고요. 또한 Map과 Set은 배열과 다르게 어떠한 순서를 가지고 저장하기 보단 정렬된 순서로 꺼낼 수 있는 인터페이스를 제공한다고 보는게 맞는것 같습니다.