포슀트

πŸ§‘β€πŸ’» 개인 ν”„λ‘œμ νŠΈ - μ£Όμ†Œλ‘ λ§Œλ“€κΈ° (JAVA)

JAVA둜 κ΅¬ν˜„λœ μ£Όμ†Œλ‘ 관리 (CRUD) Project μž…λ‹ˆλ‹€.

πŸ§‘β€πŸ’» 개인 ν”„λ‘œμ νŠΈ - μ£Όμ†Œλ‘ λ§Œλ“€κΈ° (JAVA)

JAVA μ£Όμ†Œλ‘ 관리 ν”„λ‘œκ·Έλž¨


1. ν”„λ‘œμ νŠΈ μ†Œκ°œ

ㅀ이 ν”„λ‘œμ νŠΈλŠ” JAVA둜 κ΅¬ν˜„λœ μ£Όμ†Œλ‘ 관리 ν”„λ‘œκ·Έλž¨μž…λ‹ˆλ‹€.

γ…€μ‚¬μš©μž 정보λ₯Ό μž…, 좜λ ₯ν•  수 있으며 μˆ˜μ •, μ‚­μ œ, μ‘°νšŒκ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

κ°œλ°œν™˜κ²½ Eclipse / JDK 17

2. ν”„λ‘œμ νŠΈ ꡬ쑰

상세 κ΅¬μ‘°λŠ” νŽ˜μ΄μ§€ μƒλ‹¨μ˜ κΉƒν—ˆλΈŒ 링크λ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”

πŸ“src
  β””β”€β”€πŸ“common.utils - πŸ“„λ¬Έμžμ—΄ 처리, λ‚ μ§œ 계산, ν•œκΈ€ μ΄ˆμ„± μΆ”μΆœ μœ ν‹Έλ¦¬ν‹°
  β””β”€β”€πŸ“console.academy - πŸ“„μ£Όμ†Œλ‘ 메뉴 , CRUD 둜직

3. μ£Όμš” μ½”λ“œ

CommonUtils.java

μ•„λž˜ μ½”λ“œλŠ” 곡톡 μœ ν‹Έλ¦¬ν‹° λ©”μ†Œλ“œλ“€μ„ ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ£Όμš” κΈ°λŠ₯μœΌλ‘œλŠ” λ¬Έμžμ—΄μ΄ μˆ«μžμΈμ§€ 체크, 두 λ‚ μ§œμ˜ 차이λ₯Ό κ΅¬ν•˜λŠ” λ©”μ†Œλ“œ, λ¬Έμžμ—΄μ„ int λ°°μ—΄λ‘œ λ³€ν™˜ν•˜λŠ” λ©”μ†Œλ“œ, ν•œκΈ€ μ΄ˆμ„±μ„ μΆ”μΆœν•˜λŠ” λ©”μ†Œλ“œ 등이 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

      
      
      
  public class CommonUtils {
  
    // λ¬Έμžμ—΄μ΄ 숫자 ν˜•μ‹μ΄λ©΄ true, μ•„λ‹ˆλ©΄ false λ°˜ν™˜ λ©”μ†Œλ“œ
    public static boolean isNumber(String value) {		
      for(int i=0; i < value.length(); i++) {
        int code = Character.codePointAt(value, i);
        if(!(code >= '0' && code <= '9')) return false; // μˆ«μžκ°€ μ•„λ‹Œ λ¬Έμžκ°€ 있으면 false
      }		
      return true; // λͺ¨λ“  λ¬Έμžκ°€ 숫자일 경우 true λ°˜ν™˜
    }
  
    // 두 λ‚ μ§œ 차이λ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ†Œλ“œ
    // λ§€κ°œλ³€μˆ˜: String νƒ€μž…μ˜ 두 λ‚ μ§œ, λ‚ μ§œ νŒ¨ν„΄, κ΅¬λΆ„μž(λ‹¨μœ„)
    public static long getDiffBetweenDates(String stFDate, String stSDate, String pattern, char delim) throws ParseException {
      // 1. λ§€κ°œλ³€μˆ˜μ— μ „λ‹¬λœ pattern으둜 SimpleDateFormat 객체 생성
      SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
      // 2. λ‚ μ§œ ν˜•μ‹μ˜ String -> Date : parse()
      Date fDate = dateFormat.parse(stFDate);
      Date sDate = dateFormat.parse(stSDate);
      // 3. μ‹œκ°„μ°¨ κ΅¬ν•˜κΈ°: getTime()
      long fTime = fDate.getTime();
      long sTime = sDate.getTime();
      long diff = Math.abs(fTime - sTime);
      // 4. λ§€κ°œλ³€μˆ˜ delim에 λ”°λ₯Έ λ‚ μ§œ 차이 λ°˜ν™˜
      switch(Character.toUpperCase(delim)) {
        case 'D': return diff / 1000 / 60 / 60 / 24; // λ‚ μ§œ 차이
        case 'H': return diff / 1000 / 60 / 60; // μ‹œκ°„ 차이
        case 'M': return diff / 1000 / 60; // λΆ„ 차이
        default: return diff / 1000; // 기본적으둜 초 차이
      }
    }
  
    // λ¬Έμžμ—΄μ„ int[] λ°°μ—΄λ‘œ λ³€ν™˜
    public static int[] toIntArray(String value) {
      int[] intArray = new int[value.length()];
      for(int i = 0; i < value.length(); i++)
        intArray[i] = (int)value.charAt(i); // 각 λ¬Έμžμ— λŒ€ν•œ μœ λ‹ˆμ½”λ“œ κ°’μœΌλ‘œ λ³€ν™˜
      return intArray;
    }
  
    // μ£Όμ–΄μ§„ 문자의 μ΄ˆμ„±μ„ μΆ”μΆœν•˜λŠ” λ©”μ†Œλ“œ
    public static char getInitialConsonant(String value) {
      // μœ νš¨ν•œ ν•œκΈ€μΈμ§€ 체크
      if(!Pattern.matches("^[κ°€-힣]{2,}$", value.trim())) return '0'; // ν•œκΈ€μ΄ μ•„λ‹ˆλ©΄ '0' λ°˜ν™˜
      char lastName = value.trim().charAt(0); // 첫 번째 문자 κ°€μ Έμ˜€κΈ°
      // μ΄ˆμ„±μ˜ 인덱슀 계산
      int index = (lastName - 'κ°€') / 28 / 21;
      char[] initialConsonant = {'γ„±','γ„²','γ„΄','γ„·','γ„Έ','γ„Ή','ㅁ','γ…‚','γ…ƒ','γ……','γ…†','γ…‡','γ…ˆ','γ…‰','γ…Š','γ…‹','γ…Œ','ㅍ','γ…Ž'};
      return initialConsonant[index]; // ν•΄λ‹Ή μ΄ˆμ„± λ°˜ν™˜
    }
  
  }

  
AddressApp.java

μ•„λž˜ μ½”λ“œλŠ” μ£Όμ†Œ 관리 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 메인 λ‘œμ§μ„ κ΅¬ν˜„ν•œ κ²ƒμž…λ‹ˆλ‹€.

μ‚¬μš©μžλŠ” 메뉴λ₯Ό μ„ νƒν•˜μ—¬ μ£Όμ†Œ κ΄€λ ¨ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

메인 λ©”λ‰΄μ—μ„œλŠ” μ£Όμ†Œ μΆ”κ°€, μ‚­μ œ, μˆ˜μ • λ“±μ˜ κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

      
      
      
  public class AddressApp {

    public static void main(String[] args) {
        
      // AddressLogic 객체 생성
      AddressLogic logic = new AddressLogic();
      
      while(true) {
          // 1. 메인 메뉴 좜λ ₯
          logic.printMainMenu();
          
          // 2. 메인 메뉴 번호 μž…λ ₯ λ°›κΈ°
          int mainMenu = logic.getMenuNumber();
          
          // 3. 메인 메뉴에 λ”°λ₯Έ λΆ„κΈ°
          logic.seperateMainMenu(mainMenu);
      }
    }
  }
      
    
AddressLogic.java

μ•„λž˜ μ½”λ“œλŠ” μ£Όμ†Œλ‘ 관리 상세 κΈ°λŠ₯을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

μ£Όμ†Œλ‘μ— μ‚¬λžŒμ„ μΆ”κ°€, μˆ˜μ •, μ‚­μ œ, 검색 및 좜λ ₯ν•  수 있으며 μ‚¬μš©μžμ—κ²Œ κΈ°λŠ₯에 λ§žλŠ” μ μ ˆν•œ λ©”μ„Έμ§€λ₯Ό μ „λ‹¬ν•©λ‹ˆλ‹€.

      
      
      
  public class AddressLogic {
    //λ©€λ²„λ³€μˆ˜
    List<Person> person;
    
    //μƒμ„±μž
    public AddressLogic() {
        person = new Vector<>();
    }

    //멀버 λ©”μ†Œλ“œ

    // 1.메뉴 좜λ ₯용 λ©”μ†Œλ“œ
    public void printMainMenu() {
        System.out.println("====================μ£Όμ†Œλ‘ 메뉴====================");
        System.out.println(" 1.μž…λ ₯ 2.좜λ ₯ 3.μˆ˜μ • 4.μ‚­μ œ 5.검색 9.μ’…λ£Œ");
        System.out.println("===============================================");
        System.out.println("메뉴 번호λ₯Ό μž…λ ₯ν•˜μ„Έμš”?");
    }

    //2.메뉴 번호 μž…λ ₯용 λ©”μ†Œλ“œ
    public int getMenuNumber() {
        Scanner sc = new Scanner(System.in);
        int menu = -1;
        while(true) {
            try {
                String menuStr = sc.nextLine().trim();
                menu = Integer.parseInt(menuStr);
                break;
            } catch(Exception e) {
                System.out.println("숫자만 μž…λ ₯ν•˜μ„Έμš”");
            }
        } // while
        return menu;
    }

    // 3.메뉴 λ²ˆν˜Έμ— λ”°λ₯Έ λΆ„κΈ°μš© λ©”μ†Œλ“œ
    public void seperateMainMenu(int mainMenu) {
        switch(mainMenu) {
            case 1://μž…λ ₯
                setPerson();
                break;
            case 2://좜λ ₯
                printPersonByInitial();
                break;
            case 3://μˆ˜μ •
                updatePerson();
                break;
            case 4://μ‚­μ œ
                deletePerson();
                break;
            case 5://검색
                searchPerson();
                break;
            case 9://μ’…λ£Œ
                System.out.println("ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•©λ‹ˆλ‹€");
                System.exit(0);
            default:
                System.out.println("메뉴에 μ—†λŠ” λ²ˆν˜Έμž…λ‹ˆλ‹€");
        } // switch
    }

    public void setPerson() {
        Scanner sc = new Scanner(System.in);
        System.out.println(">>>이름을 μž…λ ₯ν•˜μ„Έμš”?");
        String name = sc.nextLine().trim();
        System.out.println(">>>λ‚˜μ΄λ₯Ό μž…λ ₯ν•˜μ„Έμš”?");
        int age = -1;
        while(true) {
            try {
                age = Integer.parseInt(sc.nextLine().trim());
                break;
            } catch(NumberFormatException e) {
                System.out.println("λ‚˜μ΄λŠ” 숫자둜만 μž…λ ₯ν•˜μ„Έμš”");
            }
        }
        System.out.println(">>μ‚¬λŠ”κ³³μ„ μž…λ ₯ν•˜μ„Έμš”");
        String place = sc.nextLine().trim();
        System.out.println(">>>μ—°λ½μ²˜λ₯Ό μž…λ ₯ν•˜μ„Έμš”");
        String PhoneNumber = sc.nextLine().trim();
        person.add(new Person(name, age, place, PhoneNumber));
        System.out.println("μž…λ ₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€\r\n");
    }

    private void printPersonByInitial() {
        Map<Character, List<Person>> personMap = new HashMap<>();

        // μ΄λ¦„μ˜ μ΄ˆμ„±μ— 따라 μ‚¬λžŒμ„ κ·Έλ£Ήν™”
        for (Person p : person) {
            char initialConsonant = CommonUtils.getInitialConsonant(p.name);
            List<Person> group = personMap.getOrDefault(initialConsonant, new ArrayList<>());
            group.add(p);
            personMap.put(initialConsonant, group);
        }

        // μ΄ˆμ„±λ³„λ‘œ κ·Έλ£Ήν™”λœ μ‚¬λžŒλ“€μ„ 좜λ ₯
        boolean isEmpty = true; // λͺ…단이 λΉ„μ–΄μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•˜κΈ° μœ„ν•œ ν”Œλž˜κ·Έ
        for (char consonant = 'γ„±'; consonant <= 'γ…Ž'; consonant++) {
            List<Person> group = personMap.get(consonant);
            if (group != null && !group.isEmpty()) {
                isEmpty = false; // λΉ„μ–΄μžˆμ§€ μ•Šμ€ 그룹이 μ‘΄μž¬ν•˜λ©΄ ν”Œλž˜κ·Έλ₯Ό false둜 λ³€κ²½
                System.out.println("[" + consonant + " 으둜 μ‹œμž‘ν•˜λŠ” λͺ…단]");
                for (Person p : group) {
                    p.print();
                }
            }
        }

        // λͺ…단이 λΉ„μ–΄μžˆμ„ λ•Œ λ©”μ‹œμ§€ 좜λ ₯
        if (isEmpty) {
            System.out.println("좜λ ₯ν•  λͺ…단이 μ—†μŠ΅λ‹ˆλ‹€");
        }
    }

    //7.κ²€μƒ‰μš© λ©”μ†Œλ“œ
    private void searchPerson() {
        Person findPerson = findPersonByName("검색");
        if (findPerson != null) {
            System.out.println(String.format("[%s둜 κ²€μƒ‰ν•œ κ²°κ³Ό]", findPerson.name));
            findPerson.print();
        }
    }

    public Person findPersonByName(String message) {
        System.out.println(message + "ν•  μ‚¬λžŒμ˜ 이름을 μž…λ ₯ν•˜μ„Έμš”?");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine().trim();

        for (Person p : person)
            if (p.name.equals(name))
                return p;
        System.out.println(name + "둜(으둜) κ²€μƒ‰λœ 정보가 μ—†μ–΄μš”");
        return null;
    }

    //9.μˆ˜μ •μš© λ©”μ†Œλ“œ
    private void updatePerson() {
        Person findPerson = findPersonByName("μˆ˜μ •");
        if (findPerson != null) {
            Scanner sc = new Scanner(System.in);
            System.out.printf("(ν˜„μž¬ λ‚˜μ΄ %s) λͺ‡ μ‚΄λ‘œ μˆ˜μ •ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?%n", findPerson.age);
            while(true) {
                try {
                    findPerson.age = Integer.parseInt(sc.nextLine().trim());
                    break;
                } catch(Exception e) {
                    System.out.println("λ‚˜μ΄λŠ” 숫자만 μž…λ ₯ν•˜μ„Έμš”");
                }
            } // while
            System.out.printf("(ν˜„μž¬ μ£Όμ†Œ %s) μ–΄λŠ μ£Όμ†Œλ‘œ μˆ˜μ •ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?%n", findPerson.place);
            findPerson.place = sc.nextLine().trim();
            System.out.printf("(ν˜„μž¬ μ—°λ½μ²˜ %s) μ–΄λ–€ 번호둜 μˆ˜μ •ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?%n", findPerson.PhoneNumber);
            findPerson.PhoneNumber = sc.nextLine().trim();

            System.out.printf("[%sκ°€(이) μ•„λž˜μ™€ 같이 μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€]%n", findPerson.name);
            findPerson.print(); // μˆ˜μ • λ‚΄μš©μ„ ν™•μΈν•˜κΈ° μœ„ν•œ 좜λ ₯
        }
    }

    //10.μ‚­μ œμš©
    private void deletePerson() {
        Person findPerson = findPersonByName("μ‚­μ œ");
        if (findPerson != null) {
            for (Person p : person)
                if (findPerson.equals(p)) {
                    person.remove(p);
                    System.out.printf("[%sκ°€(이) μ‚­μ œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€]%n", findPerson.name);
                    break;
                }
        }
    }
}
      
    
Person.java

μ•„λž˜ μ½”λ“œλŠ” μ‚¬λžŒμ˜ 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 클래슀둜, 이름, λ‚˜μ΄, κ±°μ£Όμ§€, μ—°λ½μ²˜λ₯Ό ν•„λ“œλ‘œ κ°€μ§‘λ‹ˆλ‹€.

κΈ°λ³Έ μƒμ„±μžμ™€ 인자 μƒμ„±μžλ₯Ό μ œκ³΅ν•˜λ©°, μ‚¬λžŒμ˜ 정보λ₯Ό λ¬Έμžμ—΄ ν˜•μ‹μœΌλ‘œ λ°˜ν™˜ν•˜λŠ” λ©”μ†Œλ“œμ™€ 좜λ ₯ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.

      
      
      
  public class Person implements Serializable {

    //[ν•„λ“œ] 클래슀의 속성 μ •μ˜
    public String name;  // μ‚¬λžŒμ˜ 이름
    public int age;      // μ‚¬λžŒμ˜ λ‚˜μ΄
    public String place; // μ‚¬λžŒμ˜ κ±°μ£Όμ§€
    public String PhoneNumber; // μ‚¬λžŒμ˜ μ—°λ½μ²˜

    // κΈ°λ³Έ μƒμ„±μž - ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šκ³  객체λ₯Ό μƒμ„±ν•˜λŠ” μƒμ„±μž
    public Person() {}

    // 인자 μƒμ„±μž - ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” μƒμ„±μž
    public Person(String name, int age, String place, String PhoneNumber) {        
        this.name = name;  // 이름 μ΄ˆκΈ°ν™”
        this.age = age;    // λ‚˜μ΄ μ΄ˆκΈ°ν™”
        this.place = place;  // κ±°μ£Όμ§€ μ΄ˆκΈ°ν™”
        this.PhoneNumber = PhoneNumber;  // μ—°λ½μ²˜ μ΄ˆκΈ°ν™”
    }

    //멀버 λ©”μ†Œλ“œ
    
    // 1.μ‚¬λžŒμ˜ 정보λ₯Ό λ°˜ν™˜ν•˜λŠ” λ©”μ†Œλ“œ
    String get() {
        return String.format("이름:%s, λ‚˜μ΄:%d, μ‚¬λŠ” κ³³:%s, μ—°λ½μ²˜:%s", name, age, place, PhoneNumber);
    }

    // 2.μ‚¬λžŒμ˜ 정보λ₯Ό 좜λ ₯ν•˜λŠ” λ©”μ†Œλ“œ
    void print() {
        System.out.println(get());  // get() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜μ—¬ 좜λ ₯
    }
  }
      
    

4. μ‹€ν–‰ κ²°κ³Ό

μž…λ ₯ / 좜λ ₯
μˆ˜μ • / 좜λ ₯
μ‚­μ œ / 검색
이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.