👇 공부한 자료들의 실제 소스파일들을 기록해논 공간입니다 👇
수업 시작하기전 마인드 잡기
공부하기 전 중요 포인트
1. 개요를 찾는다
2. 정의를 정리한다
3. 메서드를 알아본다
4. 예제를 살펴본다
5. 나만의 것으로 만든다
오늘의 연구 주제 : HashMap
HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다.
Map 인터페이스를 상속하고 있기에 Map의 성질을 그대로 가지고 있습니다.
Map은 키와 값으로 구성된 Entry객체를 저장하는 구조를 가지고 있는 자료구조입니다.
여기서 키와 값은 모두 객체입니다.
값은 중복 저장될 수 있지만 키는 중복 저장될 수 없습니다.
만약 기존에 저장된 키와 동일한 키로 값을 저장하면
기존의 값은 없어지고 새로운 값으로 대치됩니다.
HashMap은 이름 그대로 해싱(Hashing)을 사용하기 때문에
많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보입니다.
특징 정리
1. key와 Value를 갖는 자료구조 타입이다.
2. 해시함수를 통해 키와 값이 저장되는 위치를 결정한다
3. 위치는 알 수 없다, 삽입되는 순서와 들어있는 위치 또한 관계없다
4. 데이터 검색이 가장 빠르고 추가 삭제도 빠르다
5. key값을 통해서 검색이 가능하다.
6. key값는 중복될 수 없다, value값은 같은 key값이 다르다면 중복 가능하다
단점
저장공간보다 값이 추가로 들어올 땐 List같이 저장공간을 추가로 증가하지만
List와 다르게 한 칸씩 늘리는 개념이 아니라 약 두배로 늘리기 때문에 과부하가 많이 발생할 수 있다.
초기에 저장할 데이터 개수를 알고 있다면 map의 초기 용량을 지정해 주는 것이 좋다
요소 접근 시 오직 키로만 검색해야 한다.
주요 메서드
실습 : 단어장 만들기
hashMap을 사용하여 단어장 만들기
조건
메뉴 : 1. 등록 , 2. 검색 , 3. 삭제 , 4. 전체보기 , 5. 종료
lv 1 : key 영단어 value : 한글 의미 1개 입력후 저장
lv 2 : key 영단어 value : 중요도 저장 하고 , 의미를 여러 개 저장한다
기능 추가 미션
1번
단어는 최대 5개만 저장하도록 한다
단어 추가 기능 선택 후 단어 추가 가능 여부를 체크하여 출력한다
2번
단어의 중요도에 따라 상은 별표 ***
중은 별표 **
하는 별표 * 를 단어 옆에 출력
3번
단어 맞추기 게임 기능 추가
단어의 모든 키를 arrayList에 등록한다
모든 단어의 랜덤한 위치 2개에 알파벳 대신 * 를 표시하여 출력한다
이때 첫 번째 글자는 마스킹에서 제외한다
예를 들어 apple 단어 일 경우 a ** le , ap*l* , app** 같이 표시될 수 있도록 한다
키보드로 해당 단어를 완성하여 입력하면 정답, 오답 채점하여 출력한다
클래스 다이어그램
작성한 코드 내용
package study;
import wordpad.WordPadInfo;
public class Main {
public static void main(String[] args) {
/*
hashMap을 사용하여 단어장 만들기
메뉴 : 1. 등록 , 2. 검색 , 3. 삭제 , 4. 전체보기 , 5. 종료
lv 1 : key 영단어 value : 한글 의미 1개 입력후 저장
lv 2 : key 영단어 value : 중요도 저장 하고 , 의미를 여러 개 저장한다
*/ new WordPadInfo();
}
}
package wordpad;
import java.util.ArrayList;
// 단어의 정의
public class Word {
private int point;
private ArrayList<String> korWordList= new ArrayList<>();
public Word(){}
public ArrayList<String> getKorWordList() {
return korWordList;
}
public void setKorWordList(String text) {
this.korWordList.add(text);
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
}
package wordpad;
import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
public class WordPadInfo {
private Scanner in = new Scanner(System.in);
private HashMap<String, Word> wordList = new HashMap<>();
private Word w = null;
private ArrayList<String> gameWord = new ArrayList<>();
public WordPadInfo() {
boolean flag = true;
while (flag) {
info();
int userNum = in.nextInt();
in.nextLine();
switch (userNum) {
case 1: // 단어 등록
addWord();
break;
case 2: // 단어 검색
searchWord();
break;
case 3: // 단어 삭제
delWord();
break;
case 4: // 단어 전체 보기
totalWord();
break;
case 5: // 단어 맞추기 게임
gameStart();
break;
case 6:
System.out.println("프로그램 종료");
flag = false;
break;
default:
System.out.println("등록된 번호가 아닙니다. 다시 입력하세요");
}
}
}
private void gameStart() {
Random r = new Random();
for (String key : wordList.keySet()) {
gameWord.add(key);
}
System.out.println("영단어 맞추기 게임입니다. 시작 희망시 Enter");
in.nextLine();
int cnt = 0;
while (cnt < 5) {
String taskStr = gameWord.get(r.nextInt(wordList.size() - 1) + 1);
char[] randomChar = new char[taskStr.length()];
for (int i = 0; i < randomChar.length; i++) { randomChar[i] = taskStr.charAt(r.nextInt(taskStr.length()/2)+1);}
System.out.print(" 문제 : ");
for (int i = 0; i < taskStr.length(); i++) {
char tmp = taskStr.charAt(i);
if (tmp == randomChar[i]) System.out.print("*");
else System.out.print(tmp);
}
String userText = inputString(" 정답").toUpperCase();
if (taskStr.toUpperCase().equals(userText)) {
System.out.println("정답입니다");
cnt++;
} else System.out.println("오답입니다");
}
}
// 영어 단어 전체 보기
private void totalWord() {
System.out.println("전체 단어 보기 입니다");
for (String key : wordList.keySet()) {
w = finderWord(key);
wordPrt(w, key);
}
}
// 영어 단어 삭제
private void delWord() {
System.out.println("단어 삭제 입니다");
String engWord = inputString("삭제 할 영어 단어");
if (finderWord(engWord) != null) {
wordList.remove(engWord);
System.out.println(engWord + " 단어 삭제 완료");
} else System.out.println(engWord + " 해당 단어는 찾을 수 없습니다");
}
// 단어 검색 기능
private void searchWord() {
System.out.println("단어 검색 메뉴 입니다");
String engWord = inputString("검색 영단어");
if (finderWord(engWord) != null) {
w = finderWord(engWord);
wordPrt(w, engWord);
} else System.out.println(engWord + " 단어는 검색 할 수 없습니다. ");
}
// 단어장 추가 메서드
private void addWord() {
w = new Word();
int point = Integer.parseInt(inputString("중요도 : 상 3 / 중 2 / 하 1 "));
String engWord = inputString("영어 단어");
if (finderWord(engWord) == null) {
System.out.println("한글 단어 등록 횟수 (최소1 ~ 최대 5회)");
int loopNum = Integer.parseInt(inputString("단어 횟수"));
if (loopNum <= 5 && loopNum >= 1) {
for (int i = 0; i < loopNum; i++) {
String korWord = inputString("한글 단어");
w.setKorWordList(korWord);
w.setPoint(point);
wordList.put(engWord, w);
}
System.out.println("중요도 [ "+point +" ]\n\t"+engWord +" 정상 등록 되었습니다");
} else System.out.println("최소 1회 , 최대 5회까지 가능합니다.");
} else System.out.println("해당 단어는 이미 등록된 단어입니다");
}
// 입출력 메서드
private String inputString(String text) {
System.out.print(text + "입력 >> ");
return in.nextLine();
}
// 매개변수 : w 주소값 , hashmap단어 -> 출력 메서드
private void wordPrt(Word w, String engWord) {
StringBuilder star = new StringBuilder();
for (int i = 0; i < w.getPoint(); i++) {
star.append("*");
}
System.out.println("영어 단어 : " + engWord + "[ " + star + " ]");
for (int i = 0; i < w.getKorWordList().size(); i++) {
System.out.println("한글 단어 : " + w.getKorWordList().get(i));
}
System.out.println("--------------------------------------");
}
// 매개변수 : hash key단어 -> 리턴 key의 value private Word finderWord(String engWord) {
if (wordList.get(engWord) != null) return w = wordList.get(engWord);
return null;
}
// 인포 메서드
public void info() {
System.out.println(" 메뉴 : 1. 등록 , 2. 검색 , 3. 삭제 , 4. 전체보기 , 5. 단어맞추기 게임 , 6. 종료 ");
System.out.print(" 번호 입력 >> ");
}
}
'👩🏻💻 𝐋𝐚𝐧𝐠𝐮𝐚𝐠𝐞 > ⠀⠀⠀⠀ Jᴀᴠᴀ' 카테고리의 다른 글
2023/11/03 🐰 개인 프로젝트/자유주제 (1) | 2023.11.04 |
---|---|
2023/11/02 📝 예외처리 , I/O 입출력 (1) | 2023.11.02 |
2023/10/31 🤔 Collections Framework & ArrayList (1) | 2023.11.01 |
2023/10/30 📝 Getter & Setter (0) | 2023.11.01 |
2023/10/27 🎈접근제어자 (0) | 2023.11.01 |