본문 바로가기
JAVA/[JAVA] 바구니

JAVA 구조적인 프로그래밍 Bottom Up

by oncerun 2020. 2. 28.
반응형

구조적인 프로그래밍 이란

절차로만 이루어져 있는 프로그램을 코드를 나누어주다 보니 그 나눠진 것들 사이에서 구조가 만들어진다.

두 가지 방식이 있는데 

그중 첫 번째인 Bottom Up은 이미 있는 프로그램을 잘라서 조각을 낸 뒤

그 조각을 가지고 구조를 만들어 가는 방법이다. 프로그램은 성적 출력을 가지고 코드를 나누는 연습을 해보겠다.

 

1. 절차로만 이루어진 코드

package part2.ex1.성적입력부분나누기;

import java.util.Scanner;

public class newlec {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);

		int kors[][] = new int[3][3];
		int total = 0;
		float avg;
		boolean keeploop = true;

		for (int j = 0; j < 3; j++) {
			for (int i = 0; i < 3; i++)
				kors[j][i] = 0;
		}

		EXIT: while (keeploop) {

			System.out.println("┌───────────────┐");
			System.out.println("│         성적 출력  프로그램          │ ");
			System.out.println("└───────────────┘");
			System.out.println("1. 국어 성적 입력"); // 1학년 국어3 2학년 국어3
			System.out.println("2. 국어 성적 출력");
			System.out.println("3. 종료");
			System.out.print("입력 > ");

			String menu_ = scan.nextLine();
			int menu = Integer.parseInt(menu_);

			switch (menu) {
			case 1:

				System.out.println("┌───────────────┐");
				System.out.println("│              성적   입력                  │ ");
				System.out.println("└───────────────┘");

				for (int j = 0; j < 3; j++) {
					for (int i = 0; i < 3; i++) { // 각입력에대한 오류값을 찾기위해
						do {
							System.out.printf("%d학년의 국어%d : ", j + 1, i + 1);
							kors[j][i] = scan.nextInt();
							scan.nextLine();

							if (kors[j][i] < 0 || kors[j][i] > 100)
								System.out.println("성적범위(0~100) 입니다.");

						} while (kors[j][i] < 0 || kors[j][i] > 100);
					}
				}

				break;

			case 2:

				System.out.println("┌───────────────┐");
				System.out.println("│              성적   출력              │ ");
				System.out.println("└───────────────┘");

				for (int j = 0; j < 3; j++) {
					System.out.printf("----- %d학년 국어 성적--------\n", j + 1);
					total = kors[j][0] + kors[j][1] + kors[j][2];

					avg = total / 3.0f;

					for (int i = 0; i < 3; i++) {
						System.out.printf("%d국어 성적 : %3d\n", i + 1, total);
						System.out.printf("총점 :%3d\n", total);
						System.out.printf("평균 : %6.2f\n", avg);
					}
				}
				break;

			case 3:
				break EXIT;
			default:
				System.out.println("1~3까지의 숫자만 입력할 수 있습니다.");

			}
		}
		scan.close();
		System.out.println("bye~~");
	}
}

2. 구조화시키기 함수로 나눈다

package part2.ex1.성적입력부분나누기;

import java.util.Scanner;

public class newlec {
	// static int x; 전역변수선언하는법
	static int kors[][] = new int[3][3];

	public static void main(String[] args) {

		boolean keeploop = true;
		int menu;
		for (int j = 0; j < 3; j++) {
			for (int i = 0; i < 3; i++)
				kors[j][i] = 0;
		}

		EXIT: while (keeploop) {
			
			menu = 메뉴입력();
			
			switch (menu) {
			case 1:
				
				성적입력(); // F3눌르면 성적입력함수로 가짐.
				
				break;
			case 2:
				
				성적출력();
				
				break;
				
			case 3:
				System.out.println("bye~~");
				break EXIT;				
				
			default:
				
				System.out.println("1~3까지의 숫자만 입력할 수 있습니다.");

			}
		}
	}

	static int 메뉴입력() {
		Scanner scan = new Scanner(System.in);
		System.out.println("┌───────────────┐");
		System.out.println("│         성적 출력  프로그램       │ ");
		System.out.println("└───────────────┘");
		System.out.println("1. 국어 성적 입력"); // 1학년 국어3 2학년 국어3
		System.out.println("2. 국어 성적 출력");
		System.out.println("3. 종료");
		System.out.print("입력 > ");
		int menu = scan.nextInt();
		return menu; // 메뉴값을 반환한다. 반환한때 함수앞에 자료형표시
	}

	static void 성적출력() {

		int total = 0; // total, avg는 출력을 위한 변수이므로 main함수에서 뺀다.
		float avg = 0;

		System.out.println("┌───────────────┐");
		System.out.println("│              성적   출력              │ ");
		System.out.println("└───────────────┘");

		for (int j = 0; j < 3; j++) {
			System.out.printf("----- %d학년 국어 성적--------\n", j + 1);
			total = kors[j][0] + kors[j][1] + kors[j][2];

			avg = total / 3.0f;

			for (int i = 0; i < 3; i++) {
				System.out.printf("\t국어%d 성적 : %3d\n", i + 1, kors[j][i]);

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

	// 함수를 만들어 코드를 나눔
	static void 성적입력() {
		Scanner scan = new Scanner(System.in); // 전역으로 쓸필요는 구지없다.
		// kors라는 변수를 쓸 수 가없다 쓸려면.
		// 전역변수(자원) 선언
		System.out.println("┌───────────────┐");
		System.out.println("│              성적   입력              │ ");
		System.out.println("└───────────────┘");

		for (int j = 0; j < 3; j++) {
			for (int i = 0; i < 3; i++) { // 각입력에대한 오류값을 찾기위해
				do {
					System.out.printf("%d학년의 국어%d : ", j + 1, i + 1);
					kors[j][i] = scan.nextInt();

					if (kors[j][i] < 0 || kors[j][i] > 100)
						System.out.println("성적범위(0~100) 입니다.");

				} while (kors[j][i] < 0 || kors[j][i] > 100);
			}
		}
	}
}

3. 깔끔하게 보이기 사용자는 모르지만 우리가 거시적으로 볼 때 좋다.

package part2.ex1.성적입력부분나누기;

import java.util.Scanner;

public class newlec {
	// static int x; 전역변수선언하는법
	static int kors[][] = new int[3][3];

	public static void main(String[] args) {

		boolean keeploop = true;
		int menu;
		for (int j = 0; j < 3; j++) {
			for (int i = 0; i < 3; i++)
				kors[j][i] = 0;
		}

		EXIT: while (keeploop) {
			
			menu = 메뉴입력();
			
			switch (menu) {
			case 1:
				
				성적입력(); // F3눌르면 성적입력함수로 가짐.
				
				break;
			case 2:
				
				성적출력();
				
				break;
				
			case 3:
				System.out.println("bye~~");
				break EXIT;				
				
			default:
				
				System.out.println("1~3까지의 숫자만 입력할 수 있습니다.");

			}
		}
	}

	static int 메뉴입력() {
		Scanner scan = new Scanner(System.in);
		System.out.println("┌───────────────┐");
		System.out.println("│         성적 출력  프로그램       │ ");
		System.out.println("└───────────────┘");
		System.out.println("1. 국어 성적 입력"); // 1학년 국어3 2학년 국어3
		System.out.println("2. 국어 성적 출력");
		System.out.println("3. 종료");
		System.out.print("입력 > ");
		int menu = scan.nextInt();
		return menu; // 메뉴값을 반환한다. 반환한때 함수앞에 자료형표시
	}

	static void 성적출력() {

		int total = 0; // total, avg는 출력을 위한 변수이므로 main함수에서 뺀다.
		float avg = 0;

		System.out.println("┌───────────────┐");
		System.out.println("│              성적   출력              │ ");
		System.out.println("└───────────────┘");

		for (int j = 0; j < 3; j++) {
			System.out.printf("----- %d학년 국어 성적--------\n", j + 1);
			total = kors[j][0] + kors[j][1] + kors[j][2];

			avg = total / 3.0f;

			for (int i = 0; i < 3; i++) {
				System.out.printf("\t국어%d 성적 : %3d\n", i + 1, kors[j][i]);

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

	// 함수를 만들어 코드를 나눔
	static void 성적입력() {
		Scanner scan = new Scanner(System.in); // 전역으로 쓸필요는 구지없다.
		// kors라는 변수를 쓸 수 가없다 쓸려면.
		// 전역변수(자원) 선언
		System.out.println("┌───────────────┐");
		System.out.println("│              성적   입력              │ ");
		System.out.println("└───────────────┘");

		for (int j = 0; j < 3; j++) {
			for (int i = 0; i < 3; i++) { // 각입력에대한 오류값을 찾기위해
				do {
					System.out.printf("%d학년의 국어%d : ", j + 1, i + 1);
					kors[j][i] = scan.nextInt();

					if (kors[j][i] < 0 || kors[j][i] > 100)
						System.out.println("성적범위(0~100) 입니다.");

				} while (kors[j][i] < 0 || kors[j][i] > 100);
			}
		}
	}
}

4. 최종

전역 변수를 사용하지 않기 위해

전역 변수를 main함수에 넣고

메뉴, 성적 입출력 함수에 매개변수로써 함수를 고립시켜

전역 변수에 대한 오류 가능성을 줄인다.

import java.util.Scanner;

public class newlec {
	// static int x; 전역변수선언하는법
	public static void main(String[] args) {

		int[][] korList = new int[3][3];
//외부로부터 함수 고립화를 시키겠다.
		// 전역변수 보다 메인함수에 넣은뒤 다른함수에서 매개변수형태로 받게하겠다.
		int menu;
		boolean keeploop = true;

		for (int j = 0; j < 3; j++) {
			for (int i = 0; i < 3; i++)
				korList[j][i] = 0;
		}

		EXIT: while (keeploop) {

			menu = inputMenu(); //함수명을 한글보단 영어가 바람직하다.

			switch (menu) {
			case 1:

				intputKors(korList); // F3눌르면 성적입력함수로 가짐.

				break;
			case 2:

				printKors(korList);

				break;

			case 3:
				System.out.println("bye~~");
				break EXIT;

			default:

				System.out.println("1~3까지의 숫자만 입력할 수 있습니다.");

			}
		}
	}

	static int inputMenu() {
		Scanner scan = new Scanner(System.in);
		System.out.println("┌───────────────┐");
		System.out.println("│         성적 출력  프로그램       │ ");
		System.out.println("└───────────────┘");
		System.out.println("1. 국어 성적 입력"); // 1학년 국어3 2학년 국어3
		System.out.println("2. 국어 성적 출력");
		System.out.println("3. 종료");
		System.out.print("입력 > ");
		int menu = scan.nextInt();
		return menu; // 메뉴값을 반환한다. 반환한때 함수앞에 자료형표시
	}

	static void printKors(int[][] kors) {

		int total = 0; // total, avg는 출력을 위한 변수이므로 main함수에서 뺀다.
		float avg = 0;
		System.out.println("┌───────────────┐");
		System.out.println("│              성적   출력              │ ");
		System.out.println("└───────────────┘");

		for (int j = 0; j < 3; j++) {
			System.out.printf("----- %d학년 국어 성적--------\n", j + 1);
			total = kors[j][0] + kors[j][1] + kors[j][2];

			avg = total / 3.0f;

			for (int i = 0; i < 3; i++) {
				System.out.printf("\t국어%d 성적 : %3d\n", i + 1, kors[j][i]);

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

	// 함수를 만들어 코드를 나눔
	static void intputKors(int[][] kors) {
		Scanner scan = new Scanner(System.in); // 전역으로 쓸필요는 구지없다.
		// kors라는 변수를 쓸 수 가없다 쓸려면.
		// 전역변수(자원) 선언
		int kor;
		System.out.println("┌───────────────┐");
		System.out.println("│              성적   입력              │ ");
		System.out.println("└───────────────┘");

		for (int j = 0; j < 3; j++) {
			for (int i = 0; i < 3; i++) { // 각입력에대한 오류값을 찾기위해
				do {
					System.out.printf("%d학년의 국어%d : ", j + 1, i + 1);
					kor = scan.nextInt();

					if (kor < 0 || kor > 100)
						System.out.println("성적범위(0~100) 입니다.");

				} while (kor < 0 || kor > 100);
				kors[j][i] =kor;
			}
		}

	}
}
반응형

'JAVA > [JAVA] 바구니' 카테고리의 다른 글

java.lang.NullPointerException 오류1  (0) 2020.03.03
JAVA 구조적인 프로그래밍 Top Down  (0) 2020.02.28
성적 입출력 프로그램 중 오류  (0) 2020.02.27
JAVA 연산자 -1  (0) 2020.02.20
JAVA 값과 형식  (0) 2020.02.20

댓글