백준 1000 - A + B
문제 제목 : A + B
문제
두 정수 A
와 B
를 입력받은 다음, A + B
를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 A
와 B
가 주어진다.
( 0 < A
, B
< 10 )
출력
첫째 줄에 A + B
를 출력한다.
에제 입력 1
1 2
예제 출력 1
3
각 프로그램마다 표준 입출력이 존재하며,
Java 에서의 표준 입출력을 행하라는 문제이다.
Java 에서의 표준 입력 방법은 주로 두 개로 나뉜다.
Scanner
혹은 BufferedReader
이다.
처음 사용하는 사람은 Scanner
를 통해 초반에 편하게 입력받으면 되고,
BufferedReader
를 통해 좀 더 심화된 입력을 배우고자 한다면, 이를 사용하면 된다.
차이가 있다면, BufferedReader
는 클래스 내부에서 자체적으로 에러를 처리하지 않고,
이 클래스를 꺼내 쓰는 유저에게 그 책임을 묻기에, 직접 예외(Exception) 을 던져줘야 한다는 차이점이 있다.
Answer1 - Scanner 이용
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int B = sc.nextInt();
int result = A + B;
System.out.println(result);
}
}
System.in
은 표준 입력을 의미하지만, 그 자체로 자원 을 의미한다.
Scanner
클래스는 표준 입력을 받게 해 주는 존재가 아니라,
Scanner
클래스에 초기화 변수로 System.in
이라는 표준 입력 자원을 주어
유틸리티 로서 활동할 수 있게 만든 것이다.
이 관계를 반대로 알고 있으면 안된다.
System.in.read()
를 통해 바이트 단위로 아스키 코드를 읽을 수도 있다는 것을 기억하자.
그렇다면, Scanner
이라는 표준 입력을 위한 유틸리티가 존재한다면,
BufferedReader
이라는 표준 입력을 위한 유틸리티도 존재한다.
차이점은, 좀 더 신경써야 할 것이 많지만, 데이터 처리 속도와 최적화에서 더 높다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
System.out.println(A + B);
}
}
BufferedReader
클래스는 System.in
이라는 표준 출력을 가진 InputStreamReader
클래스를 초기화 변수를 받는다.
Scanner
클래스를 이용한 입력과 BufferedReader
의 차이는,
Scanner
클래스는 nextInt()
혹은 nextDouble()
과 같이
입력받은 문장에 존재하는 숫자 혹은 소수점과 같은 토큰들을 잘라서,
즉시 하나의 토큰 안의 문장을 형변환 하여 파싱 할 필요가 없다.
하지만,
BufferedReader
클래스를 이용한 입력은 순수하게 입력을 받는다.
대신, Scanner
클래스에 비해 저장 가능한 문장의 용량이 높다는 장점이 있다.
BufferedReader
는 문자열 형태로 메서드의 결과를 반환받으므로,
이를 Integer
, Long
, Double
클래스의 전역 유틸리티 메서드를 이용하여
Integer.parseInt(x)
, Long.parseLong(x)
, Double.parseDouble(x)
과 같이
원하는 형태로 직접 바꾼 후 값을 할당해야 한다.
그렇다면 StringTokenizer
클래스는 무엇일까?
이는 하나의 줄에 존재하는 delim(이것을 만나면 이전까지의 토큰을 하나의 단어로 취급한다.)
을 선언하여 자르거나, ' '
즉, 빈 공백을 디폴트로 사용하여 문자열을 나눌 수 있다.
A
, B
는 빈 공백 으로 띄어쓰기 되어 있는데,
StringTokenizer
클래스의 디폴트 델림(delim) 은 ' '
빈 공백이므로,
.nextToken()
시, 맨 앞의 숫자만 잘려서 문자열 형태로 반환되고,
그 다음 .nextToken()
시, 그 다음의 숫자가 잘려서 문자열 형태로 반환된다.
ex - 입력값이 1 3
일 경우,
첫 번째 .nextToken()
은 1
이 되며,
두 번째 .nextToken()
은 2
가 된다.
Conclusion
BufferedReader
의 read()
,
StringTokenizer
의 hasMoreTokens()
와 같은 메서드도 존재한다.
하지만, 이에 대한 내용은 위에서 제시한 내용을 숙지하고 검색해야 한다.
단순히 사용법만 숙지한다면, 어떤 기능이 기초가 되는지 모르며,
Scanner
과 BufferedReader
클래스가 시스템의 자원을 가져온다고 착각 할 수 있기 때문이다.