본문 바로가기
JAVA/JAVA Note

[JAVA Note] 19. Collection

by objade 2022. 11. 16.

 

1. Set

1) 특징

- Set 크기가 있지만, index는 없음

- 값의 중복허용하지 않음

의도적으로 중복을 배제하기 위해서 Set 사용

ex) 여러 값이 전달될 때, 변수의 이름은 중복이 되면 안됨

- index를 이용해서 특정 값을 불러올 수 없음

- 정렬이라는 개념이 성립하지 않음

   → index를 이용한 반복문을 사용할 수 없음

 

import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;

public class Ex01 {
	public static void main(String[] args) {		
		Set<Integer> set = new HashSet<Integer>();
		
		set.add(10);
		set.add(20);
		set.add(30);
		set.add(10);
	
		System.out.println("set의 크기 : " + set.size());	
	
		System.out.println(set);

- 반복문을 사용해서 Set의 값을 출력하는 방법

① 향상된 for

for(Integer num : set) {		
	System.out.println(num);	
}	

// 순회 (순서대로 조회)

- set안에 들어있는 각 원소를 Integer 타입의 num에 저장해서 각 정수를 화면에 출력함

 

Iterator 사용

Iterator<Integer> it = set.iterator();
	while(it.hasNext()) {				
	// sc.hasNext();  → 다음 요소가 있으면 꺼내서 쓰는 방식
		Integer num = it.next();	// sc.next();
		System.out.println("num : " + num);
}

* Iterator : 반복자

 

2) 실습예제 - 1에서 45 사이의 자연수 중에서 중복되지 않은 값 6개를 추출하기

 

① 랜덤 객체 및 Set 준비

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;

public class Ex02 {
	public static void main(String[] args) {
		
		Set<Integer> set = new HashSet<Integer>();
		Random ran = new Random();

set의 크기가 6보다 작을때까지, 랜덤정수를 추출하여 set에 추가함

 

~ for로 만든 경우

for(int i = 0; i < 6; i++) {
	int num = ran.nextInt(45) + 1;
	System.out.println(num);
	set.add(num);
}

~ while로 만든 경우

while(set.size() < 6) {
	int num = ran.nextInt(45) + 1;
	System.out.println(num);
	set.add(num);
}

* , 이 경우에는 i의 값을 이용하지 않기 때문에, for문보다는 while문이 더 효율적임

 

set의 값을 출력함

System.out.println("set: " + set);

 * Iterator를 써서 출력한 경우

Iterator<Integer> it = set.iterator();

while(it.hasNext()) {
	Integer n = it.next(); 		
	System.out.println(n);
}

 

* Collection의 생성자에 다른 Collection을 넣어서 객체를 생성할 수 있음

- 이때, 기존 컬렉션의 구성요소가 새로운 컬렉션에 그대로 이전됨

List<Integer> list = new ArrayList<Integer>(set);
System.out.println("list : " + list);

 

* list index도 있고, sort() 함수도 있어서 정렬을 수행할 수 있음

list.sort(null);
System.out.println("list : " + list);

 

2. Map

: 배열의 index 대신, key를 이용하여 value에 접근하는 자료구조

 

1) 특징

- key는 중복될 수 없고, value는 중복될 수 있음

- arr[i] 형식으로 배열의 각 값에 접근하는 것처럼 map[key] 형식으로 접근함

- , 배열처럼 쓰지는 않고, 함수를 이용하여 값에 접근함

- key를 이용하여 value에 접근할 수 있지만, value를 이용하여 key에 접근하지는 않음

- key value 11 mapping하는 구조이기 때문에, map이라고 부름

- , key value는 양방향 mapping이 아님

~ key value (o)

~ value key (x)

import java.io.File;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

public class Ex03 {
	public static void main(String[] args) {
		
		Hashtable<String, Object> map = new Hashtable<String, Object>();
		
		map.put("apple", "사과");
		map.put("banana", "바나나");
		map.put("sc", new Scanner(System.in));
		map.put("f", new File("a.txt"));
		
		System.out.println("map의 크기 : " + map.size());

		System.out.println(map.get("apple"));	// map["apple"]
		System.out.println(map.get("banana"));	// map["banana"]
		
		System.out.println(map.get("사과"));

 

2) map을 이용하여 내부의 모든 값을 출력하는 예시

 

Set

Set<String> keySet = map.keySet();
		
for(String key : keySet) {
	Object value = map.get(key);
	System.out.printf("%s : %s\n", key, value);
}

 

Iterator

Iterator<String> it = map.keySet().iterator();

while(it.hasNext()) {
	String key = it.next();
	Object value = map.get(key);
	System.out.printf("%s : %s\n", key, value);
}

 

Enumeration

Enumeration<String> enu = map.keys();
while(enu.hasMoreElements()) {
	String key = enu.nextElement();
	Object value = map.get(key);
	System.out.printf("%s : %s\n", key, value);
}

EntrySet

for(Entry<String, Object> entry : map.entrySet()) {
	// Entry는 하나, map은 묶음
	String key = entry.getKey();
	Object value = entry.getValue();
	System.out.printf("%s : %s\n", key, value);	
}

 

3) Map 활용

- 사용자는 map에 직접 접근할 수는 없지만, 메서드를 통해서 keyword를 포함하는 요소만 묶어서 전달받을 수 있음

- map은 다수의 값을 하나로 묶어서 전달해야 할 때 사용함

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

class DataServer {
	private HashMap<String, String> map = new HashMap<String, String>();

	public DataServer() {
		map.put("apple", "사과");
		map.put("banana", "바나나");
		map.put("car", "자동차");
		map.put("desk", "책상");
		map.put("answer", "정답");
		map.put("animal", "동물");
		map.put("chicken", "치킨");
		map.put("phone", "전화기");
		map.put("coffee", "커피");
		map.put("pizza", "피자");
	}

* Entry key value를 동시에 볼 수 있음

public HashMap<String, String> selectAll(String keyword){
	Set<Entry<String, String>> entrySet = map.entrySet();
	HashMap<String, String> result = new HashMap<String, String>();
		
	for(Entry<String, String> entry : entrySet) {		
		// map의 각 구성요소를 하나의 Entry라고 할때
        
		if(entry.getKey().contains(keyword)) {			
		// key가 keyword를 포함하거나
        
		result.put(entry.getKey(), entry.getValue());
		}
        
		if(entry.getValue().contains(keyword)) {		
		// value가 keyword를 포함한다면
        
		result.put(entry.getKey(), entry.getValue());	
		// result에 추가함
			}
		}
		return result;	// 결과가 모인 result를 반환함
	}

- Map을 활용해야 하는 이유

 함수는 반드시 한개의 값만을 반환함

 어떤 라이브러리에서는 매개변수를 하나만 받도록 하기도 함.

 

- 클래스 대신 Map을 이용하기

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class Ex05 {
	public static void main(String[] args) {
		HashMap<String, Object> p1 = new HashMap<String, Object>();
		p1.put("name", "이지은");
		p1.put("age", 30);
		
		HashMap<String, Object> p2 = new HashMap<String, Object>();
		p2.put("name", "홍진호");
		p2.put("age", 41);
		
		HashMap<String, Object> p3 = new HashMap<String, Object>();
		p3.put("name", "나단비");
		p3.put("age", 5);
		
		List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
		list.add(p1);
		list.add(p2);
		list.add(p3);
		
		System.out.println(list);

~ 실습예제) List를 활용하여 아래와 같이 나오도록 출력 해보기

0번째 사람의 이름은 이지은
0번째 사람의 나이는 30
 
1번째 사람의 이름은 홍진호
1번째 사람의 나이는 41
 
2번째 사람의 이름은 나단비
2번째 사람의 나이는 5

~ 내 풀이

for(int i = 0; i < list.size(); i++) {
	String name = (String) list.get(i).get("name");
	int age = (int) list.get(i).get("age");
			
	System.out.printf("%d번째 사람의 이름은 %s\n", i, name);
	System.out.printf("%d번째 사람의 나이는 %d\n", i, age);
}

~ 강사님 풀이

for(int i = 0; i < list.size(); i++) {
	HashMap<String, Object> person = list.get(i);
		
	System.out.printf("%d번째 사람의 이름은 %s\n", i, person.get("name"));
	System.out.printf("%d번째 사람의 나이는 %s\n", i, person.get("age"));
}

~ 강사님 풀이 2

for(HashMap<String, Object> person : list) {
	System.out.printf("%d번째 사람의 이름은 %s\n", i, person.get("name"));
	System.out.printf("%d번째 사람의 나이는 %s\n", i, person.get("age"));
	i++;
	System.out.println();
}

클래스를 사용하는 경우에서 getName() getAge()를 쓰는 것과 같음

 

~ 클래스로 만든 경우)

import java.util.HashMap;

class Person {	
	private String name;
	private int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		String form = "{name=%s, age=%d}";
					
		return String.format(form, name, age);
	}
}

* private 멤버필드, public getter/setter가 있고, 기본 생성자가 생략되어 있음

* Java Beans : 데이터를 저장하는 용도로 사용할 수 있는 자바 클래스 형식

public class Ex06 {
	public static void main(String[] args) {
		
		Person p1 = new Person();
		p1.setName("이지은");
		p1.setAge(30);
		
		HashMap<String, Object> p2 = new HashMap<String, Object>();
		p2.put("name", "홍진호");
		p2.put("age", 41);
	
		System.out.println("p1 : " + p1);
		System.out.println("p2 : " + p2);
			
		System.out.println("p1의 이름은 " + p1.getName());
		System.out.println("p1의 나이는 " + p1.getAge());
		System.out.println();

		System.out.println("p2의 이름은 " + p2.get("name"));
		System.out.println("p2의 나이는 " + p2.get("age"));
	}
}

 

- 클래스의 DTO에서 getter를 사용해 값을 불러오는 것과 HashMap에서 key값을 이용해 값을 불러오는 것은 사실상 같은 원리임.

 

- 실습예제 1) 기상청 중기 예보 서비스

import java.util.HashMap;

public class Ex07 {
	public static void main(String[] args) {
		// 기상청 중기 예보 서비스	
		// String serviceKey, String pageNo, String stnId...
		
		String url = "https://apis.data.go.kr/1360000/MidFcstInfoService/getMidFcst";	// 함수
		
		String serviceKey = "K7G5hCA%2FRqnmALDK%2F7POZXDGSgTgQFRIcOqpF8HUf9rqLn17QSaJ4Q0Ox732h%2BF%2FgxuyB3bXrdEWApNVwrOtWA%3D%3D";
		String pageNo = "1";
		String numOfRows = "10";
		String dataType = "JSON";
		String stnId = "159";	
		// 108 = 전국 / 109 = 인천 / 159 = 부산, 울산, 경남
		String tmFc = "202211070600";		// yyyyMMddHHmm
		
		HashMap<String, String> param = new HashMap<String, String>();
		param.put("serviceKey", serviceKey);
		param.put("pageNo", pageNo);
		param.put("numOfRows", numOfRows);
		param.put("dataType", dataType);
		param.put("stnId", stnId);
		param.put("tmFc", tmFc);
		
		url += "?";
		
		for(String key : param.keySet()) {
			String value = param.get(key);
			url += key + "=" + value + "&";
		}

		System.out.println(url);

	}
}

- 실습예제 2) chrome을 이용한 검색 프로그램 만들기

import java.util.HashMap;
import java.util.Scanner;

class MyChromeDriver {
	
	private final String chromePath = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";
	private final Runtime rt = Runtime.getRuntime();
	
	public void open(String url) {
		run(url);
	}
	
	public void open(String url, HashMap<String, String> param) {
		url += "?";
		
		for(String key : param.keySet()) {
			String value = param.get(key);
			url += key + "=" + value + "&";
		}
		run(url);
	}
	
	private void run(String url) {
		
		try {
			rt.exec(chromePath + " " + url);  // 입력받은 url을 크롬으로 실행
//			rt.exec(chromePath);		// 크롬 실행
			
		} catch (Exception e) {}
		
	}
	
}

~ 메인 메서드

public class Ex08 {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int num;
		String query, where = "";
		
		System.out.print("검색어 입력 : ");
		query = sc.nextLine();
		
		System.out.print("어느 탭에서 검색합니까? (1. 통합 | 2. 이미지 | 3. 뉴스 | 4. 비디오) : ");
		num = Integer.parseInt(sc.nextLine());
		switch(num) {
		case 1:		where = "nexearch";	break;
		case 2:		where = "image"; 	break;
		case 3:		where = "news";		break;
		case 4:		where = "video";	break;
		
		}
		
		MyChromeDriver ob = new MyChromeDriver();
//		ob.open("www.naver.com");
		HashMap<String, String> param = new HashMap<String, String>();
		param.put("query", query);
		param.put("where", where);
		
		ob.open("search.naver.com/search.naver", param);
		
		sc.close();
	}

~ 실행 결과

 

~ 실습예제 3) ArrayList HashMap을 이용하여 필요한 데이터만 추출하기

import java.util.ArrayList;
import java.util.HashMap;

public class Ex09_Quiz {
	public static void main(String[] args) {
		
		String json = "[";
		json += "{\"name\": \"강하늘\", \"pnum\": \"010-2323-2323\"}";
		json += ",";
		json += "{\"name\": \"홍진호\", \"pnum\": \"010-2222-2222\"}";
		json += "]";
		
//		String test = "say \"Hello\" !!";
//		System.out.println(test);
				
		System.out.println(json);
		
		ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String,String>>();
		
		System.out.println("원본 : " + json);

① 필요없는 글자는 제거함

json = json.replace("\"", "");
json = json.replace(" ", "");
		
System.out.println("1) " + json);

 

② 반복문 안에서 각 객체를 구별하여 변수에 담음

while(json.contains("{")) {
	HashMap<String, String> map = new HashMap<String, String>();
			
	int begin = json.indexOf("{");
	int end = json.indexOf("}") + 1;
	String person = json.substring(begin, end);
	json = json.substring(end + 1);
			
	person = person.replace("{", "");
	person = person.replace("}", "");
			
	String name = person.split(",")[0];
	String pnum = person.split(",")[1];
			
	map.put(name.split(":")[0], name.split(":")[1]);
	map.put(pnum.split(":")[0], pnum.split(":")[1]);
						
	System.out.println();
	list.add(map);
}

③ 결과를 list로 출력함

System.out.println("결과 : " + list);
		
System.out.println(list.get(0).get("name"));
System.out.println(list.get(0).get("pnum"));
System.out.println(list.get(1).get("name"));
System.out.println(list.get(1).get("pnum"));
}

'JAVA > JAVA Note' 카테고리의 다른 글

[JAVA Note] 21. 파일 입출력  (1) 2022.11.16
[JAVA Note] 20. 예외  (0) 2022.11.16
[JAVA Note] 18. Object  (0) 2022.11.06
[JAVA Note] 17. 추상화  (0) 2022.11.06
[JAVA Note] 16. 추상클래스  (0) 2022.11.02

댓글