무엇이든다받아주는클래스 2 컬렉션프레임워크에저장된데이터를순차적으로처리하는방법 : Iterator 객체사용 - get() 메서드를사용하면 Iterator 를사용하지않아도원하는위치의데이터를찾을수있다. - get() 메서드는원하는데이터를찾는작업을항상처음데이터부터시작한다. - Iterator 는주소를사용해서현재탐색한위치부터새로운탐색을시작하므로, 위의 get() 메서드보다훨씬처리시 간이줄어드는장점이있다. - Iterator 는마지막탐색한위치에서부터새로운탐색을시작한다. - 위의그림에서처럼순차적으로컬렉션프레임워크에저장된데이터를처리할때는 Iterator 를사용하는것이작업 처리의소요시간면에서많은이점이있다.
항상쌍 ( 키, 값 ) 으로만데이터를저장하는클래스 의최고조상 : Map - Map을조상으로하는클래스, HashTable, HashMap, LinkedHashMap, TreeMap 등은데이터를저장할때반드시 키 와 값 의쌍으로저장한다. - Map에저장되는 키 는중복되면안되지만, 값 은중복되어도무관하다. - Map에중복된 키 가저장되면, 기존에저장된 키 와 값 은없어지고최근에저장한 키 와 값 이저장된다. HashMap hm = new HashMap(); hm.put(" 하하 ", " 호호 "); hm.put(" 하하 ", " 껄껄 "); 위와같이저장한경우, 하하 라는키는동일하지만가장마지막에 하하 라는키로저장한 껄껄 만저장된다. - Map에도제네릭을사용할수있다. 키 의자료형이 String이고 값 의자료형이 Integer인경우 HashMap<Striing, Integer> hashmap = new HashMap<String, Integer>(); - 다음은 HashMap을사용해서각학생의 이름 과 취미 를저장한예 import java.util.*; public class MapTest1 { public static void main(string[] args) { HashMap<String, String> hobby = new HashMap<String, String>(); hobby.put(" 홍길동 ", " 낚시 "); hobby.put(" 김길동 ", " 곤충관찰하기 "); hobby.put(" 최길순 ", " 머리핀모으기 "); hobby.put(" 홍길동 ", " 축구 "); // 이미 " 홍길동 " 이라는키로 " 낚시 " 가저장됬지만, 다시 " 홍길동 " 을키로 " 축구 " 가사용되었으므로, //" 홍길동 " 이라는키에는 " 축구 " 만저장된다. System.out.println(hobby); - Map에저장되어있는값을찾기위해서는 get( 키 ) 메서드를이용해서찾을수있다. String value = hobby.get(" 홍길동 ");//" 홍길동 " 의취미를찾아서 value에저장한다. //" 홍길동 " 의취미는 " 축구 " 이므로화면에 " 축구 " 가출력된다. - Map에서사용하는주요메서드들 clear() : 지정된맵에저장된모든데이터를삭제한다. 사용예 ) hobby.clear(); containskey(" 홍길동 ") : 지정된키 (" 홍길동 ") 가맵에있는지알려준다. 있으면 "true", 없으면 "false". containsvalue(" 축구 ") : 지정된값 (" 축구 ") 이맵에있는지알려준다. 있으면 "true", 없으면 "false". isempty() : 맵이비어있는지를알려준다. 있으면 "true", 없으면 "false". 도전과제1 - 모두 5명의학생이름과국어점수를맵에저장하고, 화면에서학생이름을입력하면입력한학생의국어점수가출력되는프로그램을설계하세요. 출력결과의예 ) 학생이름을입력하세요. 홍길동학생의국어점수는 : 90
도전과제2 - 모두 5명의학생이름과전화번호를맵에저장하고, 화면에서학생이름을입력하면입력한학생의전화번호가출력되는프로그램을설계하세요. 출력결과의예 ) 학생이름을입력하세요. 홍길동학생의전화번호는 : 010-7643-8926 맵의활용 - 맵을이용해서사용자계정 ( 중복되지않는값 ) 과사용자암호를검사하는예 import java.util.*; public class Idcheck { public static void main(string[] args) { HashMap userids = new HashMap(); userids.put("tiger", "1212");// 사용자계정과암호를저장한다. userids.put("lion", "1122"); userids.put("dragon", "1234"); Scanner scan = new Scanner(System.in); while(true) { System.out.println(" 사용자계정과암호를입력하세요."); System.out.print(" 사용자계정 : "); String id = scan.nextline();// 화면에서계정을입력받아서 id에저장한다. System.out.print(" 암호 : "); String password = scan.nextline();// 화면에서암호를입력받아 password에저장한다. System.out.println(); if(!userids.containskey(id)) {// 사용자계정이없으면, System.out.println(" 입력하신계정이없습니다."); continue;// 반복계속 else { String value = (String)userids.get(id);// 사용자계정의암호를찾는다. if(!value.equals(password)) {// 암호가일치하지않으면, System.out.println(" 암호가일치하지않습니다."); else { System.out.println(" 사용자계정과암호가모두일치합니다!"); break;// 반복종료
맵의활용 - 맵에저장되어있는모든데이터들의순차처리도다른컬렉션프레임워크와마찬가지로 Iterator 객체를이용한다. - 하지만, 맵은다른컬렉션프레임워크와는다르게 키 와 값 의쌍으로데이터를가지고있으므로맵에서직접 Iterator를얻을수는없다. 즉, 맵에는 Iterator를생성하는 iterator() 메서드가존재하지않는다. 즉, HashTable ht = new HashTable(); Iterator it = ht.iterator();// 이렇게할수없다. - 맵에서 Iterator를사용하는방법 1 맵에서 Iterator를생성할수없으므로, Iterator를생성할수있는다른컬렉션프레임워크로변경한다. 맵에서 키 는중복된값을가질수없으므로, Set 형태의컬렉션프레임워크로변경한다. Map을 Set으로변경하는작업은 entryset() 메서드를사용한다. entryset() 메서드는 Set 내에 Map을저장한형태의 Set으로변경한다. HashMap hm = new HashMap(); hm.put( 어쩌구, 100); hm.put( 저쩌구, 200); hm.put( 그쩌구, 300); Set set = hm.entryset(); // 이메서드에의해서위그림처럼 Map에서 Set을생성한다. 2 Set으로변경되었으므로 Iterator를생성할수있다. 그런데, Iterator의대상이되는것은 Entry 이며 Entry 에는 키 와 값 이저장되어있다. Iterator it = set.iterator();// 3 위의과정에서얻은 Iterator에서 Entry를읽어서 Entry에저장되어있는 키 와 값 을각각 getkey() 메서드와 getvalue() 메서드를이용해서읽어온다. while(it.hasnext()) { Map.Entry me = (Map.Entry) it.next(); System.out.println( 키 = + me.getkey()); System.out.println( 값 = + me.getvalue());
- 맵의키와값을각각별도로순차처리하는경우 맵에서키만을별도로끄집어내어 List와 Set의부모객체인 Collection 형태로저장하고, Iterator 객체를얻어와서순차적으로처리한다. Collection colkey = hm.keyset();// 맵에서키만추출해서 colkey에저장한다. Iterator itkey = colkey.iterator(); while(itkey.hasnext()) { System.out.println(itKey.next());// 키값을화면에출력한다. 키값이문자열로바뀌어출력된다. // 이때, tostring() 메서드가자동으로호출된다. 맵에서값만을별도로끄집어내어 List와 Set의부모객체인 Collection 형태로저장하고, Iterator 객체를얻어와서순차적으로처리한다. Collection valkey = hm.values();// 맵에서값만을추출해서 valkey에저장한다. Iterator itvalue = valkey.iterator(); while(itvalue.hasnext()) { System.out.println(ktValue.next());// 키값을화면에출력한다. 키값이문자열로바뀌어출력된다. // 이때, tostring() 메서드가자동으로호출된다. - 맵에저장된데이터를순차처리한예 : 학생들의총점과평균을출력하는프로그램 import java.util.*; public class MapTest1 { public static void main(string[] args) { HashMap map = new HashMap(); map.put(" 홍길동 ", new Integer(95));// 학생이름과점수를맵에저장한다. map.put(" 김길동 ", 85); map.put(" 이길동 ", 75); Set set = map.entryset();// 맵에는 Iterator 가없으므로 Iterator 가있는 Set 을가지고온다. Iterator it = set.iterator(); while(it.hasnext()) {// 맵에저장된모든학생의이름과점수를출력한다. Map.Entry key = (Map.Entry) it.next(); System.out.println(" 이름 : " + key.getkey() + ", 점수 : " + key.getvalue()); Collection name = map.keyset();// 맵의키만별도로순차처리한다. Iterator itname = name.iterator();// 순차처리를위해 Iterator를얻어온다. while(itname.hasnext()) {// 모든학생의이름을출력한다. System.out.print(itName.next()+ " ");
System.out.println(); Collection score = map.values();// 맵의값만을별도로순차처리한다. Iterator itscore = score.iterator();// 순차처리를위해 Iterator를얻어온다. int totalscore = 0; while(itscore.hasnext()) {// 모든학생들의점수총합을구한다. totalscore = totalscore + (Integer)itScore.next(); System.out.println(" 총점 = " + totalscore); 도전과제 - 다음학생의이름과신장을맵에입력하고모든학생의이름, 신장및모든신장의합과신장의평균을구하는프 로그램을설계하세요. 이름 ( 키 ) 신장 ( 값 ) 이동욱 170.1 김치곤 178.6 김형욱 180.3 오미경 160.8 심정연 158.7 출력결과의예 ) 이름 : 이동욱신장 : 170.1 이름 : 김치곤신장 : 178.6 이름 : 김형욱신장 : 180.3 이름 : 오미경신장 : 160.8 이름 : 심정연신장 : 158.7 학생명단 : 이동욱김치곤김형욱오미경심정연신장의합 : 848.5 평균신장 : 169.7