스터디 모음/Java 스터디

[Java] 자바 기초 문법 확인해보기 - 1/ Scanner, print, if / java

always-dev 2022. 7. 1.
반응형


처음에는 간단하게 다음과 같이 Scanner, print, if 문만을 사용해서 구현해보는 연습을 했습니다.

점차적으로 범위를 넓힐 계획이고

지금은 단순한 기능을 먼저 잘 사용하기 위해서 이런 식으로 진행하고 있습니다.

 

다음을 사용해서 구현하겠습니다

  • Scanner
  • print
  • if

첫 번째, 두 번째 문제의 전체적인 내용은 생략하겠습니다.

두 번째 문제에서 가독성 부분에서 얻을 수 있던 부분이 있어서 아래에 설명 하겠습니다.

 

 

 

1) 두 번째 문제

두 번째 문제를 구현하면서 좀 더 가독성 좋고 클린하게 코드를 짤 수 있게 배웠습니다.

처음에 내가 작성한 코드는 아래와 같습니다.

Scanner sc = new Scanner(System.in);
System.out.println("정답을 입력해주세요");
int inputAnswer = sc.nextInt(); // 1 또는 2가 입력된다.

int answer = 0;
if (numberOne > numberTwo) {
	answer = 1;
}
if (numberOne < numberTwo) {
	answer = 2;
}

if (inputAnswer == answer) {
	System.out.println("정답입니다.");
	System.out.println("다음 문제로 넘어가겠습니다.");
	
	// ...
} 

if (inputAnswer != answer) {
	System.out.println("오답입니다.");
}

이런식으로 구현이 됐습니다.

절차를 봤을 때는 생각보다 잘못 된 구간이 없어 보입니다.

  1. 사용자가 정답을 inputAnswer에 입력해보고
  2. answer이라는 실제 정답값을 구해서
  3. inputAnser == answer 일 때와 아닐 때를 구별합니다.

결과로는 맞는데 왜 잘못됐다고 생각할까요?

 

 

 

1-1) 두 번째 문제의 문제점

문제는 바로

실제 내부에서 정답값(answer)를 구하는 부분과

사용자가 입력한 정답 (inputAnswer)이 따로 논다는 것입니다.

 

무슨 말이냐고 물어보신다면

코드를 읽을 때 정답을 구하는 부분과 정답을 입력받고 비교하는 부분이 따로 있어서 읽기가 어렵다는 점입니다.

inputAnswer과 answer이 비교되는데 이 때 비교를 하는 기준이 무엇인지 알 수 없습니다.

만약 그 기준을 알기 위해서는 위로 올라가면서 읽어줘야 합니다.

 

프로그램이 돌아가는 것은 문제가 없었지만

실제 코드 자체는 가독성이 낮은 나쁜 코드였습니다.

 

이제 아래와 같이 문제점을 고쳐 보겠습니다.

 

 

 

 

1-2) 두 번째 문제 해결

위에서 문제라고 말했던 정답(answer)와 사용자 입력 정답(InputAnswer)이 따로 놀지 않게 다시 구현했습니다.

사용자 입력 (inputAnser)을 받고 곧바로 그 값이 맞는지 확인합니다.

  • 사용자가 1 값을 넣었을 때
    • 정답이 참인가
    • 정답이 거짓인가

이런 식으로 구현 되었다는 것을 곧바로 직관적으로 알 수 있습니다.

중복되는 부분이 있다고 생각할 수 있지만 실제 가독성이 더 좋기 때문에 위 코드보다 더 나은 코드라고 할 수 있습니다.

Scanner sc = new Scanner(System.in);

int inputAnswer = sc.nextInt();

if (inputAnswer == 1) {
	if (numberOne > numberTwo) {
		System.out.println("정답입니다.");
		System.out.println("다음 문제로 넘어가겠습니다.");
	}
	if (numberOne < numberTwo) {
		System.out.println("오답입니다.");
	}
}

if (inputAnswer == 2) {
	if (numberOne < numberTwo) {
		System.out.println("정답입니다.");
		System.out.println("다음 문제로 넘어가겠습니다.");
	}
	if (numberOne > numberTwo) { 
		System.out.println("오답입니다.");
	}
}

2) 세 번째 문제

현재 값과 본래 값을 비교하는 문제입니다.

 

어려울 것은 없으나 문제의 정확도 보다 문제를 어떻게 푸는 가를 보는 문제였습니다.

a, b, c, … 중에 하나가 틀리다면 본래값 나와야하는 값이 다를 수 있기 때문입니다.

 

문제에 대한 조건이 까다롭기 때문에 문제에 요구사항이 많을 수록 쉬워지고

요구사항이 없고 간단하게 설명할수록 구현하기 어려운 문제입니다.

 

a, b를 입력할 때 조건이 있는데

그 조건에 만족한다면 originalA, originalB라고 해서 두 값에 대입해주면 되는데

조건이 만족하지 않는다면 어떤 값으로 설정하라는지 조건이 전혀 나오지 않습니다.

 

그렇게 된다면 뒤에 값들도 마찬가지로 조건이 적합하지 않으면 어떻게 처리하라고 얘기가 없는 문제 입니다.

 

하지만 위에서 말했듯이 문제를 얼마나 정확하게 푸냐보다는 어떤 방식으로 접근할 것인가를 보는 문제임에 주의해야 합니다.

import java.util.Scanner;

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

        System.out.println("a를 입력해주세요.");
        int a = sc.nextInt();
        int originalA = 0;

        System.out.println("b를 입력해주세요.");
        int b = sc.nextInt();
        int originalB = 0;

        System.out.println("c를 입력해주세요.");
        int c = sc.nextInt();
        int originalC = 0;

        System.out.println("d를 입력해주세요.");
        int d = sc.nextInt();
        int originalD = 0;

        System.out.println("e를 입력해주세요.");
        int e = sc.nextInt();
        int originalE = 0;

        System.out.println("f를 입력해주세요.");
        int f = sc.nextInt();
        int originalF = 0;

        System.out.println("g를 입력해주세요.");
        int g = sc.nextInt();
        int originalG = 0;
        
        if (a >= 5000 && a <= 10000) {
            originalA = a;
        }
        
        if (b >= 4000) {
            originalB = b;
            if (b > a) {
                originalC = a + b;
            }
            if (b < a) {
                originalC = a + b - 300;
            }
        }

        originalD = a + b + originalC;

        originalE = (int) (a + b + originalC) / 3;

        originalF = a + b + originalC + originalD + originalE + 5000;

        originalG = originalF * 2;

        if (originalA != a && originalB != b && originalC != c && originalD != d && originalE != e && originalF != f && originalG != g) {
            System.out.print("모두 잘못 되었습니다.");
        }

        if (originalA == a || originalB == b || originalC == c || originalD == d || originalE == e || originalF == f || originalG == g) {
            if (a != originalA) {
                System.out.print("a가 ");
            }
            if (b != originalB) {
                System.out.print("b가 ");
            }
            if (c != originalC) {
                System.out.print("c가 ");
            }
            if (d != originalD) {
                System.out.print("d가 ");
            }
            if (e != originalE) {
                System.out.print("e가 ");
            }
            if (g != originalG) {
                System.out.print("g가 ");
            }
            System.out.print("잘못되었습니다.");
        }

    }
}

 

반응형

댓글