Day12 Quiz02 계산기 만들기 예제 추가적인 내용 부연
소스코드
package Day12;
import java.util.Scanner;
public class Q1_1 {
static int add(int a, int b) {
return a + b;
}
static void minus(int a, int b) {
System.out.println("결과값 : "+(a-b)+" 입니다.");
}
static int mul() {
Scanner sc = new Scanner(System.in);
int[] array =input(sc);
return array[0] * array[1];
}
static void div() {
Scanner sc = new Scanner(System.in);
int[] array =input(sc);
System.out.printf("결과값 : %.1f 입니다.", (double)array[0]/(double)array[1]);
}
static int[] input(Scanner sc) {
int[] a = new int[2];
System.out.print("숫자1 입력 : ");
a[0] = sc.nextInt();
System.out.print("숫자2 입력 : ");
a[1] = sc.nextInt();
return a;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
//1. 입력
System.out.print("연산자 입력 : ");
String op = sc.next(); //위로 뺀다
// 스캐너 숫자 입력은 자체에서 할 것이므로.
// 매개변수 안 받는 애들이 문제이기 때문에 걔네들은 직접 메서드 안으로 들어가서 입력값을 받아줘야 한다.
if(op.equals("+")) {
int[] array=input(sc);
System.out.println("결과값 : "+(array[0]+array[1])+" 입니다.");
}
else if(op.equals("-")) {
int[] array=input(sc);
System.out.println("결과값 : "+(array[0]-array[1])+" 입니다.");
}
else if(op.equals("*")) {
System.out.println("결과값 : "+mul()+" 입니다.");
}
else if(op.equals("/")) {
div();
}
else {
System.out.println("잘못된 연산자 입니다.");
}
}
}
------
1.
(Scanner sc)는 클래스 그 자체를 매개변수로 받아온 건가요? 매개변수의 타입은 뭐라고 봐야하는 건가요?
일단 앞선 예제에서
public class MethodTest {
//1. 주고 받고
static String printHello(String name) {
return "안녕하세요"+name+"님";
}
}
}
이거는
public class MethodTest {
//1. 주고 받고
static String printHello() {
String name
return "안녕하세요"+name+"님";
}
}
이것과 사실상 동일하다.
그런데 살짝 다른 점은
사용할 값을 내부에서 선언해줬느냐, 외부로부터 받아온 것이냐 이다.
즉, 여기서도
static int[] input(Scanner sc) {
int[] a = new int[2];
System.out.print("숫자1 입력 : ");
a[0] = sc.nextInt();
System.out.print("숫자2 입력 : ");
a[1] = sc.nextInt();
return a;
}
이 스캐너 변수 역시 메서드 내에서 사용할 것이 만들어진 것이고,
이것을 외부로부터 받아온 꼴임.
----------
2.
return a는 지금 배열을 반환하는 건가요, 아니면 int 값을 반환하는 걸로 해석해야 하나요?
지금 배열 이름 자체를 불렀다. 뒤에 a[i] 형태로 부른 것도 아니고
그럼 이것은 int 배열을 반환하는 게 맞다.
조금 더 정확하게는,
리턴 타입 자체가 int 배열로 되어 있으니까,(int[ ] input(...))
return a; 에서 컴파일 에러가 나지 않았단 소리는 a가 int 배열이란 뜻.
현재 값을 두 개 받고 있으니 편하게 배열로 받아버린 것.
자바에서의 한계
리턴을 한 개밖에 하지 못한다!!
그런데 때로는 함수에서 두 개 이상의 값을 전달하고 싶을 때도 있을 수 있지.
그럴 때 배열을 사용하는 경우가 많다.
-----------------
3.
int[] array=input(sc); 이건 왜 이런 형태로 쓰는지 모르겠어요.
지금 더하기 빼기 연산은 input을 main에 두고,
곱하기, 나누기 연산은 input을 각각의 메서드에 두는 식으로 코드를 구현했는데,
왜 그런 차이가 있는 걸까요?
아마도, 파라미터의 유무?
=> 결론부터 말하면 그렇다!!
여기서는 함수의 형태를 다양하게 구현하기 위해서 일부러 만든 듯.
함수에서 모든 것을 다 할 수도 있고,
함수에서 결과를 아예 만들어줄 수도 있고,
함수에서 결과는 안 만들고 입력만 받은 다음에 출력할 때 직접 구현할 수도 있다 등...
여기서 그럼 고민해볼 지점
지금 div() 형태가 나을까? 아니면 input(Scanner sc) 형태가 나을까?
div()는 함수를 호출할 때마다 Scanner 객체 만들어서 입력을 받음
그런데 input(Scanner sc)는 한 번 만들어놓고, 그걸 필요할 때마다 가져다가 쓰면 됨.
즉, 매번 새로 만든다는 것은 결국 메모리를 소모한다는 의미.
메모리 소모 = 금액 발생
따라서 후자가 훨씬 효율적인 방법이다.
왜 그런 차이가 있는 걸까요?
아마도, 파라미터의 유무?
이제 이것에 대한 답.
비교할 메서드.
static int add(int a, int b) {
return a + b;
}
static int mul() {
Scanner sc = new Scanner(System.in);
int[] array =input(sc);
return array[0] * array[1];
}
이 때, 지금 mul은 사실 두 가지 일을 하고 있다.
정확하게 하려면 getNumberAndMul() 이렇게 바꿔줘야 한다는 것이지.
1) 입력을 받고
2) 곱셈연산 수행해서 리턴
이렇게 두가지 일을 수행중이니까.
----
4.
그럼 지금처럼 인위적인 방법 말고
4개 메서드의 구현 형태를 동일하게 하고 싶으면 어떻게 바꾸면 될까?
public class CalRef {
static int add(int a, int b) {
return a + b;
}
static int minus(int a, int b) {
return a - b;
}
static int mul(int a, int b) {
return a * b;
}
static int div(int a, int b) {
return a/b;
}
static int[] input(Scanner sc) {
int[] a = new int[2];
System.out.print("숫자1 입력 : ");
a[0] = sc.nextInt();
System.out.print("숫자2 입력 : ");
a[1] = sc.nextInt();
return a;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//1. 입력
System.out.print("연산자 입력 : ");
String op = sc.next(); //위로 뺀다
if (op.equals("+")) {
int[] array = input(sc);
int sum = add(array[0], array[1]);
System.out.println("결과값 : " + sum + " 입니다.");
}
else if (op.equals("-")) {
int[] array = input(sc);
int substraction = minus(array[0], array[1]);
System.out.println("결과값 : " + substraction + " 입니다.");
}
else if (op.equals("*")) {
// Scanner sc = new Scanner(System.in); // 이미 메서드에서 만들었으므로 이것도 삭제
int[] array =input(sc);
int multiple = mul(array[0], array[1]);
System.out.println("결과값 : " + multiple + " 입니다.");
/*
또는
mul(array[0], array[1]);
System.out.println("결과값 : " + mul(array[0], array[1]) + " 입니다.");
이렇게 쓸 수도 있음.
*/
}
else if (op.equals("/")) {
int[] array = input(sc);
int divide = div(array[0], array[1]);
System.out.println("결과값 : " + divide + " 입니다.");
}
else {
System.out.println("잘못된 연산자 입니다.");
}
}
}
이렇게...
마지막으로,
억지로 메서드 분리 한번 더 해봤음.
public class CalRef {
static int add(int a, int b) {
return a + b;
}
static int minus(int a, int b) {
return a - b;
}
static int mul(int a, int b) {
return a * b;
}
static int div(int a, int b) {
return a/b;
}
static int[] input(Scanner sc) {
int[] a = new int[2];
System.out.print("숫자1 입력 : ");
a[0] = sc.nextInt();
System.out.print("숫자2 입력 : ");
a[1] = sc.nextInt();
return a;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//1. 입력
System.out.print("연산자 입력 : ");
String op = sc.next(); //위로 뺀다
if (op.equals("+")) {
int[] array = getInts(sc);
int sum = add(array[0], array[1]);
System.out.println("결과값 : " + sum + " 입니다.");
}
else if (op.equals("-")) {
int[] array = getInts(sc);
int substraction = minus(array[0], array[1]);
System.out.println("결과값 : " + substraction + " 입니다.");
}
else if (op.equals("*")) {
// Scanner sc = new Scanner(System.in); // 이미 메서드에서 만들었으므로 이것도 삭제
int[] array = getInts(sc);
int multiple = mul(array[0], array[1]);
System.out.println("결과값 : " + multiple + " 입니다.");
/*
또는
mul(array[0], array[1]);
System.out.println("결과값 : " + mul(array[0], array[1]) + " 입니다.");
이렇게 쓸 수도 있음.
*/
}
else if (op.equals("/")) {
int[] array = getInts(sc);
int divide = div(array[0], array[1]);
System.out.println("결과값 : " + divide + " 입니다.");
}
else {
System.out.println("잘못된 연산자 입니다.");
}
}
private static int[] getInts(Scanner sc) {
int[] array = input(sc);
return array;
}
}