/ TRAINING

calculator 2

실습

박재성님의 자바 플레이그라운드 - 3


0. 목차



5. 메서드로 기능 분리

6. 클래스로 기능 분리

7. 사칙연산 - 문자열로 입력받기



1. 메서드로 기능 분리


▶ 기능분리

▷ 메서드

package baek.Calculator;

import java.util.Scanner;

public class Calculator {

	static int getFirstValue(Scanner scan) {

		System.out.println("값을 입력하세요.");
		System.out.print("NUM> ");
		int numOne = scan.nextInt();
		System.out.println();

		return numOne;
	}

	static String getSymbol(Scanner scan) {

		System.out.println("연산기호를 입력하세요.(+, -, *, /, q=종료)");
		System.out.print("SYMBOL> ");
		String symbol = scan.next();
		System.out.println();

		return symbol;
	}

	static int getSecondValue(Scanner scan) {

		System.out.println("값을 입력하세요.");
		System.out.print("NUM> ");
		int numTwo = scan.nextInt();
		System.out.println();

		return numTwo;
	}

	static int getCalculater(int result, String symbol, int numTwo) {

		if (symbol.equals("+")) {
			System.out.printf("%d + %d = ", result, numTwo);
			result = result + numTwo;
			System.out.println(result);
			System.out.println();
		} else if (symbol.equals("-")) {
			System.out.printf("%d - %d = ", result, numTwo);
			result = result - numTwo;
			System.out.println(result);
			System.out.println();
		} else if (symbol.equals("*")) {
			System.out.printf("%d × %d = ", result, numTwo);
			result = result * numTwo;
			System.out.println(result);
			System.out.println();
		} else if (symbol.equals("/")) {
			System.out.printf("%d ÷ %d = ", result, numTwo);
			result = result / numTwo;
			System.out.println(result);
			System.out.println();
		} else {
			System.err.println("사칙연산 기호가 아닙니다!");
			System.out.println();
		}
		return result;
	}

	static void print(int result) {

		System.out.printf("최종 값 = %d\n", result);
	}

	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);

		int numOne = getFirstValue(scanner);
		int result = numOne;

		while (true) {

			String symbol = getSymbol(scanner);
			
			if (symbol.equals("q")) {
				print(result);
				break;
			}
			
			int second = getSecondValue(scanner);

			result = getCalculater(result, symbol, second);
		}
		
		System.out.println("종료");
	}
}
값을 입력하세요.
NUM> 9

연산기호를 입력하세요.(+, -, *, /, q=종료)
SYMBOL> -

값을 입력하세요.
NUM> 2

9 - 2 = 7

연산기호를 입력하세요.(+, -, *, /, q=종료)
SYMBOL> *

값을 입력하세요.
NUM> 2

7 × 2 = 14

연산기호를 입력하세요.(+, -, *, /, q=종료)
SYMBOL> +

값을 입력하세요.
NUM> 1

14 + 1 = 15

연산기호를 입력하세요.(+, -, *, /, q=종료)
SYMBOL> q

최종  = 15
종료

▷ 메서드1 - 첫번째 값 입력

static int getFirstValue(Scanner scan)

▷ 메서드2 - 연산기호 입력

static String getSymbol(Scanner scan)

▷ 메서드3 - 두번째 값 입력

static int getSecondValue(Scanner scan)

▷ 메서드4 - 계산

static int getCalculater(int result, String symbol, int numTwo)

▷ 메서드5 - 결과 출력

static void print(int result)



2. 클래스로 기능 분리


▶ 기능분리

▷ 클래스


▷ 클래스1 - 계산

// Calculate
public class Calculate {

	static int getCalculater(int result, String symbol, int numTwo) {

		if (symbol.equals("+")) {
			System.out.printf("%d + %d = ", result, numTwo);
			result = result + numTwo;
			System.out.println(result);
			System.out.println();
		} else if (symbol.equals("-")) {
			System.out.printf("%d - %d = ", result, numTwo);
			result = result - numTwo;
			System.out.println(result);
			System.out.println();
		} else if (symbol.equals("*")) {
			System.out.printf("%d × %d = ", result, numTwo);
			result = result * numTwo;
			System.out.println(result);
			System.out.println();
		} else if (symbol.equals("/")) {
			System.out.printf("%d ÷ %d = ", result, numTwo);
			result = result / numTwo;
			System.out.println(result);
			System.out.println();
		} else {
			System.err.println("사칙연산 기호가 아닙니다!");
			System.out.println();
		}
		return result;
	}
}

▷ 클래스2 - 명령

// Command
import java.util.Scanner;

public class Command {

	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);

		int numOne = Input.getFirstValue(scanner);
		int result = numOne;

		while (true) {

			String symbol = Input.getSymbol(scanner);

			if (symbol.equals("q")) {
				Output.print(result);
				break;
			}

			int second = Input.getSecondValue(scanner);

			result = Calculate.getCalculater(result, symbol, second);
		}

		System.out.println("종료");
	}
}

▷ 클래스3 - 입력

// Input
import java.util.Scanner;

public class Input {

	static int getFirstValue(Scanner scan) {

		System.out.println("값을 입력하세요.");
		System.out.print("NUM> ");
		int numOne = scan.nextInt();
		System.out.println();

		return numOne;
	}

	static String getSymbol(Scanner scan) {

		System.out.println("연산기호를 입력하세요.(+, -, *, /, q=종료)");
		System.out.print("SYMBOL> ");
		String symbol = scan.next();
		System.out.println();

		return symbol;
	}

	static int getSecondValue(Scanner scan) {

		System.out.println("값을 입력하세요.");
		System.out.print("NUM> ");
		int numTwo = scan.nextInt();
		System.out.println();

		return numTwo;
	}
}

▷ 클래스3 - 출력

// Output
public class Output {

	static void print(int result) {

		System.out.printf("최종 값 = %d\n", result);
	}
}



3. 사칙연산 - 문자열로 입력받기


▶ 사칙연산

▷ 문자열로 입력 scanner - nextLine

package baek.Calculator;

import java.util.Scanner;

public class StringCommand {

	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);

		System.out.println("계산식을 입력하세요.");
		String input = scanner.nextLine();

		String[] inputS = input.split(" ");

		int numOne = Integer.parseInt(inputS[0]);
		int result = numOne;

		for (int i = 1; i < inputS.length; i += 2) {

			String symbol = inputS[i];

			int numTwo = Integer.parseInt(inputS[i + 1]);

			result = Calculate.getCalculater(result, symbol, numTwo);
		}
		
		Output.print(result);
		scanner.close();
	}
	
}
계산식을 입력하세요.
3 + 2 * 3 / 2 + 10
3 + 2 = 5

5 × 3 = 15

15 ÷ 2 = 7

7 + 10 = 17

최종  = 17

▷ nextLine

nextLine
‘3 + 2 * 3 / 2 + 10’ 이렇게 입력하면
이걸 통째로 받아옴

▷ String[] inputS = input.split(“ “);

nextLine으로 받아온 내용을 “ “ 한 칸 띄운 것을 기준으로
하나씩 배열로 담음

▷ int numOne = Integer.parseInt(inputS[0]);

첫번째 값은 첫번째 배열에 담겨있음
numOne에 첫번째 배열 값을 넣음
이 때, nextLine은 String으로 받아왔기 때문에
첫번째 값을 parseInt를 통해 Int으로 바꿔서 넣어 줌

▷ symbol과 numTwo 입력받기



i = 1로 시작해서 i += 2로 돌게 하면
inputS[i]는 배열 1, 3, 5, 7, 9에 있는 걸 꺼내줌
그래서 연산기호만 나오게 됨

연산기호 + 1 = 연산기호 다음에 오는 것 = 숫자
그래서 numTwo는 inputS[i + 1]로 꺼낼 수 있음

for (int i = 1; i < inputS.length; i += 2) {

			String symbol = inputS[i];

			int numTwo = Integer.parseInt(inputS[i + 1]);

			result = Calculate.getCalculater(result, symbol, numTwo);
		}