코드 그라데이션

Day12 Quiz02 계산기 만들기 예제 추가적인 내용 부연 본문

Java/Mega

Day12 Quiz02 계산기 만들기 예제 추가적인 내용 부연

완벽한 장면 2023. 4. 2. 01:46

소스코드

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;
  }

}

 

 

728x90
Comments