05.24 과제
영어 사전 구현
단어 입력 시 -> 단어 설명
단어 추가 / 단어 검색 / 단어 삭제 시스템
순서 유지 필요 ? -> 불필요 (HashMap 사용)
#1차 시도
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Dictionary {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String, String> map = new HashMap<>();
String word, mean;
while (true) {
System.out.println("숫자 입력 = > 1 (단어 추가) 2 (단어 검색) 3 (단어 삭제) 0 (종료)");
int answer = sc.nextInt();
if (answer == 0) {
break;
}
switch (answer) {
case 1:
System.out.println("추가할 단어를 입력하세요");
word = sc.next();
System.out.println("단어의 뜻을 입력하세요");
mean = sc.next();
map.put(word, mean);
System.out.println(word + " 가 등록되었습니다");
break;
case 2:
System.out.println("검색할 단어를 입력하세요");
word = sc.next();
mean = map.get(word);
if (mean == null) {
System.out.println("없는 단어 입니다");
} else {
System.out.println(word + "의 뜻은 " + mean + "입니다");
}
break;
case 3:
System.out.println("삭제할 단어를 입력하세요");
word = sc.next();
if (map.get(word) == null) {
System.out.println("없는 단어 입니다");
} else {
map.remove(word);
}
System.out.println(word + "가 삭제되었습니다");
break;
default:
System.out.println("올바른 숫자를 입력하세요");
}
}
}
}
#결과
map >> 중복 불가능
처음 apple을 사과로 등록했으나, 두번째 apple을 바나나로 중복 등록 시 먼저 저장한 값은 사라짐
#2차 시도
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Dictionary {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String, String> map = new HashMap<>();
String word, mean;
while (true) {
System.out.println("숫자 입력 = > 1 (단어 추가) 2 (단어 검색) 3 (단어 삭제) 0 (종료)");
int answer = sc.nextInt();
if (answer == 0) {
break;
}
switch (answer) {
case 1:
System.out.println("추가할 단어를 입력하세요");
word = sc.next();
if (map.get(word) != null) {
System.out.println("이미 존재하는 단어입니다. 덮어쓰시겠습니까?\n 1 (네) 2 (아니요)");
int answer2 = sc.nextInt();
if (answer2 == 1) {
System.out.println("단어의 뜻을 입력하세요");
mean = sc.next();
map.put(word, mean);
System.out.println(word + " 가 등록되었습니다");
break;
} else if (answer2 == 2) {
System.out.println("초기화면으로 돌아갑니다");
break;
} else {
System.out.println("올바른 숫자를 입력하세요");
break;
}
} else {
System.out.println("단어의 뜻을 입력하세요");
mean = sc.next();
map.put(word, mean);
System.out.println(word + " 가 등록되었습니다");
break;
}
case 2:
System.out.println("검색할 단어를 입력하세요");
word = sc.next();
mean = map.get(word);
if (mean == null) {
System.out.println("없는 단어 입니다");
} else {
System.out.println(word + "의 뜻은 " + mean + "입니다");
}
break;
case 3:
System.out.println("삭제할 단어를 입력하세요");
word = sc.next();
if (map.get(word) == null) {
System.out.println("없는 단어 입니다");
} else {
map.remove(word);
}
System.out.println(word + "가 삭제되었습니다");
break;
default:
System.out.println("올바른 숫자를 입력하세요");
}
}
}
}
단어 추가 시 이미 등록된 값인지 검증하는 코드 추가
#결과
1. 이미 있는 단어 추가 시 덮어쓰거나, 취소하는 기능 잘 됨
2. 단어 검색도 잘 됨
3. 단어 삭제 시 없는 단어를 입력하면 '없는 단어 입니다' 뒤에 '삭제되었습니다' 까지 뜸..
#개선해볼 사항
1. 삭제되었습니다 문구 else 중괄호 안에 넣기
2. 여러번 중복된 map.get(word) 처음부터 변수 지정해주기...?
#3차 시도
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Dictionary {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String, String> map = new HashMap<>();
String word="", mean = map.get(word);
while (true) {
System.out.println("숫자 입력 = > 1 (단어 추가) 2 (단어 검색) 3 (단어 삭제) 0 (종료)");
int answer = sc.nextInt();
if (answer == 0) {
break;
}
switch (answer) {
case 1:
System.out.println("추가할 단어를 입력하세요");
word = sc.next();
if (mean != null) {
System.out.println("이미 존재하는 단어입니다. 덮어쓰시겠습니까?\n 1 (네) 2 (아니요)");
int answer2 = sc.nextInt();
if (answer2 == 1) {
System.out.println("단어의 뜻을 입력하세요");
mean = sc.next();
map.put(word, mean);
System.out.println(word + " 가 등록되었습니다");
break;
} else if (answer2 == 2) {
System.out.println("초기화면으로 돌아갑니다");
break;
} else {
System.out.println("올바른 숫자를 입력하세요");
break;
}
} else {
System.out.println("단어의 뜻을 입력하세요");
mean = sc.next();
map.put(word, mean);
System.out.println(word + " 가 등록되었습니다");
break;
}
case 2:
System.out.println("검색할 단어를 입력하세요");
word = sc.next();
if (mean == null) {
System.out.println("없는 단어 입니다");
} else {
System.out.println(word + "의 뜻은 " + mean + "입니다");
}
break;
case 3:
System.out.println("삭제할 단어를 입력하세요");
word = sc.next();
if (mean == null) {
System.out.println("없는 단어 입니다");
} else {
map.remove(word);
System.out.println(word + "가 삭제되었습니다");
}
break;
default:
System.out.println("올바른 숫자를 입력하세요");
}
}
}
}
#결과
오류 파티... 난리남...
추가한적 없는데 중복됐다고 뜨고..
map.get(word) 을 변수 지정하는건 잘못된 선택이었던것 같다..
+추가
강사님께 여쭤봤는데, 변수들의 값이 다 다른데 이름이 같다는 이유만으로 하나의 변수로 묶으면 안된다고 말해주셨다.. 더 간단한 코드로 설명을 들었더니 이해가 갔다
예전에 프로젝트할때 코드 리팩토링 상황에서 중복되는 메소드가있으면 하나로 묶어서 코드 재사용성을 높이는걸 한적이 있는데 그부분과 혼동했던 것 같다..
#최종 코드
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Dictionary {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Map<String, String> map = new HashMap<>();
String word, mean;
while (true) {
System.out.println("숫자 입력 = > 1 (단어 추가) 2 (단어 검색) 3 (단어 삭제) 0 (종료)");
int answer = sc.nextInt();
if (answer == 0) {
break;
}
switch (answer) {
case 1:
System.out.println("추가할 단어를 입력하세요");
word = sc.next();
if (map.get(word) != null) {
System.out.println("이미 존재하는 단어입니다. 덮어쓰시겠습니까?\n 1 (네) 2 (아니요)");
int answer2 = sc.nextInt();
if (answer2 == 1) {
System.out.println("단어의 뜻을 입력하세요");
mean = sc.next();
map.put(word, mean);
System.out.println(word + " 가 등록되었습니다");
break;
} else if (answer2 == 2) {
System.out.println("초기화면으로 돌아갑니다");
break;
} else {
System.out.println("올바른 숫자를 입력하세요");
break;
}
} else {
System.out.println("단어의 뜻을 입력하세요");
mean = sc.next();
map.put(word, mean);
System.out.println(word + " 가 등록되었습니다");
break;
}
case 2:
System.out.println("검색할 단어를 입력하세요");
word = sc.next();
mean = map.get(word);
if (mean == null) {
System.out.println("없는 단어 입니다");
} else {
System.out.println(word + "의 뜻은 " + mean + "입니다");
}
break;
case 3:
System.out.println("삭제할 단어를 입력하세요");
word = sc.next();
if (map.get(word) == null) {
System.out.println("없는 단어 입니다");
} else {
map.remove(word);
System.out.println(word + "가 삭제되었습니다");
}
break;
default:
System.out.println("올바른 숫자를 입력하세요");
}
}
}
}
#결과
1. 단어추가 - O
2. 단어 중복 추가 시 덮어쓰기 - O
3. 단어검색 - O
4. 단어삭제 - O
#과제 피드백
단어 추가, 검색, 삭제 method 각각 따로 빼서 main은 간략하게 하기를 추천해주심