qordpsem 2024. 5. 24. 17:31

 

영어 사전 구현

단어 입력 시 -> 단어 설명

 

단어 추가 / 단어 검색 / 단어 삭제 시스템

순서 유지 필요 ? -> 불필요 (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은 간략하게 하기를 추천해주심