1. System.in.read()
특징
- 저수준 입력 방식으로 1바이트씩 읽음.
- 입력값은 **바이트(정수, ASCII 코드 값)**로 반환됨.
- 처리 속도가 빠르지만, 사용하기 불편함.
- 반환값: 0 ~ 255 (ASCII 값)
- OS → JVM → 1바이트 읽기
- 호출할 때마다 시스템 콜 발생 가능
장점
- 단순성
- 입력 데이터를 바이트 단위로 바로 처리할 수 있음.
- 별도 라이브러리 없이 간단히 사용 가능.
- 성능
- 최소한의 기능만 제공하므로 오버헤드가 거의 없음.
- 빠른 속도가 필요할 때 적합.
- 유연성
- 직접 바이트 단위 처리가 필요하거나, 특정한 입력 형식(예: 비정형 데이터)을 읽을 때 유리.
단점
- 사용하기 불편함
- 숫자나 문자열로 변환해야 하는 추가 작업이 필요함.
- 여러 문자를 처리하려면 반복문이나 추가적인 처리 코드가 필요.
- 유니코드/다중 바이트 문자 처리 불편
- 한글 같은 다중 바이트 문자 처리에는 적합하지 않음.
언제 활용?
- 저수준 입력 처리가 필요한 경우
- 바이너리 데이터를 직접 처리하거나, 바이트 단위로 데이터를 분석할 때.
- 단순한 입력 데이터를 다룰 때
- 예: 한 글자씩 읽어서 처리하는 프로그램.
2. Scanner
특징
- 고수준 입력 클래스로, 다양한 데이터 타입(정수, 실수, 문자열 등)을 지원.
- 기본적으로 공백과 줄바꿈을 구분자로 입력을 읽음.
- 토큰 기반 입력
- 내부적으로 정규식(regex) 사용
- 편하지만 느림
장점
- 다양한 입력 처리
- 정수(nextInt()), 실수(nextDouble()), 문자열(nextLine()) 등 다양한 데이터 타입을 쉽게 처리 가능.
- 편리한 구분자 처리
- 기본적으로 공백과 줄바꿈으로 입력을 구분하지만, 사용자가 구분자를 변경할 수도 있음.
java코드 복사scanner.useDelimiter(","); // 쉼표를 구분자로 사용
- 기본적으로 공백과 줄바꿈으로 입력을 구분하지만, 사용자가 구분자를 변경할 수도 있음.
- 간단하고 직관적
- 사용법이 쉬워 초보자도 쉽게 사용할 수 있음.
단점
- 성능 저하
- 입력 데이터를 분석하고 변환하기 때문에 오버헤드가 있음.
- 매우 대용량 입력 처리에는 부적합.
- 줄바꿈 문자(\n) 처리 문제
- nextInt() 등 숫자 입력 메서드 사용 후 남은 \n 문자를 명시적으로 처리하지 않으면 문제가 발생할 수 있음.
java코드 복사scanner.nextLine(); // 남은 '\n' 처리
- nextInt() 등 숫자 입력 메서드 사용 후 남은 \n 문자를 명시적으로 처리하지 않으면 문제가 발생할 수 있음.
언제 활용?
- 작은 규모의 입력 처리에서 사용.
- 예: 사용자와의 간단한 상호작용.
- 다양한 데이터 타입의 입력 처리가 필요한 경우.
3. BufferedReader
특징
- 고성능 입력 클래스로, 데이터를 버퍼링하여 읽기 성능을 최적화.
- 문자열로 데이터를 읽고, 필요한 경우 변환해야 함.
- 한 줄씩 입력 처리
- 한 번에 많은 데이터를 버퍼에 읽음
- 메모리에서 처리
- 시스템 콜 최소화
장점
- 성능
- 입력 데이터를 버퍼링하여 입출력 속도가 매우 빠름.
- 특히, 대량의 데이터를 처리할 때 성능 우위.
- 유니코드 처리에 적합
- 다중 바이트 문자(예: 한글)도 쉽게 처리 가능.
- 유연성
- 줄 단위 입력(readLine())이 가능하며, 필요하면 문자열을 파싱하여 숫자나 기타 데이터로 변환 가능.
단점
- 추가 작업 필요
- 모든 입력이 문자열로 반환되므로, 숫자나 다른 타입으로 변환해야 하는 추가 작업이 필요.
- 모든 입력이 문자열로 반환되므로, 숫자나 다른 타입으로 변환해야 하는 추가 작업이 필요.
- 사용법이 비교적 복잡
- BufferedReader를 사용하려면 InputStreamReader 등과 함께 사용해야 함.
int number = Integer.parseInt(bufferedReader.readLine());
언제 활용?
- 대량의 입력 데이터를 처리할 때.
- 예: 파일 읽기, 온라인 저지 플랫폼에서 문제 풀이.
- 유니코드 데이터를 다룰 때.
- 입출력 성능이 중요한 경우.
비교 요약
| 기능 | System.in.read() | Scanner | BufferedReader |
| 입력 단위 | 1바이트 | 단어/라인/숫자 등 | 라인 단위 |
| 데이터 타입 처리 | 바이트(ASCII) | 다양한 타입 자동 변환 | 문자열로 반환 |
| 성능 | 빠름 | 느림 (오버헤드 큼) | 빠름 (버퍼링 효과) |
| 사용 편의성 | 낮음 | 높음 | 중간 |
| 유니코드 지원 | 제한적 | 지원 | 지원 |
| 사용 사례 | 저수준 바이트 처리 | 간단한 상호작용, 소규모 입력 | 대규모 데이터 처리 |
결론
- System.in.read()
- 바이트 단위로 데이터를 직접 처리해야 하거나, 단순한 입력이 필요한 경우 사용.
- Scanner
- 다양한 데이터 타입을 쉽게 처리할 수 있는 간단한 프로그램이나 사용자 입력 상호작용에 적합.
- BufferedReader
- 대량의 입력 처리나 빠른 입력 성능이 중요한 경우 적합.
- 예: 파일 읽기, 알고리즘 문제 풀이에서 자주 사용.
'Coding Test > Algorithm' 카테고리의 다른 글
| [알고리즘과 자료구조] 스택과 큐 (1) | 2025.03.13 |
|---|---|
| 시간 복잡도(Time Complexity) feat. 빅오 표기법 (0) | 2025.01.07 |
| JAVA) System.in.read()로 정수 입력받기 (0) | 2024.12.28 |