ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA2_8일차
    JAVA 2022. 2. 7. 19:49

    [수업내용 필기]

    [빈도수]
    1. HashMap
    2. Set

    사용자에게 보이는 부분은 절대로 콘솔창으로 보여주지 않는다.
    -> 콘솔창은 개발자만 보는 공간

    사용자가 보고 입출력하는 공간은 따로 존재
    ex.) 화면, UX, UI

    [파일 입출력]
    [JAVA기준으로 보면]
    java에서 쓴 코드 --> 파일 : 출력
    파일에서 쓴 정보 --> java : 입력

    txt

    [Stream]
    데이터가 전송되는 통로
    스트림이 열려야만 데이터가 전송이 된다.

    버퍼를 사용한다고 함 -> 버퍼란? 한 번에 보내고 더 안전함

    [파일 입출력]
    0. 파일객체 만들기
    1. 파일 데이터가 전송될 수 있게 스트림 열기
    2. 버퍼를 생성한다(열기)
    3. 파일을 읽거나 사용한다
    4. 버퍼를 닫아준다
    5. 스트림을 닫아준다

    File 클래스
    File 객체를 만드는 데 사용하는 클래스

    FileReader / FileWriter
    스트림을 여는데 사용하는 클래스

    BufferedReader / BufferedWriter
    버퍼를 열고 닫는데 사용하는 클래스

     


     

    [수업 중 질문]

    질문할 여유가 있지는 않아서 하지 못했다.

     


    [오늘의 코드]

     

    package day08;
    
    import java.util.HashMap;
    import java.util.Map.Entry;
    
    public class MapTest {
    	public static void main(String[] args) {
    		HashMap<String, String> info1 = new HashMap<String, String>();	// HashMap의 <String타입 key와 String타입 value>를 받음
    		
    		// HashMap안에 HashMap
    		HashMap<Integer, HashMap<String, String>> students = new HashMap<>();	// HashMap의<Integer타입 key와, HashMap타입 value를 받음>
    		info1.put("이름","김철수");	// info1에 key : 이름, value : 김철수 추가
    		info1.put("학과","컴퓨터");	// info1에 key : 학과, value : 컴퓨터 추가
    		info1.put("나이","20");	// info1에 key : 나이, value : 20(String) 추가
    		System.out.println(info1);	// HashMap info1을 출력
    		
    		System.out.println("--------------");	// 출력
    		System.out.println(info1.entrySet());	// Set info1을 출력
    //		Set<Entry<String,String>>	↓
    //		Set인데 요소로 Entry타입으로 들어가고 제네릭으로 String, String이 들어간다
    		
    		
    		for (Entry<String, String> ent : info1.entrySet()) {	// Entry의 <String(key), String(value)> ent에 info1의 엔트리세트만큼 반복
    			System.out.println(ent.getKey());	// ent의 getKey 메소드 출력, key값을 출력
    			System.out.println(ent.getValue());	// ent의 getValue 메소드 출력, value값을 출력
    		}
    		
    		
    		HashMap<String, String> info2 = new HashMap<String, String>();	// HashMap의 <String타입 key와 String타입 value>를 받음
    		info2.put("이름","홍길동");	// info2에 key : 이름, value : 홍길동 추가
    		info2.put("학과","경영");	// info2에 key : 학과, value : 경영 추가
    		info2.put("나이","23");	// info2에 key : 나이, value : 23(String) 추가
    		System.out.println(info2);	// info2을 출력
    		
    		students.put(2021001, info1);	// students에 2021001, info1 추가
    		students.put(2017002, info2);	// students에 2017002, info2 추가
    		
    		// students HashMap을 출력
    		System.out.println(students);	// students 출력
    		
    		// students HashMap의 key가 2021001 출력
    		System.out.println(students.get(2021001));	// students의 2021001의 value 출력
    		
    		// students HashMap의 key가 2021001의 벨류가 "학과"인 것 가져와라
    		System.out.println(students.get(2021001).get("학과"));	// students타입의 2021001의 "학과" value를 출력
    	}
    }

     

    package day08;
    
    import java.util.HashMap;
    import java.util.Scanner;
    
    public class MapTask {
    	
    	// 메뉴 추가, 수정, 삭제 시 HaspMap에 같은 이름의 메뉴가 있는지 확인을 반복하기에 메소드 하나로 호출하기로 함
    	// existKey(해시맵, 검사하고싶은문자열) 만약 해시맵안에 문자열이 key값으로 존재한다면 true, 아니면 false
    	public static boolean existKey(HashMap<String, Integer> m, String key) {
    		for (String k : m.keySet()) {	// String타입 k가 m에 있는 배열의 key값을 받아와 전체 반복
    			if (k.equals(key)) {	// k가 key와 동일하다면
    				return true;	// true값을 return
    			}
    		}
    		return false;	// false값을 return
    	}
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);	// Scanner 호출
    		
    		// 음식 이름과 가격을 저장할 저장공간
    		HashMap<String, Integer> menus = new HashMap<>(); // Key는 String, Value는 Integer타입을 가지는 menus라는 이름의 비어있는 Map 정의
    		boolean check = false;	// boolean타입 check는 false(0)
    		
    		// 카페 주문판 프로그램
    		// 사장님이 이용하는 프로그램
    		// 1. 메뉴 추가하기
    		// 2. 메뉴가격 수정하기
    		// 3. 메뉴 삭제하기
    		// 4. 전체 메뉴보기
    		// 5. 종료
    
    		while (true) {	// 무한 반복
    			// 메뉴 창
    			System.out.println("1. 메뉴 추가하기");
    			System.out.println("2. 가격 수정하기");
    			System.out.println("3. 메뉴 삭제하기");
    			System.out.println("4. 전체 메뉴보기");
    			System.out.println("5. 종료");
    			System.out.print("입력 >> ");
    			int choice = Integer.parseInt(sc.nextLine());	// int타입 choice는 입력한 값은 Integer값으로 받음
    
    			if (choice == 5) {	// 만약 choice가 5라면
    				System.out.println("종료!");	// 종료 출력
    				break;	// 반복문 탈출
    			} else if (choice == 1) {	// 만약 choice가 1이라면
    				// 메뉴 추가
    				check = false; // check는 false 라고 재정의
    				
    				// 버그 수정, 이미 존재하는 메뉴를 추가하려고 한다면 추가 못하게 막아주기
    				System.out.print("추가할 메뉴 >> ");	// 추가할 메뉴의 이름을 사용자로부터 입력 유도
    				String name = sc.nextLine(); // 사용자로부터 입력받은 값을 String타입의 name에 대입
    				for (String key : menus.keySet()) { // String타입 key에 menus에 있는 배열의 key값을 받아와 전체 반복
    					// ↓내가 추가하고자 하는 메뉴가 이미 menus안에 존재한다는 의미
    					if (key.equals(name)) { // key와 name이 일치한다면
    						check = true;	// check는 true
    						break;	// 반복문 탈출
    					}
    				}
    				// 이미 menus 안에 내가 추가하고자 하는 메뉴가 존재한다면 check에는 true가 담겨있다
    				// 만일 존재하지 않는다면 check에는 false가 담겨있다
    
    				if (check == false) {	// 만약 check가 false라면 -> 같은 이름의 메뉴가 없다면
    					System.out.print("가격 입력 >> ");	//  사용자로부터 가격 입력 유도
    					int price = Integer.parseInt(sc.nextLine());	// 입력받은 값을 Integer타입으로 변환하여 int타입 price에 저장
    
    					menus.put(name, price);	// menus의 put메소드 실행
    
    					System.out.println("메뉴 추가 완료!");	// 메뉴 추가 완료 메세지 출력
    				} else {	// check가 false가 아니라면
    					System.out.println("이미 같은 이름의 메뉴가 존재합니다");	// 이미 같은 이름의 메뉴가 존재합니다 출력
    				}
    
    			} else if (choice == 2) {	// 2번
    				// 가격 수정하기
    				check = false; // check는 false 라고 재정의
    				// 수정할 메뉴 이름을 입력받고 수정할 가격을 입력 받은 뒤
    				// HashMap안의 값을 수정하기
    				// 없는 메뉴를 수정하려고 할 때 막아주기
    				System.out.print("수정할 메뉴 >> ");	//  수정할 메뉴 입력 유도
    				String name = sc.nextLine(); // 사용자로부터 메뉴 입력 받음
    				for (String key : menus.keySet()) { // menus에 있는 key만큼 반복
    					if (key.equals(name)) { // 같은 이름의 메뉴가 있다면
    						// 내가 수정하고자 하는 메뉴가 이미 menus안에 존재한다는 의미
    						System.out.print("수정 가격 >> ");	// 수정 가격 입력 유도
    						int price = Integer.parseInt(sc.nextLine());	// 입력받은 값을 Integer타입으로 변환하며 int타입 price에 정의
    						menus.put(name, price);	// menus의 put메소드 실행, menus에 [key는 name, value는 price] 추가
    						System.out.println("가격 수정 완료!");	// 가격 수정 완료 출력
    						check = true;	// check는 true -> 찾는 메뉴가 존재하기 때문에 찾는 메뉴가 존재하지 않는 조건문은 실행 X
    						break;	// 내부 반복문 탈출
    					}
    				}
    				// 찾는 메뉴가 존재하지 않는다면
    				if (check == false) {	// check가 false라면
    					System.out.println("찾으시는 메뉴가 존재하지 않습니다");	// 사용자가 찾는 메뉴가 없다는 메세지 출력
    				}
    			} else if (choice == 3) {	// 3번
    				// 메뉴 삭제하기
    				// 삭제할 메뉴 이름을 입력받은 뒤
    				// HashMap안의 값을 삭제하기
    				// 없는 메뉴를 삭제하려고 할 때 막아주기
    				System.out.print("삭제할 메뉴 >> ");
    				String name = sc.nextLine(); // 사용자로부터 메뉴 입력 받음
    
    				if (MapTask.existKey(menus, name)) { // menus에 name이라는 값이 있다면
    					// 삭제
    					menus.remove(name);	// menus의 remove메소드 실행, menus에 name이라는 key 삭제
    					System.out.println("삭제 완료!");	// 삭제 완료 출력
    				} else {	// menus에 name이라는 값이 없다면
    					// 삭제 실패
    					System.out.println("해당 메뉴는 존재하지 않습니다");	// 해당 메뉴는 존재하지 않습니다 출력
    				}
    			} else if (choice == 4) {	// 4번
    				// 전체 메뉴보기
    				System.out.println("--------메뉴--------");	// 메뉴
    				// 아메리카노 : 1500원
    				// 카페테라 : 2000원
    				for (String key : menus.keySet()) {	// String타입 key에 menus에 있는 배열의 key값을 받아와 전체 반복
    					System.out.println("|" + key + " : " + menus.get(key) + "원 |");	// key와 menus의 key의 value값을 출력
    				}
    				System.out.println("-------------------");	// 메뉴 닫기
    			} else {	// 1,2,3,4,5 외의 다른 값 입력 시
    				System.out.println("잘못 입력했습니다");	// 잘못 입력했습니다 출력
    			}
    		}
    
    	}
    }

     


     

    [쓰고 싶은 말(느낀 점, 생각한 점, 각오한 점 등등]

    오늘 수업에서는 크게

    • HashMap
    • 카페 주문판 프로그램
    • 파일 입출력 이론

    에 대해 배웠다. 일상적으로 우리가 IT기기에서 사용하는 소프트웨어에서 파일을 만들고 수정하고 삭제하는 과정을 HashMap을 백그라운드로 사용하여 간단하게 모의적으로 카페 주문판 프로그램을 만들었는데 쉽지 않았다. JAVA2의 기술 블로그를 오랜만에 쓰는 것도 사실은 JAVA2에서 배웠던 개념들이 전부 다 어려웠기 때문에 그날 수업하고 올리는 것보다는 복습을 하고 올리는 것이 더 중요하다고 생각하였기에 오늘에서야 8일 차까지 복습하여 이해하고 올 수 있었다. 첫 수업 때는 흔하게 말하는 코드의 2가지 현상 [1. 이게 왜 돌아가지?]와 [2. 이게 왜 안되지?]가 있는데 2개가 반복해서 출현해서 정신이 없었는데 여러 번 듣고 그림을 그려 이해하다 보니 이제야 이해가 간다. 이전에 학습자료들이 조금 변경되었는데 업데이트해서 다시 수정하여 블로그에 올리기는 힘들어 github주소를 블로그에 연결하는 것이 더 효율적이라고 생각해서 연결해 두었다.

    'JAVA' 카테고리의 다른 글

    JAVA2_10일차  (0) 2022.02.09
    JAVA2_9일차  (0) 2022.02.08
    JAVA2_7일차  (0) 2022.01.24
    JAVA2_6일차  (0) 2022.01.21
    JAVA2_5일차  (0) 2022.01.20
Designed by Tistory.