정리정돈 개발블로그~
[15일차] 국비교육 본문
**HashMap중요
1. Map
- 해시코드: 해시값을 생성하면 고유 주소 값이 생기는데 이것을 숫자로 변환한 것
- Heap영역에 인스턴스에 대한 참조 값< 스택->힙-> 스테틱 순>
- 해시함수 : 임의의 길이를 가진 데이터를 고정된 길이를 가진 데이터로 매핑해주는 함수
- Hash collision : 이상적인 해시 테이블은 한 버켓에 한개의 노드 .
- 데이터 검색의 경우 인덱스만 계산하면 바로 값을 찾을 수 있으므로 O(1)의 시작복잡도
- 한 버켓에 여러개의 노드가 있는 겨우를 충돌이라고 함
- Map<K,V>map = new HashMap<K, V>();
package 해시맵;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
// 해시맵이란? 키와 값으로 구성된 자료 구조
// 해시는 검색과 저장에 아주 우수한 성능을 가짐
// 해시코드? Heap영역에 저장된 인스턴스에 대한 참조 값
// 해시함수? 고정된 길이를 가진 데이터(배열)로 매핑해주는 함수
// 해시충돌? 해시테이블에 중복으로 값이 저장되는 경우를 말함.
// 이 경우는 체이닝 기법등을 사용함.(충돌된 값끼리 Linked List로 연결합니다.)
public class HashMainEx1 {
public static void main(String[] args){
// Map 컬렉션 생성 : Map<키, 값> map = new HashMap<여기에도 키와 값이 오지만 생략가능 >
Map<String, Integer> map = new HashMap<>();
// 객체에 값 추가 : put(키, 값)(array add의 의미)
map.put("우영우", 99);
map.put("동그라미", 55);
map.put("이준호", 80);
map.put("권민우", 93);
map.put("동그라미", 80); // map은 키에 대한 중복 허용을 하지 않기 때문에, 나중값을 대체 된다.
System.out.println("총 Entry 수 : " + map.size());
// 객체 찾기 : 주어진 키의 값을 반환함
System.out.println(map.get("동그라미"));
// keySet() : 모든 키를 Set 객체에 담아서 반환 함.
// Iterator를 이용해 값을 읽어오는 방법
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while(iterator.hasNext()){ // 다음요소가 있는지 확인(있으면 true)
String key = iterator.next(); // 다음 요소의 키를 가져옴
Integer value = map.get(key); // 키로 값을 읽어 옴
System.out.println("키 : " + key);
System.out.println("값 : " +value);
}
System.out.println();
// 객체 삭제 : remove(키), 키로 해당 Map.Entry 제거
map.remove("권민우");
System.out.println("총 Entry 수 : "+ map.size());
System.out.println();
// 향상된 for문 사용
for(String e : map.keySet()) { // Map.Entry에서 키를 뽑아내서 Set에 담음
// 맵은 키가 기준 값이기 때문에 map.keySet()으로 부름
System.out.println("키 : " + e);
System.out.println("값 : " + map.get(e)); // 키 값을 넣어서 값을 반환 받음
}System.out.println();
// 객체 수정 : replace(키, 값)
map.replace("이준호", 91);
// 키와 값이 쌍으로 구성된 Map.Entry 객체를 set에 담아서 처리 --> 잘 사용하지 않음
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
while (entryIterator.hasNext()){
Map.Entry<String, Integer> entry = entryIterator.next();
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println("키 : " + key);
System.out.println("값 : " +value);
}
System.out.println();
//객체 전체 삭제 : 모든 Map.Entry를 삭제
map.clear();
System.out.println("총 Entry 수 : " + map.size());
}
}
출력
총 Entry 수 : 4
80
키 : 권민우
값 : 93
키 : 이준호
값 : 80
키 : 우영우
값 : 99
키 : 동그라미
값 : 80
총 Entry 수 : 3
키 : 이준호
값 : 80
키 : 우영우
값 : 99
키 : 동그라미
값 : 80
키 : 이준호
값 : 91
키 : 우영우
값 : 99
키 : 동그라미
값 : 80
총 Entry 수 : 0
package 해시맵메뉴;
import java.util.*;
// 해시맵을 이용한 커피 메뉴 (보기/추가/삭제/변경)
public class HashMenuMain {
static Map<String, MenuInfo> map = new HashMap<>();
// 아래 클래스에 사용하려다 보니 static 을 사용함
public static void main(String[] args){
makeMenu();
selectMenu();
}
// 초기 메뉴를 추가 함
static void makeMenu(){
// 값에 객체 생성을 위해 new를 붙여 MenuInfo 호출
map.put("Americano", new MenuInfo("Americano", 2000,"Coffee", "기본커피"));
map.put("Espresso", new MenuInfo("Espresso", 2500, "Coffee","진한커피"));
map.put("Latte", new MenuInfo("Latte", 4000, "Coffee","우유 포함"));
}
static void selectMenu(){
Scanner sc = new Scanner(System.in);
String key;
while(true) {
System.out.println("메뉴를 선택 하세요 : ");
System.out.println("[1]메뉴보기, [2]메뉴조회, [3]메뉴추가, [4]메뉴삭제, [5]메뉴 수정, [6]종료 : ");
int selMenu = sc.nextInt();
switch (selMenu) {
case 1 :
/*Set<String> keySet = map.keySet(); // 맵의 모든 key를 모아서 반환
Iterator<String> iterator = keySet.iterator();
while(iterator.hasNext()){
key = iterator.next();
System.out.println("메뉴 : " + map.get(key).name);
System.out.println("가격 : " + map.get(key).price);
System.out.println("그룹 : " + map.get(key).group);
System.out.println("설명 : " + map.get(key).desc);
}*/
System.out.println("========== 메뉴 보기 =============");
for(String e : map.keySet()){
System.out.println("메뉴 : " + map.get(e).name);
System.out.println("가격 : " + map.get(e).price);
System.out.println("그룹 : " + map.get(e).group);
System.out.println("설명 : " + map.get(e).desc);
System.out.println("--------------------------------");
}
break;
case 2 :
System.out.print("조회 할 메뉴를 입력 하세요 : ");
key = sc.next();
// containsKey(키) : map내에 해당 키가 있는지 확인하여 결과를 반환 함
if(map.containsKey(key)){
System.out.println("메뉴 : " + map.get(key).name);
System.out.println("가격 : " + map.get(key).price);
System.out.println("그룹 : " + map.get(key).group);
System.out.println("설명 : " + map.get(key).desc);
}else System.out.println("해당 메뉴가 존재하지 않습니다.");
break;
case 3 :
System.out.print("추가 할 메뉴를 입력 하세요 : ");
key = sc.next(); // key 이면서 메뉴이름이 된다.
if (map.containsKey(key)) {
System.out.println("해당 메뉴가 이미 존재 합니다.");
}else{
System.out.print("가격 입력 : ");
int price = sc.nextInt();
System.out.print("분류 입력 : ");
String grp = sc.next();
//sc.nextLine(); // 버퍼 비우기
System.out.print("설명 입력 : ");
String desc = sc.next();
map.put(key, new MenuInfo(key, price, grp, desc));
} break;
case 4 :
System.out.print("삭제할 메뉴를 입력 하세요 : ");
key = sc.next();
if(map.containsKey(key)){
map.remove(key);
System.out.println(key + " 메뉴를 삭제 하였습니다. ");
}else{
System.out.println("삭제할 메뉴가 없습니다.");
}break;
case 5 :
System.out.print("수정할 메뉴를 입력 하세요 : ");
key = sc.next();
if(map.containsKey(key)){
System.out.print("가격 입력 : ");
int price = sc.nextInt();
System.out.print("분류 입력 : ");
String grp = sc.next();
//sc.nextLine(); // 버퍼 비우기
System.out.print("설명 입력 : ");
String desc = sc.next();
map.replace(key, new MenuInfo(key, price, grp, desc));
} else{
System.out.println("수정 할 메뉴가 없습니다.");
} break;
case 6 :
System.out.println("메뉴를 종료 합니다.");
return; // break 사용하면 while 반복문을 벗어나지 못함..
}
}
}
}
package 해시맵메뉴;
// 해시맵에서 사용할 클래스
public class MenuInfo {
String name; // 메뉴 이름
int price; // 메뉴 가격
String group; // 분류
String desc; // 설명
public MenuInfo(String name, int price, String group, String desc) {
this.name = name;
this.price = price;
this.group = group;
this.desc = desc;
}
}
출력
메뉴를 선택 하세요 :
[1]메뉴보기, [2]메뉴조회, [3]메뉴추가, [4]메뉴삭제, [5]메뉴 수정, [6]종료 :
1
========== 메뉴 보기 =============
메뉴 : Espresso
가격 : 2500
그룹 : Coffee
설명 : 진한커피
--------------------------------
메뉴 : Americano
가격 : 2000
그룹 : Coffee
설명 : 기본커피
--------------------------------
메뉴 : Latte
가격 : 4000
그룹 : Coffee
설명 : 우유 포함
--------------------------------
메뉴를 선택 하세요 :
[1]메뉴보기, [2]메뉴조회, [3]메뉴추가, [4]메뉴삭제, [5]메뉴 수정, [6]종료 :
2
조회 할 메뉴를 입력 하세요 : 하하
해당 메뉴가 존재하지 않습니다.
메뉴를 선택 하세요 :
[1]메뉴보기, [2]메뉴조회, [3]메뉴추가, [4]메뉴삭제, [5]메뉴 수정, [6]종료 :
3
추가 할 메뉴를 입력 하세요 : BlackTea
가격 입력 : 4500
분류 입력 : Tea
설명 입력 : 홍차입니다.
메뉴를 선택 하세요 :
[1]메뉴보기, [2]메뉴조회, [3]메뉴추가, [4]메뉴삭제, [5]메뉴 수정, [6]종료 :
1
========== 메뉴 보기 =============
메뉴 : Espresso
가격 : 2500
그룹 : Coffee
설명 : 진한커피
--------------------------------
메뉴 : BlackTea
가격 : 4500
그룹 : Tea
설명 : 홍차입니다.
--------------------------------
메뉴 : Americano
가격 : 2000
그룹 : Coffee
설명 : 기본커피
--------------------------------
메뉴 : Latte
가격 : 4000
그룹 : Coffee
설명 : 우유 포함
--------------------------------
메뉴를 선택 하세요 :
[1]메뉴보기, [2]메뉴조회, [3]메뉴추가, [4]메뉴삭제, [5]메뉴 수정, [6]종료 :
5
수정할 메뉴를 입력 하세요 : Americano
가격 입력 : 2500
분류 입력 : Coffee
설명 입력 : 기본커피
메뉴를 선택 하세요 :
[1]메뉴보기, [2]메뉴조회, [3]메뉴추가, [4]메뉴삭제, [5]메뉴 수정, [6]종료 :
1
========== 메뉴 보기 =============
메뉴 : Espresso
가격 : 2500
그룹 : Coffee
설명 : 진한커피
--------------------------------
메뉴 : BlackTea
가격 : 4500
그룹 : Tea
설명 : 홍차입니다.
--------------------------------
메뉴 : Americano
가격 : 2500
그룹 : Coffee
설명 : 기본커피
--------------------------------
메뉴 : Latte
가격 : 4000
그룹 : Coffee
설명 : 우유 포함
--------------------------------
메뉴를 선택 하세요 :
[1]메뉴보기, [2]메뉴조회, [3]메뉴추가, [4]메뉴삭제, [5]메뉴 수정, [6]종료 :
6
메뉴를 종료 합니다.
Process finished with exit code 0
package 주민등록번호;
// 주민등록번호 : 010222-3164414
// 생년월일 : 2001년 2월 22일생
// 나이 (만 나이 기준) - 예제 기준 21살이 됨
// 성별 : 8번째자리가 1, 3이면 남성, 2, 4이면 여성
import java.util.Calendar;
import java.util.Scanner;
public class JuminMainEx {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("주민등록번호 입력 : ");
String jumin = sc.next();
// 주민등록번호 길이만큼 반복문을 돌면서, 년/월/일 그리고 성별 추출
// 현재 연도 구하기
Calendar now = Calendar.getInstance();
int thisYear = now.get(Calendar.YEAR);
int jYear = 0, jMonth =0, jDay=0, jGender = 0;
for (int i = 0; i < jumin.length(); i++) {
if(i == 0) jYear = (jumin.charAt(0) - '0') *10; // 10의 자리의 수를 만들어 줌
if(i == 1) jYear += jumin.charAt(1) - '0';
if(i == 2) jMonth =(jumin.charAt(2) - '0') *10;
if(i == 3) jMonth +=(jumin.charAt(3) - '0');
if(i == 4) jDay = (jumin.charAt(4) - '0') *10;
if(i == 5) jDay += (jumin.charAt(5) - '0');
if(i == 7) jGender = jumin.charAt(7) - '0';
}
if(jGender == 1 || jGender ==2){ // 1900년대 출생자
System.out.println("생년월일 : " + (jYear + 1900) + "년" + jMonth+ "월" + jDay+ "일");
System.out.println("나이 : 만" + (thisYear - 1900 - jYear)+ "세");
}else{
System.out.println("생년월일 : " + (jYear + 2000) + "년" +jMonth+ "월" + jDay+ "일");
System.out.println("나이 : 만 " + (thisYear - 2000 - jYear) + "세");
}
String[] genderStr = {"", "남성", "여성", "남성", "여성"};
System.out.println("성별 : "+genderStr[jGender]);
}
}
출력
주민등록번호 입력 : 740807-2456873
생년월일 : 1974년8월7일
나이 : 만48세
성별 : 여성
<HashTable>-> 멀티스레드 환경에서 안전함
<Properties>
package 프로퍼티2;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Properties;
public class PropertyMain2 {
public static void main(String[] args){
Properties properties = new Properties();
properties.setProperty("timeout", "30");
properties.setProperty("language", "kr");
properties.setProperty("size", "10");
properties.setProperty("capacity","10");
/*
// properties에 저장된 요소들은 Enumeration을 이용해 출력
Enumeration enumeration = properties.propertyNames();
while(enumeration.hasMoreElements()){
String element = (String) enumeration.nextElement();
// Enumeration을 통해서 key를 찾아내고 이를 getProperty(키)로 값을 출력
System.out.println(element + " = " + properties.getProperty(element));
}*/
Iterator<String> iterator = (Iterator<String>) properties.propertyNames();
while(iterator.hasNext()){
String element = iterator.next();
System.out.println(element + " = " + properties.getProperty(element));
}
System.out.println("Size = " +properties.getProperty("size"));
System.out.println("capacity = " +properties.getProperty("capacity"));
System.out.println("language = " +properties.getProperty("language"));
System.out.println("timeout = " +properties.getProperty("timeout"));
}
출력
capacity = 10
size = 10
timeout = 30
language = kr
Size = 10
capacity = 10
language = kr
timeout = 30
package 아이패드;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import static java.lang.Thread.sleep;
public class IPad {
int screen; // 화면 크기 : 11인치 / 12.9인치
int color; // 색상 : 스페이스그레이 / 실버
int memory; // 용량 : 128GB, 235GB, 512GB, 1TB
int network; // 네트워크 : Wi-Fi, Wi-Fi+Cellular
String name; // 각인서비스 시 이름 저장
String productDate; // 제품 생산 일자
String serialNum; // 제품 일련번호 : iPad13128C2208081
static int cnt = 0; // 클래스 변수 : 객체로 생성되지 않고 클래스 이름으로 접근 해야 함
IPad(String name) { // 생성자는 클래스가 객체로 만들어 질 때 호출 됨
this.name = name;
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
productDate = sdf.format(now); // 년월일 시간 정보를 얻어 옴
cnt++;
productDate += cnt; // 문자열을 이어 붙이기
}
// 제품을 구입 할건지 중단 할건지 선택 메뉴 (true 계속 진행/ false 종료)
boolean continueOrder() {
Scanner sc = new Scanner(System.in);
System.out.println("===== iPad Pro 구입하기 ====");
System.out.print("구입하시려면 yes / 종료는 quit : ");
String isCon = sc.next();
if (isCon.equalsIgnoreCase("yes")) return true;
else return false;
}
// 스크린 설정 하기, void 는 메소드 수행 이후 반환값이 없음을 의미
void setScreen() {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("디스플레이 선택 [1]11인치, [2]12.9인치 : ");
screen = sc.nextInt();
if(screen == 1 || screen == 2) return;
System.out.println("디스플레이를 다시 선택 하세요. ");
}
}
void setColor() {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("컬러 선택 [1]스페이스그레이 [2]실버 : ");
color = sc.nextInt();
if(color == 1 || color == 2) return;
System.out.println("컬러를 다시 선택 하세요.");
}
}
void setMemory() {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("용량 선택 [1]128GB, [2]256GB, [3]512GB, [4]1TB : ");
memory = sc.nextInt();
if(memory > 0 && memory < 5) return;
System.out.println("용량을 다시 선택 하세요.");
}
}
void setNetwork() {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("네트워크 선택 : [1]Wi-Fi, [2]Wi-Fi+Cellular : ");
network = sc.nextInt();
if(network == 1 || network == 2) return;
System.out.println("네트워크를 다시 선택 하세요. ");
}
}
void setName() {
Scanner sc = new Scanner(System.in);
System.out.print("각인 서비스를 신청 하시겠습니까? (yes/no) ");
String service = sc.next();
if(service.equalsIgnoreCase("yes")) {
System.out.print("이름을 입력 하세요 : ");
name = sc.next();
}
}
// iPad + 11/13 + 128/256/512/1024 + W/C + 220801 + 생산댓수
void setSerialNum() {
String screenStr = (screen == 1) ? "11" : "13";
String[] memStr = {"", "128", "256", "512", "1024"};
String netStr = (network == 1) ? "W" : "C";
serialNum = "iPad" + screenStr + memStr[memory] + netStr + productDate;
}
// 제품 구매가 완료되면 출고까지 30초 대기 이후 출고 하기(?)
void progressPad() throws InterruptedException {
int cnt = 0;
while (true) {
sleep(300);
cnt++;
System.out.print(" << iPad Pro 제작 중 : [" + cnt + "%] >>");
System.out.print("\r");
if(cnt >= 100) break;
}
}
void productPad() {
final String[] screenType = {"", "11인치", "12.9인치"};
final String[] colorType = {"", "스페이스그레이", "실버"};
final String[] memType = {"", "128GB", "256GB", "512GB", "1TB"};
final String[] netType = {"", "Wi-Fi", "Wi-Fi+Cellular"};
System.out.println("===== iPad 가 출고 되었습니다. =====");
System.out.println("화면 크기 : " + screenType[screen]);
System.out.println("제품 색상 : " + colorType[color]);
System.out.println("제품 용량 : " + memType[memory]);
System.out.println("네트워크 : " + netType[network]);
System.out.println("이름 : " + name); // 각인서비스 미 선청 시 iPad, 신청 시 해당 이름
System.out.println("일련번호 : " + serialNum);
System.out.println("-----------------------------------");
}
}
package 아이패드;
public class IPadMain {
public static void main(String[] args) throws InterruptedException {
while(true) {
IPad iPad = new IPad("iPad Pro");
if(!iPad.continueOrder()) break;
iPad.setScreen();
iPad.setColor();
iPad.setMemory();
iPad.setNetwork();
iPad.setName();
iPad.setSerialNum();
iPad.progressPad();
iPad.productPad();
}
}
}
출력
===== iPad Pro 구입하기 ====
구입하시려면 yes / 종료는 quit :
yes
디스플레이 선택 [1]11인치, [2]12.9인치 : 1
컬러 선택 [1]스페이스그레이 [2]실버 : 2
용량 선택 [1]128GB, [2]256GB, [3]512GB, [4]1TB : 1
네트워크 선택 : [1]Wi-Fi, [2]Wi-Fi+Cellular : 2
각인 서비스를 신청 하시겠습니까? 1
===== iPad 가 출고 되었습니다. =====
화면 크기 : 11인치
제품 색상 : 실버
제품 용량 : 128GB
네트워크 : Wi-Fi+Cellular
이름 : iPad Pro
일련번호 : iPad11128C2208081
-----------------------------------
===== iPad Pro 구입하기 ====
구입하시려면 yes / 종료는 quit :
yes
디스플레이 선택 [1]11인치, [2]12.9인치 : 2
컬러 선택 [1]스페이스그레이 [2]실버 : 1
용량 선택 [1]128GB, [2]256GB, [3]512GB, [4]1TB : 3
네트워크 선택 : [1]Wi-Fi, [2]Wi-Fi+Cellular : 1
각인 서비스를 신청 하시겠습니까? yes
이름을 입력 하세요 : gkgk
===== iPad 가 출고 되었습니다. =====
화면 크기 : 12.9인치
제품 색상 : 스페이스그레이
제품 용량 : 512GB
네트워크 : Wi-Fi
이름 : gkgk
일련번호 : iPad13512W2208082
-----------------------------------
===== iPad Pro 구입하기 ====
구입하시려면 yes / 종료는 quit :
'국비학원 교육 일지' 카테고리의 다른 글
[17일차] 국비교육 (0) | 2022.08.10 |
---|---|
[16일차] 국비교육 (0) | 2022.08.09 |
[14일차] 국비교육 (0) | 2022.08.05 |
[13일차] 국비교육 (0) | 2022.08.04 |
[12일차] 국비교육 (0) | 2022.08.03 |