Title : Scanner vs BufferReader vs String Tokenizer
어제 공부했던 안드로이드 서비스와 메신저는 강의를 듣고 정리하는 시간이 필요하기 때문에
오늘은 코딩 테스트 관련 글을 탐색하던 중 우연히 본 댓글 내용에 대한 정보를 찾아보고자 한다.
코딩 테스트 목적의 공부를 해본 경험이 없기에 위 3가지 입력 처리 방식에 대해 gpt의 도움을 받아 개념 정도만
정리해 보도록 하자.
Scanner
Scanner 클래스는 자바에서 표준 입력을 쉽게 처리하기 위한 가장 익숙한 클래스이다.
Scanner 클래스의 객체는 아래의 코드로 생성할 수 있다.
Scanner sc = new Scanner(System.in);
위 코드로 생성한 Scanner 객체에 Scanner 클래스에 정의된 함수들을 통해 간단하게 입력을 받으면 된다.
sc.nextByte();
sc.nextShort();
sc.nextInt();
sc.nextLong();
sc.nextFloat();
sc.nextDouble();
sc.nextBoolean();
sc.next();
sc.nextLine();
Scanner 객체.next + 데이터 타입의 형식으로 원하는 데이터 타입을 입력 받아 사용하면 되고,
Char형은 입력을 받을 수 없고, next()와 nextLine()은 모두 문자열을 입력 받는 함수지만, next()는 공백을 기점으로
nextLine()은 줄바꿈을 기점으로 리드한다는 점 정도만 알아두도록 하자.
BufferedReader + InputStreamReader
해당 클래스에 대해 설명하기 전 토막 상식으로 일반적으로 자바에서 사용되는 클래스 명명 규칙에 따라 클래스명을
보고, 어떤 데이터를 처리하는지 유추할 수 있다고 한다.
1. ~Stream : 바이트 단위의 입출력 (바이너리 파일, 이미지 파일 등)
2. ~Reader/Writer : 캐릭터 단위 입출력 (텍스트 파일 등)
3. File~ : 파일에 접근하고, 파일을 다루기 위한 클래스
4. Data~ : 원시 자료형 데이터를 다루는 클래스
5. Buffered~ : 버퍼링을 통해 입출력 성능을 높이기 위한 클래스
다시 돌아가서 Buffer를 사용한다는 것은 Scanner처럼 입력이 즉시 처리되는 것이 아니라 Buffer라는 공간에 입력된
데이터를 저장했다가, 버퍼가 가득 차거나 개행 문자가 나타나면, 모아둔 데이터를 한 번에 전송하여 처리한다는 의미이다.
단, 공백까지 경계로 인식하던 Scanner와는 달리 BufferedReader는 줄바꿈만 경계로 인식하기 때문에, 단어 단위로
처리해야 할 경우에는 버퍼에 저장된 데이터를 다시 처리해 주어야 한다는 귀찮음이 발생할 수는 있다.
그럼 다시 댓글에 적혀있던 BufferdReader와 InputStreamReader를 결합한 코드를 보자.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
우선 모든 입력에는 System.in이 사용되는데, 이는 콘솔 입력(키보드 입력)을 바이트 스트림으로 받겠다는 의미이다.
입력 받은 바이트를 문자로 변환하는 과정이 필요한데, 이를 InputStreamReader 클래스가 변환한다.
이렇게 변환된 문자 스트림을 BufferedRader 객체에 버퍼링하여 저장한다.
그런데 Scanner.nextLine()도 내부적으로는 버퍼에 입력 데이터를 저장하고, System.in으로 받은 바이트 스트림을
문자 스트림으로 변환한다고 알고 있는데, 단순히 BufferedReader를 사용하여 버퍼에 데이터를 저장한다는 것 외에
차이가 명확히 와닿지 않는다. GPT에게 질문을 통해 그나마 이해가 되는 예시를 가져와 봤다.
"Hello, My name is Tom. \n
My job is Developer. \n
Nice to meet you. \n"
라는 3 문장을 순차적으로 입력하는 상황이 있다고 가정하자.
우선 Scanner와 BufferedReader(....) 모두 엔터(\n)가 입력될 때마다 입력을 처리하는 동작이 발생한다.
단, Scanner는 엔터가 입력될 때마다 입력 스트림과 상호 작용이 발생해 한 줄씩 데이터를 가져오고,
BufferedReader는 엔터가 입력될 때마다 데이터를 가져오는 것은 맞지만, 버퍼에 저장해 두었다가 한 번에 스트림과
상호 작용을 통해 데이터를 전달하기 때문에, 여기서 발생하는 스트림과의 상호 작용 차이에 의해 속도 차이가
발생한다고 한다.
가슴으로는 조금 이해한 느낌인데, 아직 명확히 설명을 하기엔 어려운 것 같다... 전공자들이나 시니어들이 보면
간단한 내용이고, 개념을 더 갖춘 후 다시 보면, 우습게 보일 내용일 수도 있지만, 이 정보를 찾는데 2시간이 소요됐다.......
단순한 입력 처리라 생각하고 가볍게 찾아볼 생각이였는데, 기본기가 부족해서 그런지 알면 알 수록 헷갈린다....
StringTokenizer는 내일 아침이나 퇴근 후 저녁에 더 찾아보도록 해야겠다.
StringTokenizer
-
단어 사전
[1] :
[2] :
Reference :
- https://snupi.tistory.com/48
-
-
'2024.10~ > 일일 학습 노트' 카테고리의 다른 글
[2024-11-17] Fragment 기초 개념 다지기(with 깡쌤의 안드로이드 프로그래밍 with 자바) (0) | 2024.11.17 |
---|---|
[2024-11-04] 자바 입력 처리 방식 비교(2) (0) | 2024.11.05 |
[24.11.03] Android Service와 Messenger 기초 개념 다지기(1) (0) | 2024.11.03 |
[24.11.02] 브로드 캐스트 리시버와 인텐트 기초 개념 다지기 (0) | 2024.11.02 |
[24.10.27] 컴파일러에 대한 기본기 다지기 (0) | 2024.10.27 |