코테를 진행하던 중, 처음보는 개념을 접하게 됐다.
https://www.acmicpc.net/problem/10951
10951번: A+B - 4
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
백준의 10951번 문제이다.
문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.
각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
각 테스트 케이스마다 A+B를 출력한다.
예제 입력 1
1 1
2 3
3 4
9 8
5 2
예제 출력 1
2
5
7
17
7
문제를 보면 입력받는 케이스는 무한이지만, 종료 조건은 나와있지않다
즉, 종료조건을 만나지 않는다면 입력과 결과반환이 무한으로 이루어지는 구조다.
코드의 종료를 어떻게 해야하지 고민하다가... 결국 질문게시판의 도움으로 EOF라는것을 알게됬다.
우선 EOF란 무엇인지 알아보자.
EOF = End Of File의 약어라고한다.
즉, 파일의 종료, 마지막 이라고 생각하면 될 듯하다.
java에서 값을 입력받는데엔 Scanner 와 bufferedReader 두가지가 있다.
bufferedReader는 아직 제대로 알지 못하기에 우선적으로Scanner로 알아보자
Scanner 기능안에 내장 메서드로 .hasNext()가 있다.
.hasNext()는 반환값이 boolean 타입이다.
Scanner scanner = new Scanner(System.in);
int a = 0;
int b = 0;
while (scanner.hasNext()) {
a = scanner.nextInt();
b = scanner.nextInt();
if (a > 0 && a < 10 && b > 0 && b < 10) {
System.out.println(a+b);
}
}
위 코드에서 while문의 조건이 scanner.hasNext() 이다.
이렇게 이해할 수 있다.
위 코드를 실행시켜 보면,
터미널에 바로 입력구문이 나오고, 입력을 할 수 있다. 하지만 여기서 조금 의아하다
무엇이?
입력구문이 나오고 입력을하는데,
1. 입력한 값이 있는지 판단을하고 true면 while문에 진입을 하는데
2. 입력값이 있는지 판단하는 첫 입력값이 왜 a에 할당되나?? (위 코드 기준)
3. 첫 입력값은 입력값 존재 유무를 판단하는데 사용하고, 그 후 a, b값을 각각 입력받아야 하는거 아닌가??
--> 본인도 1~3 단계의 과정이 의아 하다. 하지만 본인이 이해한 결과는 아래와 같다
--> "입력 값 유무를 확인하고, true면 최초에 입력 값은 코드의 진행상 첫 scanner코드에 적용된다" 이다.
다음으로 .hasNext()에는 종류가 많다.
.hasNext()
.hasNextByte()
.hasNextInt()
.hasNextLong()
.hasNextLine()
등등 타입별로 다 있다.
정수, 실수, 문자열에 따라 상황에 맞게 사용하면 된다.
그렇다면 타입에 따라 다른 메서드간의 차이는 무엇일까?
메서드에 따라서 입력값을 구분하는 척도가 된다.
앞서 .hasNext()는 입력값 유무를 확인하고 boolean 값을 반환한다고 설명했다.
.hasNext()는 어떤 타입이든 입력값이 있으면 true를 반환한다.
.hasNextInt()는 입력값이 정수 이여야만 true,
.hasNextLine()는 입력값이 문자열 이여야만 true
등등 .hasNext 위에 오는 타입과 입력 타입이 같아야한다.
또 중요한 부분이 있다.
Scanner scanner = new Scanner(System.in);
int a = 0;
int b = 0;
while (scanner.hasNext()) {
a = scanner.nextInt();
b = scanner.nextInt();
if (a > 0 && a < 10 && b > 0 && b < 10) {
System.out.println(a+b);
}
}
위 코드에서 while문 안에 코드가 nextInt()를 받고 있는 변수가 나온다.
.hasNext() 메서드로 입력값을 판단할때, 다음에 오는 코드의 타입을 신경써야한다. 맞춰야한다.
위 코드에서 .hasNext() 메서드로 입력값 유무를 판단한다.
하지만 여기서 오류가 발생한다.
.hasNext()는 모든 타입을 모두 인정한다. 때문에 문자열을 입력받아도 true반환하여 코드를 진행한다.
하지만 바로 나오는 a = scanner.nextInt() 구문에 의해, a는 문자열을 받을 수 없기 때문에 타입미스매치 에러가 발생한다.
[Java] Optional 타입이란?? (0) | 2024.03.02 |
---|---|
[Java] 반복문에서 break 와 continue (0) | 2024.02.15 |
[Java] 선언위치에 따른 변수의 종류 (0) | 2024.01.18 |
[Java] 객체의 배열 (0) | 2024.01.18 |
[Java] 객체의 생성과 사용 (0) | 2024.01.18 |