Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

정리정돈 개발블로그~

[15일차] 국비교육 본문

국비학원 교육 일지

[15일차] 국비교육

snooop 2022. 8. 8. 17:49

**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