
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가 1대1로 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 |
댓글