고급자바

김강산·2022년 7월 25일
0

고급JAVA

목록 보기
6/15

Map

package kr.or.ddit.basic;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class T08MapTest {
public static void main(String[] args) {

	Map<String, String> map = new HashMap<String, String>();
	
	//key와 value를 합쳐 enrty 라고 부른다
	// 자료 추가 => put(key값, value값)
	map.put("name", "홍길동");
	map.put("addr", "대전");
	map.put("tel", "010-1234-5678");
	
	System.out.println("map => " + map);
	
	// 자료 수정 => 데이터를 저장할 때 key값이 같으면 나중에 입력한 값이 저장된다.
	//				put(수정할key값, 새로운value값)
	map.put("addr", "서울");
	System.out.println("map => " + map);
	
	// 자료 삭제 => remove(삭제할 key값)
	map.remove("name");
	System.out.println("map => " + map);
	
	// 자료 읽기 => get(key값)
	System.out.println("aadr = " + map.get("addr"));
	System.out.println("================================");
	
	// key값들을 읽어와 자료를 출력하는 방법
	
	// 방법1 => keySet()메서드 이용하기
	//		keySet() : Map의 key값들만 읽어와 Set형으로 반환한다.
	Set<String> keySet = map.keySet();
	
	System.out.println("Iterator를 이용한 방법");
	Iterator<String> it = keySet.iterator();
	while(it.hasNext()) {
		String key = it.next();
		System.out.println(key + " : " + map.get(key));
	}
	System.out.println("================================");
	
	// 방법2 => Set형의 데이터를 '향상된 for문'으로 처리하는 방법
	System.out.println("향상된 for문을 이용한 방법");
	for(String key : keySet) {
		System.out.println(key + " : " +map.get(key));
	}
	
	// 방법3 => value값만 읽어와 출력하기 => values() 이용하기
	System.out.println("values()를 이용한 방법");
	for(String value : map.values()) {
		System.out.println(value);
	}
	System.out.println("================================");
	
	// 방법4 => Map관련 클래스에는 Map.Entry타입의 내부 클래스가 만들어져 있다.
	//				이 내부 클래스는 key와 value라는 멤버변수로 구성되어 있다.
	//				Map에서 이 Map.Entry타입의 개기체들을 Set형으로 저장하여 관리한다.
	
	// Map.Entry타입의 객체 모두 가져오기 => entrySet() 이용하기
	Set<Map.Entry<String, String>> entrySet = map.entrySet();
	
	// 가져온 Entry객체들을  순서대로 처리하기 위해서 Iterator객체 이용
	Iterator<Map.Entry<String, String>> entryIt = entrySet.iterator();
	
	while(entryIt.hasNext() ) {
		Map.Entry<String, String> entry = entryIt.next();
		
		// entry라면 getKey()메서드와 getValue()메서드가 필요하다
		System.out.println("key값 : " + entry.getKey());
		System.out.println("value값 : " + entry.getValue());
		System.out.println();
	}
}

}

HashMap

package kr.or.ddit.basic;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/*
문제) 이름, 주소, 전화번호 속성을 갖는 Phone클래스를 만들고, 이 Phone클래스를 이용하여
전화번호 정보를 관리하는 프로그램을 완성하시오.
이 프로그램에는 전화번호를 등록, 수정, 삭제, 검색, 전체출력하는 기능이 있다.

  전체의 전화번호 정보는 Map을 이용하여 관리한다.
  (key는 '이름'으로 하고 value는 'Phone클래스의 인스턴스'로 한다.)

실행예시)

전화번호 관리 프로그램(파일로 저장되지 않음)

메뉴를 선택하세요.
1. 전화번호 등록
2. 전화번호 수정
3. 전화번호 삭제
4. 전화번호 검색
5. 전화번호 전체 출력
0. 프로그램 종료
번호입력 >> 1 <-- 직접 입력

새롭게 등록할 전화번호 정보를 입력하세요.
이름 >> 홍길동 <-- 직접 입력
전화번호 >> 010-1234-5678 <-- 직접 입력
주소 >> 대전시 중구 대흥동 111 <-- 직접 입력

메뉴를 선택하세요.
1. 전화번호 등록
2. 전화번호 수정
3. 전화번호 삭제
4. 전화번호 검색
5. 전화번호 전체 출력
0. 프로그램 종료
번호입력 >> 5 <-- 직접 입력

=======================================
번호 이름 전화번호 주소
=======================================
1 홍길동 010-1234-5678 대전시


=======================================
출력완료...

메뉴를 선택하세요.
1. 전화번호 등록
2. 전화번호 수정
3. 전화번호 삭제
4. 전화번호 검색
5. 전화번호 전체 출력
0. 프로그램 종료
번호입력 >> 0  <-- 직접 입력

프로그램을 종료합니다...

*/
public class T09PhoneBookTest {
	private Scanner scan;
	private Map<String, Phone> phoneBookMap;
	
	public T09PhoneBookTest() {
		scan = new Scanner(System.in);
		phoneBookMap = new HashMap<String, Phone>();
	}
	
	// 메뉴를 출력하는 메서드
	public void displayMenu(){
		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(" 0. 프로그램 종료");
		System.out.print(" 번호입력 >> ");		
	}
	
	// 프로그램을 시작하는 메서드
	public void phoneBookStart(){
		System.out.println("===============================================");
		System.out.println("   전화번호 관리 프로그램(파일로 저장되지 않음)");
		System.out.println("===============================================");
		
		while(true){
			
			displayMenu();  // 메뉴 출력
			
			int menuNum = scan.nextInt();   // 메뉴 번호 입력
			
			switch(menuNum){
				case 1 : insert();		// 등록
					break;
				case 2 : update();		// 수정
					break;
				case 3 : delete();		// 삭제
					break;
				case 4 : search();		// 검색
					break;
				case 5 : displayAll();	// 전체 출력
					break;
				case 0 :
					System.out.println("프로그램을 종료합니다...");
					return;
				default :
					System.out.println("잘못 입력했습니다. 다시입력하세요.");
			} // switch문
		} // while문
	}
	
	/*
	 *  이름을 이용한 전화번호 정보 검색 메서드
	 */
	private void search() {
		
		System.out.println();
		System.out.println("검색할 전화번호 정보를 입력하세요.");
		System.out.print("이 름 >> ");
		String name = scan.next();
		
		Phone p = phoneBookMap.get(name);
		
		if(p == null) {
			System.out.println(name + "씨의 전화번호 정보가 없습니다.");
		} else {
			System.out.println(name + "씨의 전화번호 정보");
			System.out.println("이     름 : " + p.getName());
			System.out.println("전화번호 : " + p.getTel());
			System.out.println("주     소 : " + p.getAddr());
		}
		System.out.println("검색 작업 완료...");
		
	}

	/*
	 *  전화번호 정보를 삭제하기 위한 메서드
	 */
	private void delete() {
		
		System.out.println();
		System.out.println("삭제할 전화번호 정보를 입력하세요.");
		System.out.print("이 름 >> ");
		String name = scan.next();
		
		// remove(key) => 삭제를 성공하면 삭제된 value값을 반환하고, 
		//								실패하면 null을 리턴한다.
		if(phoneBookMap.remove(name) == null) {
			System.out.println(name + "씨는 등록된 사람이 아닙니다.");
		} else {
			System.out.println(name + "씨 정보를 삭제했습니다.");
			
		}
		
	}

	/*
	 *  전화번호 정보를 수정하는 메서드
	 */
	private void update() {
		System.out.println();
		System.out.println("수정할 전화번호 정보를 입력하세요.");
		System.out.print("이 름 >> ");
		String name = scan.next();
		
		// 이미 등록된 사람인지 체크
		// get()메서드로 값을 가져올 때 까져올 자료가 없으면 null을 반환한다.
		if(phoneBookMap.get(name) == null) {
			System.out.println(name + "씨는 없는 사람입니다.");
			return;
		}
		
		System.out.print("전화번호 >> ");
		String tel = scan.next();
		
		System.out.print("주 소 >> ");
		
		scan.nextLine(); // 입력버퍼에 남아있는 엔터키값을 읽어와 버리는 역할 수행
											// next()수행후 nextLine()호출시 남아있을지 모를 엔터키
											// 제거하기 위해 호출함.
		
		String addr = scan.nextLine();
		
		phoneBookMap.put(name, new Phone(name, tel, addr));
		
		System.out.println(name + "씨 수정 완료...");
				
	}

	/*
	 *  전체 자료를 출력하는 메서드
	 */
	private void displayAll() {
		Set<String> keySet = phoneBookMap.keySet();
		System.out.println("============================");
		System.out.println(" 번호\t이름\t전화번호\t주소");
		System.out.println("============================");
		
		if(keySet.size() == 0) {
			System.out.println("등록된 전화번호 정보가 없습니다.");
		} else {
			Iterator<String> it = keySet.iterator();
			int cnt = 0;
			while(it.hasNext()) {
				cnt++;
				String name = it.next(); // 키값 가져오기
				Phone p = phoneBookMap.get(name);
				System.out.println(" " + cnt + "\t" + p.getName()
													 + "\t" + p.getTel() + "\t"
													 + p.getAddr());
			}
		}
		System.out.println("===========================");
		System.out.println("출력 완료...");
		
		
	}

	/*
	 *  새로운 전화번호 정보를 등록하는 메서드
	 *  이미 등록된 사람은 등록되지 않는다.
	 */
		private void insert() {
			System.out.println();
			System.out.println("새롭게 등록할 전화번호 정보를 입력하세요.");
			System.out.print("이 름 >> ");
			String name = scan.next();
			
			// 이미 등록된 사람인지 체크
			// get()메서드로 값을 가져올 때 까져올 자료가 없으면 null을 반환한다.
			if(phoneBookMap.get(name) != null) {
				System.out.println(name + "씨는 이미 등록된 사람입니다.");
				return;
			}
			
			System.out.print("전화번호 >> ");
			String tel = scan.next();
			
			System.out.print("주 소 >> ");
			
			scan.nextLine(); // 입력버퍼에 남아있는 엔터키값을 읽어와 버리는 역할 수행
												// next()수행후 nextLine()호출시 남아있을지 모를 엔터키
												// 제거하기 위해 호출함.
			
			String addr = scan.nextLine();
			
			phoneBookMap.put(name, new Phone(name, tel, addr));
			
			System.out.println(name + "씨 등록 완료...");
			
	}

		public static void main(String[] args) {
			new T09PhoneBookTest().phoneBookStart();
		}

}

/*
*  전화번호 정보를 저장할 수 있는 VO 클래스
*  @author sem
*  
*/

class Phone {
	private String name;	// 이름
	private String tel; 		// 전화번호
	private String addr;		// 주소
	
	public Phone(String name, String tel, String addr) {
		super();
		this.name = name;
		this.tel = tel;
		this.addr = addr;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	public String getAddr() {
		return addr;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
	@Override
	public String toString() {
		return "Phone [name=" + name + ", tel=" + tel + ", addr=" + addr + "]";
	}
	
	
}

# Properties
package kr.or.ddit.basic;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class T10PropertiesTest {
	/*
	 	Properties는 Map보다 축소된 기능의 객체라고 할 수 있다.
	 	Map은 모든 형태의 객체 데이터를 key와 value값으로 사용할 수 있지만
	 	Properties는 key와 value값으로 String만 사용할 수 있다.
	 	
	 	Map은 put(), get() 메서드를 이용하여 데이터를 저장, 출력하지만
	 	Properties는 setProperty(), getProperty() 메서드를 통해서
	 	데이터를 입출력한다.
	 */
	public static void main(String[] args) throws IOException {
		Properties prop = new Properties(); 
		
		prop.setProperty("name", "홍길동");
		prop.setProperty("tel", "010-1234-5678");
		prop.setProperty("addr", "대전");
		
		String name = prop.getProperty("name");
		String tel = prop.getProperty("tel");
		
		System.out.println("이름 : " + name);
		System.out.println("전화 : " + tel);
		System.out.println("주소 : " + prop.getProperty("addr"));
		
		// 내용을 파일로 저장하기
		prop.store(new FileOutputStream(
						"src/kr/or/ddit/basic/test.properties"), "코멘트입니다.");
		
	}
}

1개의 댓글

comment-user-thumbnail
2022년 7월 27일

너무잘해요~

답글 달기