코딩크리처 2024. 7. 24. 09:40

문제 제목 : A + B


문제

두 정수 AB 를 입력받은 다음, A + B 를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 AB 가 주어진다.

( 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


BufferedReaderread(),

StringTokenizerhasMoreTokens() 와 같은 메서드도 존재한다.

하지만, 이에 대한 내용은 위에서 제시한 내용을 숙지하고 검색해야 한다.

단순히 사용법만 숙지한다면, 어떤 기능이 기초가 되는지 모르며,

ScannerBufferedReader 클래스가 시스템의 자원을 가져온다고 착각 할 수 있기 때문이다.