구조적인 프로그래밍

방식 1 : Bottom Up 방식

-> 기존 프로그램을 (절차적인 프로그램) 잘라서 조각을 낸후 조각을 가지고 구조를 만들어가는 방법이다.

이전에 사용했던 예제를 이용했다. (살짝다름)

원래프로그램

import java.util.Scanner;

public class StructuredStudy {

	public static void main(String[] args) {
		
		int[] kors = new int[3];
		
		int total = 0;
		float avg;
		int menu;
		boolean keepLoop = true;
		
		Scanner scan = new Scanner(System.in);
		
		while(keepLoop)
		{
			System.out.println("┌──────────────────┐");
			System.out.println("│     메인 메뉴             │");
			System.out.println("└──────────────────┘");
			System.out.println("\t1. 성적입력 ");
			System.out.println("\t2. 성적출력 ");
			System.out.println("\t3. 종료 ");
			System.out.println("\t선택> ");
			menu = scan.nextInt();
			
			switch(menu)
			{
			case 1:
				
				System.out.println("┌──────────────────┐");
				System.out.println("│     성적 입력             │");
				System.out.println("└──────────────────┘");
				System.out.println();
				
				for(int i = 0; i < 3; 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("────────────────────────");
				break;
			case 2:
				for(int i = 0; i < 3; i++)
				{
					total += kors[i];
				}
				avg = total / 3.0f;
				
				System.out.println("┌──────────────────┐");
				System.out.println("│     성적 출력             │");
				System.out.println("└──────────────────┘");
				System.out.println();
				
				for(int i = 0; i < 3; i++)
				{
					System.out.printf("국어 %d : %3d\n", 3-i, kors[i]);
				}
				System.out.printf("총점 : %3d\n", total);
				System.out.printf("평균 : %6.2f\n", avg);
				System.out.println("────────────────────────");
				
				break;
			case 3:
				System.out.println("Bye~~");
				
				keepLoop = false;
				break;
				
			default:
				System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
			}
		}

	}

}

성적입력하는 부분을 잘라볼것이다.

메뉴에서 1,2,3은 기능으로 나누어진 부분을 담당하기 때문에 메뉴에서 한부분을 잘라내보자.

그러니까 main() 함수 성적입력() 함수 이렇게 분가 시킬것이다.

-> 여기서 문제가 발생하는데 성적입력() 함수만 떼서 옮기면 변수에서 에러가난다 . 메인함수로 함부로 접근할 수 없기 때문이다.

해결책은 ? 변수를 함수밖으로 두는것이다. -> 이걸 전역변수라한다.

나눈 결과

import java.util.Scanner;

public class StructuredStudy {
	
	static int[] kors = new int[3];

	public static void main(String[] args) {
		
		
		int total = 0;
		float avg;
		int menu;
		boolean keepLoop = true;
		
		Scanner scan = new Scanner(System.in);
		
		while(keepLoop)
		{
			System.out.println("┌──────────────────┐");
			System.out.println("│     메인 메뉴             │");
			System.out.println("└──────────────────┘");
			System.out.println("\t1. 성적입력 ");
			System.out.println("\t2. 성적출력 ");
			System.out.println("\t3. 종료 ");
			System.out.println("\t선택> ");
			menu = scan.nextInt();
			
			switch(menu)
			{
			case 1:
				
				성적입력();
				
				break;
			case 2:
				for(int i = 0; i < 3; i++)
				{
					total += kors[i];
				}
				avg = total / 3.0f;
				
				System.out.println("┌──────────────────┐");
				System.out.println("│     성적 출력             │");
				System.out.println("└──────────────────┘");
				System.out.println();
				
				for(int i = 0; i < 3; i++)
				{
					System.out.printf("국어 %d : %3d\n", 3-i, kors[i]);
				}
				System.out.printf("총점 : %3d\n", total);
				System.out.printf("평균 : %6.2f\n", avg);
				System.out.println("────────────────────────");
				
				break;
			case 3:
				System.out.println("Bye~~");
				
				keepLoop = false;
				break;
				
			default:
				System.out.println("잘못된 값을 입력하셨습니다. 메뉴는 1~3까지입니다.");
			}
		}

	}//main 함수
	
	static void 성적입력() {
		
		Scanner scan = new Scanner(System.in);
		
		System.out.println("┌──────────────────┐");
		System.out.println("│     성적 입력             │");
		System.out.println("└──────────────────┘");
		System.out.println();
		
		for(int i = 0; i < 3; 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("────────────────────────");
	}

}

메인함수 밖에 static void 성적입력() 이란 함수를 추가해서 나누었다.

변수는 전역변수를 써서 함께 쓸수있도록 했고 전역변수를 선언할때에는 static을 반드시 붙여야한다.

스캐너에서 에러가 뜨는데 스캐너는 각자 입력해주는것이 더 효율적이다.

참고 : https://youtu.be/uIDfIjCeNx4

댓글남기기