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

iamnhn·2023년 7월 9일
0

Java

목록 보기
6/11

블로그에 올리진 않았지만 성적입력, 출력, 종료 기능을 가진 프로그램을 만들었다.

베이스 코드

package ex1.ex1;
import java.util.Scanner;

public class base_code {
    public static void main(String[] args) {

        int kor1, kor2, kor3;
        int total;
        float avg;

        Scanner scan = new Scanner(System.in);

        kor1 = 0;
        kor2 = 0;
        kor3 = 0;

        exit:
        while (true) {
            // ------ 메뉴 선택 부분 -------
            System.out.println("\n+---------------------------------+");
            System.out.println("|             메인 메뉴              |");
            System.out.println("+---------------------------------+");
            System.out.println("\t1.성적입력 ");
            System.out.println("\t2.성적출력 ");
            System.out.println("\t3.종료 ");
            System.out.print("\t> ");
            int menu = scan.nextInt();

            switch (menu) {

                // ------ 성적 입력 부분 -------
                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

                // ------ 성적 출력 부분 -------
                case 2:

                    total = kor1 + kor2 + kor3;
                    avg = total / 3.0f;

                    System.out.println("+---------------------------------+");
                    System.out.println("|             성적출력              |");
                    System.out.println("+---------------------------------+");

                    for (int i = 0; i < 3; i++) {

                        if (i == 0) {
                            System.out.printf("\t국어%d: %3d\n", i + 1, kor1);
                        }else if (i == 1) {
                            System.out.printf("\t국어%d: %3d\n", i + 1, kor2);
                        }else if (i == 2) {
                            System.out.printf("\t국어%d: %3d\n", i + 1, kor3);
                        }

                    }

                    System.out.printf("\n총점: %3d", total);
                    System.out.printf("\n평균: %6.2f", avg);
                    System.out.println("\n--------------------------------------");

                    break; // Add break statement here

                case 3:
                    break exit;

                default:
                    System.out.println("입력 오류!");
                    break; // Add break statement here
            }
        }
    }
}

코드 리뷰

우선 베이스 코드를 간단히 리뷰해보겠다. 베이스 코드는 절차지향적으로 작성되었으며, 그 내용은 아래와 같다.

1. 변수 및 객체 초기화:

  • 국어 성적을 저장하는 변수 kor1, kor2, kor3를 선언한다.
  • total은 세번의 국어성적의 총점을 저장하는 변수
  • avg는 세번의 국어성적의 평균을 저장하는 변수
  • 점수 입력을 받기 위한 Scanner 객체
  • kor1, kor2, kor3의 초깃값은 0으로 할당

2. 메뉴 선택 및 분기:

  • 사용자에게 메뉴를 출력하고 메뉴 번호를 입력받음.
  • switch 문을 사용하여 메뉴 번호에 따라 각각 동작을 수행합니다.
  • 메뉴 번호 1은 성적 입력을 수행
  • 메뉴 번호 2는 성적 출력을 수행
  • 메뉴 번호 3은 프로그램을 종료
  • 그 외의 메뉴 번호는 "입력 오류!"를 출력

3. 성적 입력:

  • case 1에서 실행되는 성적 입력 부분
  • 사용자로부터 세 번의 국어 성적을 입력받음
  • 입력 값의 범위를 확인하고, 범위를 벗어난 경우 오류 메시지를 출력

4. 성적 출력:

  • case 2에서 실행되는 성적 출력 부분
  • 세 과목의 총점과 평균을 계산
  • for 루프를 사용하여 세 과목의 국어 성적을 출력

5. 종료:

이 코드는 case 3에서 break exit;를 통해 while 루프를 종료하고 프로그램을 종료

Recap

이 코드에서 분기는 3가지이다.

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

전반적으로 코드는 성적 입력과 출력을 처리하는 기능을 제공한다.
하지만 코드에는 몇 가지 개선할 점이 있다.

우선 코드가 '절차 지향적'으로 작성되었다는 것이다. 현재 구조적인 프로그래밍 학습을 진행하려고 하기 때문에, 이렇게 절차지향적으로 작성된 코드를 구조적인 코드로 변경하여 코드의 가독성을 높이고 재사용성을 높이려고 한다.

구조적인 코드로의 리팩토링은 다음 글에 작성하겠다.

0개의 댓글