KDT 공부 일지 - 2026.01.06

김시코·2026년 1월 6일

KDT 공부 일지

목록 보기
1/27

2026년 1월 6일 화요일 - 3주차


공부 방법

참고사항1: 데이터 삽입, 삭제, 수정... 목록 등등 << 사실 DB(SQL)에서 함.
참고사항2: 블로그에 있는 "여기까지가 중요" << 부분은 꼭 해내야 함. 나머지는 되면 좋고...
(문법적인 부분들이 여기에 다 나오니까 이걸로 문법을 공부해라)

1. 위에 코드를 기반으로 문법을 이해하려고 노력. (한줄한줄 다 아는게 왠만하면 좋음)
2. 충분히 반복 (목적: 사용에 익숙해진다 - 자연스럽게 이해가 되는 부분들이 생김)
3. 반복 이후에 남은 어려운 부분들은 다시 공부
4. 복기 - 안보고 다시 짤 수 있는것.
(복기 하다가 막히는 부분이 자신이 모르는 부분이다. 3번으로 올라갈것 = 단, 절대 외우지 말것)
5. 응용 - 고도화, 추가기능 구현, 다른 프로그램 만들기(할일관리, 가계부...)


첫 Java 프로그램 작성

지금까지는 문법 공부를 위한 간단한 예제들만을 풀어왔다. 하지만 오늘은 제대로 동작하는 CLI 프로그램을 하나 만들었다.

학생을 관리하는 프로그램이며, 간단한 요구사항은 다음과 같다.

  • 사용자는 학생의 이름, 나이, 점수를 입력 할 수 있다.
  • 이 프로그램의 기능으로는 학생 정보 입력, 학생 정보 출력, 학생 정보 검색. 학생 정보 수정, 학생 정보 통계 등이 있다.

StudentManagerV1 기본 구조

본격적인 프로그램 제작에 앞서 먼저 기본 구조는 이렇게 구성된다.

Scanner scanner = new Scanner(System.in);
// 입력 도구 사용할때 우선 그냥 하나 있어야됨

        // 초기 실행 UI
        System.out.println("***************************");
        System.out.println("*    학생 관리 프로그램   *");
        System.out.println("*           version 1.0   *");
        System.out.println("***************************");

        while(true) {
            // 메뉴 출력
            System.out.println("[ 명령 메뉴 ]");
            System.out.println("1. 학생 정보 등록");
            System.out.println("2. 학생 정보 목록");
            System.out.println("3. 학생 정보 검색");
            System.out.println("4. 학생 정보 삭제");
            System.out.println("5. 학생 정보 수정");
            System.out.println("6. 학생 정보 통계");
            System.out.println("0. 프로그램 종료");

            System.out.print("명령 입력 > ");
            String command = scanner.nextLine();

            if(command.equals("0")) {
                break;
            } 
            
            if(command.equals("1")) {
                System.out.println("[test] 사용자 등록 로직 코드 실행");
            } else if(command.equals("2")) {
                System.out.println("[test] 사용자 목록 로직 코드 실행");
            } else if(command.equals("3")) {
                System.out.println("[test] 사용자 검색 로직 코드 실행");
            } else if(command.equals("4")) {
                System.out.println("[test] 사용자 삭제 로직 코드 실행");
            } else if(command.equals("5")) {
                System.out.println("[test] 사용자 수정 로직 코드 실행");
            } else if(command.equals("6")) {
                System.out.println("[test] 사용자 통계 로직 코드 실행");
            } else {
                // 예외
                System.out.println("잘못된 명령어 입니다. 다시 입력해주세요.");
            }

            // 한번 멈춰서 가독성을 용이하게 함.
            System.out.println("계속 하시려면 enter를 입력해주세요.");
            scanner.nextLine();

        }

        System.out.println("프로그램이 종료 됩니다. 이용해주셔서 감사합니다.");

    }
}

본격적으로 코드를 작성하기 전, 간단한 코드 분석

먼저 사용자에게 우리의 프로그램이 어떤 프로그램인지를 알리는 초기 UI 출력문이 실행된다.
그 다음으로 사용자가 기능을 이용하기 위해 입력해야 할 명령어를 메뉴 출력을 통해 알려준다.
그리고 사용자에게 명령어 입력을 요청하는 문장을 출력하고, 명령어를 입력 받는다. 그 후 입력받은 값을 String 타입 변수인 command에 대입하고, 줄을 바꾼 후에 if문을 실행한다.

이 프로그램에서는 명령어로 0을 입력받으면 프로그램이 종료되기 때문에, 먼저 command 값이 0인지 아닌지를 먼저 확인하고 다음으로 넘어간다. equals의 값이 true면 break문을 통해 while 반복문을 탈출하여 이 코드의 맨 마지막 줄로 이동하여 프로그램의 종료를 알린 뒤, 프로그램을 종료하게 된다.
아래의 if문과 같이 묶여있지 않은 이유는 사용성을 위해 기능실행이 끝날때마다 Enter를 입력 받고 있는데, 프로그램을 종료할 때도 이러한 것이 나오면 사용이 불편하기 때문이다.
command가 1일 경우 첫번째 if문의 내용이 실행되고, 1이 아닐경우 다음 if(else if)로 넘어간다. 여기서 또 조건을 검사하는데 command가 2일 경우에 그 안의 if문이 반복되고 아닐경우 다음으로 넘어간다. 이렇게 if문의 조건을 검사해서 결과가 참일경우 if문 안의 내용을 실행하고, 아니면 다음으로 넘어가기를 반복하다가 만약 사용자가 입력한 값인 command가 모든 if문의 조건을 만족시키지 못한다면 else문으로 넘어간다.
이번 코드에서는 else문을 예외처리를 위해 사용하였다. 사용자가 입력한 값이 메뉴 목록에 없다는 것은 명령어가 잘못 입력된 것이기 때문에 입력을 다시 해달라는 문구를 출력한다. 그리고, 기능의 실행이 끝나고 다시 메뉴 화면으로 돌아갈 때 아무런 표시없이 바로 메뉴 화면으로 돌아가게된다면 기능의 결과가 바로 보이지 않고 위로 올라가 버려서 제대로 보기 힘들뿐 아니라, 사용자가 입력을 잘못했다고 생각해버리는 경우 등, 사용성을 떨어트리는 문제가 발생할 수 있기 때문에 사용자에게 기능의 실행이 정상적으로 끝났음을 인지시키고, 사용자가 원할때 다음(메뉴출력)으로 넘어간다.

이러한 프로그램의 구조가 되는 코드를 바탕으로 기능을 강사님과 함께 작성해보았다.

완성된 StudentManagrV1 - 수정 기능 미구현

import java.util.Scanner;

public class App {
    public static void main(String[] args) throws Exception {
        // 학생 관리 프로그램
        
        // [기능 요구 사항]
        // 학생: 이름, 나이, 점수
        // 기능: 학생 등록, 목록, 검색(상세), 수정, ...

        Scanner scanner = new Scanner(System.in);
        // 입력 도구 사용할때 우선 그냥 하나 있어야 함. (API)

        String[] nameList = new String[5];
        int[] ageList = new int[5];
        int[] scoreList = new int[5];
        int count = 0;

        // 초기 실행 UI
        System.out.println("***************************");
        System.out.println("*    학생 관리 프로그램   *");
        System.out.println("*           version 1.0   *");
        System.out.println("***************************");

        while (true) {
            // 메뉴 출력
            System.out.println("[ 명령 메뉴 ]");
            System.out.println("1. 학생 정보 등록");
            System.out.println("2. 학생 정보 목록 보기");
            System.out.println("3. 학생 정보 검색");
            System.out.println("4. 학생 정보 삭제");
            System.out.println("5. 학생 정보 수정");
            System.out.println("6. 학생 정보 통계");
            System.out.println("0. 프로그램 종료");
            
            System.out.print("명령 입력 > ");
            String command = scanner.nextLine();
           
            if(command.equals("0")) {
                break;
            }

            if(command.equals("1")) {
                System.out.println("====== 학생 정보 입력 시작 ======");

                System.out.print("이름 > ");
                String name = scanner.nextLine(); // 문자 입력
                
                System.out.print("나이 > ");
                int age = Integer.parseInt(scanner.nextLine());
                // 숫자 입력 받고 싶을때 Integer.parseInt 사용

                System.out.print("점수 > ");
                int score = Integer.parseInt(scanner.nextLine());

                nameList[count] = name;
                ageList[count] = age;
                scoreList[count] = score;
                count++;

                // 배열 꽉 찼을때 2배로 늘린다.
                if(count == nameList.length) {
                    String[] newNameList = new String[count*2];
					// 배열의 index를 증가시키는게 아니고 현재 배열의 index를
                    // 담고있는 변수 count의 두배의 크기를 가지는 배열을 생성.
                    // 그 후 새로운 배열에 기존 배열의 값을 넣어줘야 한다
                    
                    // 기존 배열의 값을 복사해서 새로 만든 배열에 대입.
                    for(int i = 0; i < count; i++) {
                        newNameList[i] = nameList[i];
                    }
                    nameList = newNameList;
                    // 메모리를 깔끔하게 정리해주는 코드. 배열은 배열의 주소를
                    // 가지는 변수(메모리)가 없을때 소멸되기 때문에,
                    // nameList에 newNameList의 주소값을 넣기 때문에
                    // 원래 nameList가 가지고 있었던 배열의 주소를
                    // 가지지 않고, 원래 배열은 자신의 주소를 가지는 변수가
                    // 없기 때문에 소멸된다. 그렇기 때문에 몇번 더 반복되어도
                    // 계속 동일한 결과가 반복된다
                    int[] newAgeList = new int[count*2];                
                    for(int i = 0; i < count; i++) {
                        newAgeList[i] = ageList[i];
                    }
                    ageList = newAgeList;

                    int[] newScoreList = new int[count*2];
                    for(int i = 0; i < count; i++) {
                        newScoreList[i] = scoreList[i];
                    }
                    scoreList = newScoreList;
                }

				System.out.println("=================================");

            } else if(command.equals("2")) {
                System.out.println("====== 학생 목록 출력 시작 ======");

                for(int i = 0; i < count; i++) {
                    String text = "";
                    text += "이름: " + nameList[i];
                    text += ", 나이: " + ageList[i];
                    text += ", 점수: " + scoreList[i];
                    System.out.println(text);
                }

                System.out.println("총 " + count + "명이 존재합니다.");

                System.out.println("=================================");
            } else if(command.equals("3")) {
                System.out.println("====== 학생 검색 결과 출력 ======");

                System.out.print("검색한 이름 > ");
                String searchName = scanner.nextLine();

                int searchCount = 0;

                for(int i = 0; i < count; i++) {
                    if(nameList[i].contains(searchName)) {
                    // contains: 괄호에 있는 문자열이 접근 연산자 앞에 있는
                    // 문자열에 "포함"이 되어있는지 확인해주는 API
                    // 포함 되어있으면 true, 없으면  false를 반환해준다.
                        String text = "";
                        text += "이름: " + nameList[i];
                        text += ", 나이: " + ageList[i];
                        text += ", 점수: " + scoreList[i];
                        System.out.println(text);
                        searchCount++;
                    }
                }

                System.out.println("총: " + searchCount + "명이 검색되었습니다.");

                System.out.println("=================================");

            } else if(command.equals("4")) {
                System.out.println("====== 학생 목록 삭제 시작 ======");

                System.out.print("삭제할 학생의 이름 > ");
                String deleteName = scanner.nextLine();

                int deleteCount = 0;

                for(int i = 0; i < count; i++) {
                    if(nameList[i].equals(deleteName)) {
                        for(int x = i; x < count - 1; x++) {
                        // 아래에서 x + 1을 하니까 배열의 범위를 벗어나게 됨.
                        // count - 1 해줘야 배열의 범위를 벗어나지 않음.
                            nameList[x] = nameList[x+1];
                            ageList[x] = ageList[x+1];
                            scoreList[x] = scoreList[x+1];
                        }
                        i--;
                        // 한칸 앞으로 밀린 학생이 조건에 맞는지 확인하지 않고
                        // 넘어가기 때문에 i--을 해서 놓치지 않고 검사시킴.
                        deleteCount++;
                        count--;
                    }
                }
                System.out.println("총 " + deleteCount + "명이 삭제 되었습니다.");

                System.out.println("=================================");

            } else if(command.equals("5")) {
                System.out.println("====== 학생 목록 수정 시작 ======");



                System.out.println("=================================");
                System.out.println("[test] 사용자 수정 로직 코드 실행");
            } else if(command.equals("6")) {
                System.out.println("====== 학생 통계 출력 시작 ======");

                int scoreSum = 0;
                int ageSum = 0;
                for(int i = 0; i < count; i++) {
                    scoreSum += scoreList[i];
                    ageSum += ageList[i];
                }

                System.out.println("총 인원: " + count);
                System.out.println("평균 나이: " + ageSum/(double)count);
                System.out.println("평균 점수: " + scoreSum/(double)count);

                System.out.println("=================================");
                
            } else {
                // 예외처리
                System.out.println("잘못된 명령어 입니다. 다시 입력해주세요.");
            }

            // 멈춤
            System.out.println("계속 하시려면 Enter를 입력 해주세요.");
            // 기능 종료 직후 메뉴가 바로 나오게 되면 결과가 위로 밀리게 되어
            // 잘 보이지 않기 때문에 사용자가 오류가 난 것으로 착각할 수도 있다.
            // 그렇기 때문에 유저의 사용성(UX)을 강화하기 위해서 필요하다.
            scanner.nextLine();
            
        }

        System.out.println("프로그램을 종료됩니다. 이용해주셔서 감사합니다.");

        scanner.close();
        // 입력 도구 사용 완료. (노란색 줄 없애는 용도)
    }
}

profile
취업하고싶다...

0개의 댓글