# 문제
- 주소: https://www.acmicpc.net/problem/1000
- 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
# 코드
- Scanner, BufferedReader, Console 내장 클래스 사용함.
▼ Scanner 사용
import java.util.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 sum = A + B;
System.out.println(A+B);
}
}
▼ BufferReader 사용 - 1
* 백준에는 이렇게 제출해야지 정답처리 됨.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] strs = br.readLine().split(" ");
int A = Integer.parseInt(strs[0]);
int B = Integer.parseInt(strs[1]);
int sum = A + B;
System.out.println(sum);
}
}
▼ BufferReader 사용 - 2
* 로컬에서는 이렇게 작성하면 정상 작동됨. 백준에서는 안됨.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int A = Integer.parseInt(br.readLine());
int B = Integer.parseInt(br.readLine());
int sum = A + B;
System.out.println(sum);
}
}
▼ Console 사용
import java.io.Console;
public class Main {
public static void main(String[] args) {
Console console = System.console();
if(console != null) {
int A = Integer.parseInt(console.readLine());
int B = Integer.parseInt(console.readLine());
int sum = A + B;
System.out.println(sum);
} else {
System.out.println("콘솔을 사용할 수 없습니다.");
}
}
}
# 입/출력 결과
▼ Scanner 사용 했을 때의 입/출력 모습
▼ BufferedReader 사용 했을 때의 입/출력 모습
=> 로컬에서는 정상 작동 되었으나, 백준에서는 런타임 에러가 발생.
▼ BufferReader 사용 했을 때의 때의 입/출력 모습
=> 1 입력 > 엔터 > 2 입력 > 엔터 방식으로 하면 안된다. 2, 10 의 값을 따로 입력하는게 아니라 2 띄어쓰고 10 입력 > 엔터 이런 순으로 해야지 값이 각각 저장되고 합이 정상적으로 출력이 된다. 백준에서는 정상작동 된다.
▼ Console 사용 했을 때의 입/출력 모습
=> 로컬에서는 정상작동하나, 백준에서는 오류가 발생한다. 이건 아래에 설명.
# 과정
- 첫 번째는 Scanner 클래스로 문제를 풀었고, 로컬과 백준에 제출 했을 때 정상적으로 작동하였다.
- 컴파일러 에러는 java.io.scanner를 import 안 시켜줘서였다.
- 두 번째는 BufferedReader 클래스로 문제를 풀었다. 로컬에서는 정상적으로 작동하였으나, 백준에서는 런타임 오류가 발생했다.
- 컴파일러 에러는 java.io.BufferedReader, java.io.ImportStreamReader, java.io.IOException을 import 안 시켜줘서 컴파일 에러가 떴다.
- 런타임 오류는 NumberFormat으로 숫자 형변환의 문제가 발생했다.
- 발생 이유:
- (chat gpt의 도움) 로컬에서는 사용자가 1과 2의 값을 입력할 때, 1 입력 > 엔터 > 2 입력 > 엔터 순으로 진행하는데, 백준에서는 프로그램이 자동으로 값을 입력을 하다보니 1\n2 처럼 줄바꿈 형식으로 값이 입력될 수도 있고 1 2 처럼 공백 형식으로 값이 입력될 수도 있다고 한다.
- 즉, BufferedReader.readLine()은 처음에 문자열을 받기 때문에 1 줄바꿈 2 이렇게 값이 들어오면 모르지만 1 공백 2 이런 형식으로 값이 들어오면 .readLine()은 '1 2' (1 공백 2)로 하나의 값으로 저장을 하기 때문에 '1 2'는 문자열 형태라서 숫자로 형변환을 할 수가 없다.
- 그래서 숫자 형변환 런타임 오류가 발생한 것이다.
- https://help.acmicpc.net/judge/rte/NumberFormat
- 해결 방법:
- 처음에 입력 받은 값을 공백 기준으로 나누어서 배열 형태로 저장하면 된다.
- String[] strs = br.readLine().split(" "); 라고 작성하면 되는데, 풀어보자면 strs변수는 String[]. 즉, 문자열 타입의 배열이다.
- 이는 1 2 값이 입력되면 공백을 기준으로 1과 2를 나누고 1과 2가 각각 strs변수에 배열 형태로 1, 2 이렇게 저장된다는 의미다.
- 그 다음 1, 2의 값을 불러오려면 strs[0], strs[1]로 작성하면 된다.
- 세 번째는 Console 클래스로 문제를 풀었다. 로컬에서는 정상적으로 작동하였으나, 백준에서는 틀렸다고 했다.
- Console은 틀리게 나온 이유를 chat-gpt를 통해 물어보았다.
- 발생 이유:
- 결론은 Scanner, BufferedReader는 System.in을 통해 표준 입력을 직접 읽어오는 방식이고, Console은 System.console()을 통해 콘솔에서 값을 읽어오는 방식이기 때문이다.
- 그래서 NullPointerException 런타임 에러가 발생한 것이다.
- 즉, Console은 주로 로컬 환경에서 터미널 입력 받을 때 사용한다고 한다.
- 요약 하자면
- chat-gpt가 "System.console()은 터미널(console) 환경에서만 작동합니다. 즉, 입력을 누가 하든 상관없이, 그 **입력이 '콘솔을 통해 이뤄지는 환경인지 아닌지'**가 가장 중요합니다."라고 대답하는 것으로 보아 어떤 값이 들어가더라도 터미널 환경이 아니라면 무조건 null 값이 반환된다고 생각하면 되는 거 같다.
- 왜 로컬에서는 정상 작동 하였는가?
- 이건 내가 VS Code IDE에서 터미널에서 값을 입력했기 때문이다.
- 해결 방법:
- 환경 자체가 다른 것이기 때문에 방법은 없는 거 같다.
# 느낀 점
- 내가 알고 있는 건 Scanner 클래스 밖에 몰랐는데, 다양한 방식도 있다는 것을 알게 되었다. (신기하고 재밌다!)
- BufferedReader, Console 클래스는 chat-gpt를 통해 알게 되었다.
- chat-gpt 질문: 사용자한테 두 개의 정수 값을 입력 받은 뒤, 두 수의 합을 구한 다음 출력을 하는데 Scanner 클래스 말고 다른 방식으로 풀 수 있는지 알려줘.
# 메모
- Scanner는 .nextLine(), .nextInt()가 있는데, 숫자는 .nextInt()를 사용하면 된다.
- Scanner 사용하고 .close(); 메서드를 호출해주기.
- 자원을 정리하고 메모리 누수나 시스템 리소스 낭비를 방지하기 위해서 사용하면 좋다고함. chat-gpt
- BufferedReader와 Console은 .readLine()만 사용해야하는데, 이는 문자열 형태라서 숫자로 형변환 시켜줘야한다.
- 숫자 형변환은 Integer 클래스의 .parseInt() 메서드 사용하면 된다. => Integer.parseInt();
- Scanner와 BufferedReader+InputStreamReader는 System.in 기반 입력 도구이고, Console은 System.console() 기반 입력 도구이다.
- System.in은 표준 입력 스트림(Standard Input)을 사용하는 입력 방식으로 모든 환경에서 사용이 가능하다. (키보드, 파일, 온라인 채점 사이트, 터미널, IDE 등)
- System.console()은 진짜 콘솔 환경이 있을 때만 사용할 수 있는 도구라서 터미널에서 직접 실행할 때만 정상 작동한다. 터미널 환경이 아니라면 null 값 반환.
'코딩 테스트' 카테고리의 다른 글
[코딩테스트] 백준 10869번: 사칙연산 (Java) (0) | 2025.05.05 |
---|---|
[코딩테스트] 백준 1008번: A/B (Java) (0) | 2025.05.04 |
[코딩테스트] 백준 10998번: AxB (Java) (0) | 2025.05.03 |
[코딩테스트] 백준 1001번: A-B (Java) (0) | 2025.05.02 |
[코딩테스트] 백준 2557번: Hello World (Java) (0) | 2025.04.30 |