basic/java 실습

day 18 예제 및 문제 - Iterator<E> 반복자, HaspMap Class …

못지(Motji) 2021. 5. 18. 23:48

📖 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() 메소드는 다음 요소를 꺼내준다.

이해하기 쉽게 그림으로 설명하자면 아래와 같다

흰 화살표가 현재 위치이며 검정 화살표가 접근할 다음요소를 가리키는 것이다. hasNext() 메소드 사용할때는 검정화살표가 가리키는 다음 요소가 있을시 ture 리턴해주고, 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이랑 거의 비슷한거 같으며 메소드명이나 반복자가 다른듯~! 자주 더 써봐야 알 수 있을 것 같다.