day 18 예제 및 문제 - Iterator<E> 반복자, HaspMap Class …
📖 Iterator<E> 반복자 예제 (1)
Iterator 사용법과 hasNext(), next() 메소드 어떤기능을 가지고 있는지 알아보기
package day18;
import java.util.Iterator;
import java.util.Vector;
public class IterEx01 {
public static void main(String[] args) {
Vector<Integer> v = new Vector<Integer>(); //Vector<E> Class로 객체 생성
// 반복자를 이용해서 모든 데이터 접근
Iterator<Integer> it = v.iterator(); // 접근해서 반복자 얻어온것
while(it.hasNext()) { // 요소가 끝날때까지 반복
int n = it.next(); // 요소 꺼내기, 리턴타입이 Integer라서 int 변수에 담아주었다. 언박싱
System.out.println(n);
}
}
}
🔈 Interator은 interface로 접근하여 반복자를 얻어와서 그안에 있는 메소드들을 사용할 수 있다.
hasNext() 메소드는 접근할 다음 요소가 있으면 ture를 리턴하고 없을시 false를 리턴해준다.
next() 메소드는 다음 요소를 꺼내준다.
이해하기 쉽게 그림으로 설명하자면 아래와 같다
📖 Iterator 반복자 예제 (2)
package day18;
import java.util.ArrayList;
import java.util.Iterator;
public class IterEx02 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>(); // 제네릭 Integer 타입의 ArrayList 객체 생성
list.add(10); // 요소 넣기
list.add(100);
list.add(1000);
list.add(10000);
Iterator<Integer> it = list.iterator(); // Iterator 접근하여 list의 반복자 얻기
while(it.hasNext()) { list에 들어있는 모든 요소 꺼내기
int n = it.next();
System.out.println(n);
}
// 반복자는 한번쓰고 버리기 때문에
it = list.iterator(); // 반복자 다시 얻어서 사용 해야함
// 모든 정수를 더한 합 > 반복자 사용
int tot = 0;
while(it.hasNext()){
tot += it.next();
}
System.out.println("총합: " + tot);
}
}
🖥️ console 출력 화면
🔈 반복자는 한번 실행하고 사라지기 때문에 또 사용하려면 반복자를 새로 얻어서 사용해야 한다.
📖 HashMap<K, V> 예제 (1)
package day18;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class HashEx01 {
public static void main(String[] args) {
// key, value의 제네릭 타입 설정하여 참조변수h에 객체 생성하기
HashMap<String, String> h = new HashMap<String, String>();
h.put("apple", "사과"); // Key, value 넣어주기
h.put("strawberry", "딸기");
h.put("watermelon", "수박");
h.put("peach", "복숭아");
System.out.println(h); // 저장위치가 순차적으로 되지 않고 마구잡이로 저장됨
h.put("apple", "대구사과"); // 이미 들어있는 key면 value 덮어쓰기 됨
System.out.println(h); // 사과 없어지고 대구사과 출력된걸 볼 수 있음
String val = h.get("apple"); // get(K) key에 해당하는 value의 값 꺼내줌
System.out.println(val);
String val2 = h.get("melon");
System.out.println(val2);
String str = h.remove("peach"); // 삭제하면서 value 한번 리턴해줌
System.out.println(str);
System.out.println(h.size()); // h의 [K-V] 수를 반환, 저장되어 있는 값의 수!
Set<String> keys = h.keySet(); // hashmap의 모든 key들만 꺼내옴
Iterator<String> it = keys.iterator(); // key들의 반복자 얻기
while(it.hasNext()) { // key가 없을때까지 반복
String key = it.next(); // key 하나 꺼내짐
String value = h.get(key); // 꺼내진 key로 해쉬맵에서 value 꺼내기
System.out.println("{" + key +"," + value + "}");
}
}
}
🖥️ console 출력 화면
🔈 HashMap서 Key와 value는 한세트라 할 수 있다. (매핑되어있음)
배열에 인덱스 번호가 있듯이 HaspMap에서의 인덱스 번호는 key라 할 수 있다.
key, value 제네릭 타입은 어떤것이든지 올 수 있으며 기본형으로 객체로 변환하여 넣으면 됩니다
📘 HashMap<K, V> 문제 (1)
// 영한 사전 만들기 : HashMap을 이용하여 10개의 단어를 영어, 한글의 쌍으로 저장
// 영어로 한글을 검색하는 프로그램을 만들어보세요.
// 단, exit가 입력되면 프로그램 종료
package note;
import java.util.HashMap;
import java.util.Scanner;
public class Practic {
public static void main(String[] args) {
HashMap<String, String> dict = new HashMap<String, String>();
dict.put("pretty", "이쁜"); // K,V 넣기
dict.put("cute", "귀여운");
dict.put("handsome", "멋진");
dict.put("implements", "구현");
dict.put("interface", "인터페이스");
dict.put("extends", "확장하다");
dict.put("abstract", "추상적인");
dict.put("dandico", "천재");
dict.put("love", "사랑");
dict.put("star", "별");
Scanner sc = new Scanner(System.in);
System.out.println("** dandico 사전 **");
while(true) {
System.out.println("영어단어 입력>>");
String str = sc.nextLine();
if(str.equals("exit")) { // exit가 입력될시 break 키워드로 while문 종료
System.out.println("시스템 종료");
break;
}
if(dict.containsKey(str) == true) { // 입력받은 단어가 저장되어 있는 k라면 실행
String kor = dict.get(str); // value 꺼내서
System.out.println(kor); // 출력하기
} else { // dict 맵에 포함되어 있지 않으면
System.out.println("사전에 등록되어 있지 않습니다."); // 메세지 띄우기
}
}
}
}
🖥️ console 출력 화면
🔈 containsKey() 메소드 : 맵에서 인자로 보낸 key가 있으면 true 없으면 false를 반환
📘 HashMap<K, V> 문제 (2)
// HaspMap을 이용하여 학생 이름과 자바 점수를 기록하는 관리 프로그램을 작성하세요
// 아래 프로그램 메뉴에서 각 번호로 서비스를 선택하고
// 6번 종료를 입력받으면 프로그램 종료
* ** 자바 성적 관리 프로그램 **
* 1. 전체조회
* 2. 등록
* 3. 수정 // 학생이름 입력받기
* 4. 삭제 // 학생이름 입력받기
* 5. 전체 평균
* 6. 프로그램 종료
package day18;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class HashEx03 {
private HashMap<String, Integer> grade; // k,v 제네릭 타입 넣어 grade 맵 선언
private Scanner sc; // Scanner sc 선언
public HashEx03(){ // 생성자에서 위에 선언한것들 객체 생성하여 초기화
grade = new HashMap<String, Integer>();
sc = new Scanner(System.in);
}
void printAll() { // 1.전체 조회
Set<String> keys = grade.keySet(); // 모든 key 꺼내오기
Iterator<String> it = keys.iterator(); // key들의 반복자 얻기
while(it.hasNext()) { // 전체 출력
String key = it.next(); // key 하나 꺼내서
int value = grade.get(key); // 꺼낸 key로 맵에서 value 꺼내기
System.out.println(key + ": " + value + "점"); // 출력
}
}
void insertData() { // 2.등록
System.out.println("2.등록");
System.out.println("이름 입력>>");
String name = sc.nextLine();
Set<String> keys = grade.keySet(); // 모든 key 꺼내오기 리턴값 Set<E>
if(keys.contains(name)) { // keys에 입력받은 문자열과 동일한 키가 존재할시
System.out.println("이미 존재하는 학생입니다. 이름을 다시 확인해주세요.");
return; // 메소드 종료
}else {
System.out.println("점수 입력>>");
int score = Integer.parseInt(sc.nextLine());
grade.put(name, score); // 입력받은 name과 score K-V에 넣기
System.out.println("저장완료!");
}
}
void modifyData() { // 3.수정
System.out.println("3. 수정");
System.out.println("수정할 학생 이름 입력>>");
String name = sc.nextLine();
Set<String> keys = grade.keySet(); // 전체 key 꺼내오기
if(keys.contains(name)) { // 수정할 학생의 이름이 존재한다
System.out.println("점수 입력>>");
int score = Integer.parseInt(sc.nextLine());
grade.put(name, score); // 이미 저장되어 있는 k-v여서 score로 value가 덮어쓰여진다
System.out.println("수정완료!");
}else {
System.out.println("존재하지 않는 학생입니다.");
}
}
void deleteData() { // 4.삭제
System.out.println("4. 삭제");
System.out.println("이름 입력>>");
String name = sc.nextLine();
Set<String> keys = grade.keySet();
if(keys.contains(name)) { // 수정할 학생의 이름이 존재한다
grade.remove(name);
System.out.println("삭제완료!");
}else {
System.out.println("존재하지 않는 학생입니다.");
}
}
void showAvg() { // 5.전체평균
System.out.println("5. 전체 평균");
Collection<Integer> coll = grade.values();
Iterator<Integer> it = coll.iterator();
int sum = 0;
while(it.hasNext()) {
int val = it.next();
sum += val;
}
/* 다른풀이
int tot = 0;
Set<String> keys = grade.keySet();
Iterator<String> it = keys.iterator();
while(it.hasNext()) {
String key = it.next();
tot += grade.get(key);
}
*/
System.out.println("전체 평균: " + ((double)sum/grade.size()));
}
public static void main(String[] args) {
HashEx03 prg = new HashEx03(); // 인스턴스 메소드를 사용해야하기 때문에 new로 객체생성
while(true) {
System.out.println("==============================");
System.out.println("** 자바 성적 관리 프로그램 **");
System.out.println("1. 전체조회");
System.out.println("2. 등록");
System.out.println("3. 수정");
System.out.println("4. 삭제");
System.out.println("5. 전체 평균");
System.out.println("6. 프로그램 종료");
System.out.println("==============================");
System.out.println("원하는 서비스 번호 입력>>");
int sel = Integer.parseInt(prg.sc.nextLine());
if(sel == 1) {
prg.printAll();
}else if(sel == 2) {
prg.insertData();
}else if(sel == 3) {
prg.modifyData();
}else if(sel == 4) {
prg.deleteData();
}else if(sel == 5) {
prg.showAvg();
}else if(sel == 6) {
System.out.println("프로그램 종료");
break; // while문 종료
}else {
System.out.println("잘못된 입력, 다시 시도해주세요.");
}
}
}
}
🖥️ console 출력 화면
너무 길어서 전체조회 화면만 넣을게yo 잘 실행 됩니다yo
🔈
contains(Object o) : 이 세트에 지정된 요소가 포함 된 경우 true를 리턴
ㄴSet<E> interface의 메소드
values() : 맵에 포함되어 있는 모든 value 리턴해주기, 리턴타입 Collection<E>ㄴHashMap Class의 메소드
📘 HashMap<K, V> 문제 (3)
package day18;
import java.util.HashMap;
import java.util.Scanner;
class Student{
private String id;
private String tel;
Student(String id, String tel){ // 생성자 오버로딩 // 객체 생성과 동시에 필드 초기화
this.id = id;
this.tel = tel;
}
public String getId() { return id; } // 다른 Class들이 student 필드에 접근하지 못해서
public String getTel() { return tel; } // 필드값을 리턴해주는 get() method 만들어 놓기
}
public class HashEx04{
public static void main(String[] args) {
HashMap<String, Student> map = new HashMap<String, Student>(); // map 객체 생성
map.put("아이언맨", new Student("iron","010-1111-1111")); // key 제네릭 타입: String
map.put("블랙위도우", new Student("black","010-0101-4860")); // value 제네릭 타입: Student(Class)
map.put("데드풀", new Student("kill","010-4444-4444"));
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("검색할 이름>>");
String name = sc.nextLine();
if(name.equals("exit")) {
System.out.println("프로그램 종료");
break;
}
Student s = map.get(name); // value 타입이 Student 임으로 Student 타입의 참조변수에 value 넣기
if(s == null) System.out.println(name + "은 없는 사람 입니다.");
// 입력받은 단어가 k에 포함되어 있지않은 단어라면 v도 없으므로 Student S에 값은 비어 있다.
else
System.out.println("id: " + s.getId() +", " + "tel: " + s.getTel());
}
sc.close();
}
}
🖥️ console 출력 화면
🔈 Class 객체도 k,v의 타입이 될수 있다.
📖 HashMap<K, V> 예제 (2) - 요소 생략하여 사용해보기
package day18;
import java.util.HashMap;
import java.util.Scanner;
public class HashEx05 {
public static void main(String[] args) {
HashMap map = new HashMap(); // 요소 생략하여 생성
map.put("java", 1234);
map.put("jsp", 1234);
map.put("jsp", 1010); // key는 중복이 안되므로 먼저 데이터에 값 덮어씌워짐
map.put("javac", 1254);
map.put(100, "test");
System.out.println(map);
while(true){
Scanner sc = new Scanner(System.in);
System.out.println("id와 password를 입력해주세요");
System.out.println("id>>");
String id = sc.nextLine().trim(); // 사용자가 실수로 띄어쓰기 작성한것 없애주기
System.out.println("password>>");
String pw = sc.nextLine();
System.out.println();
if(!map.containsKey(id)) { // id가 존재하지 않을때
System.out.println("id가 존재하지 않습니다");
continue;
}else {// id가 존재할 때
// 처음에 value 넣을때 숫자 넣었지만 제네릭 타입 생략하여 Object 타입되어서 강제 형변환
// pw도 문자열로 받았으니 변경해주려면 Integer로 형변환
if(!((Integer)map.get(id) == Integer.parseInt(pw))) {// id와 pw가 일치하지 않을때
System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
continue;
}else {
System.out.println(id + "님! 로그인 성공! 환영합니다");
break;
}
} // 외부 else
} // while
}
}
🖥️ console 출력 화면
🔈 값 비교할때 타입 잘 보고 형변환 해줘야 한다.
📖 HashMap<K, V> 예제 (3) - 요소 생략하여 사용해보기 (2)
package day18;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashEx06 {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("김자바", new Integer(100));
map.put("이스프링", new Integer(80));
map.put("최에스큐엘", new Integer(90));
map.put("박제이에스피", new Integer(100));
// Set<Map.Entry<K, V>> entrySet() : 맵내에 보관 유지되고 있는 매핑의 세트뷰 반환
// Map.Entry : 맵의 엔트리(키 벨류 쌍)
// Map.EntrySet 메소드는 이 클래스에 속하는 요소를 가지는 맵의 코레크션뷰를 돌려줍니다.
//
Set set = map.entrySet(); // 김자바=100;
System.out.println(set);
Iterator it = set.iterator();
while(it.hasNext()){
Map.Entry e = (Map.Entry)it.next();
System.out.println("이름: " + e.getKey() + ", 점수: " + e.getValue());
}
}
}
🖥️ console 출력 화면
🔈 key-value 매핑된 세트로 반환하고 싶으면 entrySet() method 사용!
📖 LinkedList<E> 예제
package day18;
import java.util.LinkedList;
public class LinkedEx01 {
public static void main(String[] args) {
LinkedList<String> mylist = new LinkedList<String>();
mylist.add("test1");
mylist.add("test2");
mylist.add("test3");
mylist.add("test4");
mylist.add("test5");
mylist.add(2, "100");
System.out.println(mylist);
mylist.addFirst(null);
System.out.println(mylist);
}
}
🖥️ console 출력 화면
🔈 요소들을 양방향으로 연결하여 관리한다는 점을 제외하고는 Vector, ArrayList와 거의 같다.
📖 Stack<E> 예제
package day18;
import java.util.Stack;
public class StackEx01 {
public static void main(String[] args) {
// Stack는 자료가 탑처럼 쌓이는 구조로
// 마지막에서만 접근이 가능하다
Stack<String> st = new Stack<String>();
st.push("0"); // 요소 밀어넣음
st.push("1");
st.push("2");
System.out.println(st.pop()); // pop() 맨위에있는 요소 리턴해주고 삭제
while(!st.empty()) {// 비어있지 않을때까지 반복
System.out.println(st.pop());
}
}
}
🖥️ console 출력 화면
🔈 pop()으로 맨마지막꺼 2 요소가 출력되어 남은건 0과 1
st가 비어있지 않을때까지 pop()해주어 모든 요소 출력!
📖 Set<E> Interface 예제 - HaskSet<E>의 구현 Class
package day18;
import java.util.HashSet;
import java.util.Set;
class Tv{}
public class HashSetEx01 {
public static void main(String[] args) {
Object[] obj = {"1",new Integer(1), "2", "2", "3","3","4","4","4"};
Set set = new HashSet(); // List list = new ArrayList(); Map map = new HashMap(); // 부모꺼로 형변환해서 받음 더 느슨하게
for(int i = 0; i<obj.length; i++) {
set.add(obj[i]); // 중복된 요소는 하나만 추가됨
}
System.out.println(set);
set.add(new Tv()); //class 객체도 요소로 넣을 수 있음
set.add(new Tv()); // new한 객체들은 다 다른 요소이기에 원하는만큼 넣을 수 있음
set.add(new Tv());
set.add(new Tv());
System.out.println(set);
}
}
🖥️ console 출력 화면
🔈 Set<E> 에는 중복된 요소가 같이 들어갈 수 없다. add()시 지정된 요소가 아직없는 경우에만 추가 된다.
📖 Properties 예제
package day18;
import java.util.Enumeration;
import java.util.Properties;
public class PropEx01 {
public static void main(String[] args) {
Properties p = new Properties();
// k, v 저장
p.setProperty("id", "global");
p.setProperty("url", "nullmaster");
p.setProperty("sid", "orcl");
p.setProperty("port", "1521");
// v 꺼내기
String value = p.getProperty("id");
System.out.println(value);
// 전체 꺼내기
Enumeration e = p.propertyNames(); // 모든 key 꺼내기
while(e.hasMoreElements()) { // 다음 key 없을때까지 반복
String key = (String)e.nextElement(); // Object로 리턴 받기 때문에 바로 String으로 형변환하여 넣기, key하나 꺼내기
System.out.println(key + "=" + p.getProperty(key)); // key와 key를 이용하여 value 꺼내기
}
}
}
🖥️ console 출력 화면
🔈 환결설정 할때 자주 사용한다고 한다. 나중에 많이 쓸거라고 선생님이 말씀 하셨다!
HaskMap이랑 거의 비슷한거 같으며 메소드명이나 반복자가 다른듯~! 자주 더 써봐야 알 수 있을 것 같다.