[Java] 구조적인 프로그래밍 2

iamnhn·2023년 7월 10일
0

Java

목록 보기
7/11

지난 글 요약

이전 시간에는 작성된 베이스코드의 기능을 리뷰하였고
앞으로 해당 코드를 어떻게 개선 할 수 있을 지 알아보았다.

그 결과, 베이스 코드는 절차 지향적으로 작성되어 코드의 가독성이나, 재사용성이 떨어진다고 판단, 이를 구조적으로 변경하기로 했다.

베이스 코드를 구조화 하기위해 나는 switch문의 각 분기를 매서드화 하기로 하였다.

분기

성적 입력 (case 1): 사용자로부터 세 과목의 국어 성적을 입력
성적 출력 (case 2): 세 번의 국어 성적을 출력하고, 총점과 평균을 계산하여 출력
종료 (case 3): 프로그램을 종료

이에 맞게 코드를 개선 해보려고 한다.

성적 입력 매서드 화

// ------ 성적 입력 부분 -------
                case 1:
                    System.out.println("\n+---------------------------------+");
                    System.out.println("|             성적 입력              |");
                    System.out.println("+---------------------------------+");

                    do {
                        System.out.print("국어1: ");
                        kor1 = scan.nextInt();

                        if (kor1 < 0 || 100 < kor1)
                            System.out.println("성적범위(0 ~ 100)를 벗어났습니다.");
                    } while (kor1 < 0 || 100 < kor1);

                    do {
                        System.out.print("국어2: ");
                        kor2 = scan.nextInt();

                        if (kor2 < 0 || 100 < kor2)
                            System.out.println("성적범위(0 ~ 100)를 벗어났습니다.");
                    } while (kor2 < 0 || 100 < kor2);

                    do {
                        System.out.print("국어3: ");
                        kor3 = scan.nextInt();

                        if (kor3 < 0 || 100 < kor3)
                            System.out.println("성적범위(0 ~ 100)를 벗어났습니다.");
                    } while (kor3 < 0 || 100 < kor3);

                    break; // Add break statement here

위 코드는 switch 문의 첫번째 분기인 성적입력 부분인데 몇 가지 개선 되어야 할 사항이 있다.

  1. do-while 문이 반복적으로 사용된 것
  • 반복문으로 해결 할 수 있는 것을 굳이 라인을 늘려가며 작성해야 할 필요는 없어보인다.
  1. 반복 횟수 배열화
  • 반복되는 kor1, kor2, kor3는 배열로 관리하는 것이 좋아보임.

개선 된 코드

static void inputGrades(int[] kors, Scanner scan) {

        System.out.println("\n+---------------------------------+");
        System.out.println("|             성적 입력              |");
        System.out.println("+---------------------------------+");

        for (int i = 0; i < kors.length; i++) {
            do {
                System.out.printf("국어%d: ", i + 1);
                kors[i] = scan.nextInt();

                if (kors[i] < 0 || 100 < kors[i])
                    System.out.println("성적범위(0 ~ 100)를 벗어났습니다.");
            } while (kors[i] < 0 || 100 < kors[i]);
        }
        System.out.println("성적이 정상 입력되었습니다.");
    }
  • inputGrades 함수 생성
  • 매개변수로 kors 사용 (korlist에서 참조)
  • 반복문으로 do-while문 축약
  • kors 배열 길이에 따라 반복문을 벗어나도록 kors.length 매서드 사용
  • do-while문은 최초 1회는 무조건 실행 되기때문에 국어성적을 받게 함
  • kors[i]번째 배열 (증감식으로 반복될 때마다 올라감)
  • ex) 최초 실행 시, kors[1] = scan.nextInt(); 로 입력받음
  • 입력 값이 만약 0보다 작고, 100보다 크면 값을 벗어낫다는 문구를 출력함
  • do while문의 조건식을 검사하여 입력된 값이 정상 범위 내에 있으면 반복을 종료함
  • for문 탈출 후 최종적으로 정상적으로 입력되었다는 문구를 출력함

0개의 댓글