인프런 커뮤니티 질문&답변

David님의 프로필 이미지
David

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

Scanner, FileReader, BufferedReader 등 각각의 차이점 및 섹션 14. 퀴즈 #13의 호출 순서와 관련된 질문입니다...ㅎ

해결된 질문

작성

·

805

·

수정됨

1

안녕하세요, 나도코딩 선생님...ㅎ 동영상 강의들 중 섹션 14. 입출력과 파일을 보다가 궁금증이 생겨서 질문을 하게 되었습니다...ㅎ

(1) 섹션 14. 입출력과 파일을 공부하면서, 파일을 읽는 여러 가지 방법들을 접하고 있습니다. 공부하면서 BufferedReader, FileReader, Scanner등 여러 가지 방법들이 있는데, 이들은 어느 때 쓰이는 것이 가장 좋은가요? 예를 들면, BufferedReader는 큰 용량의 파일을 읽는데 적합하다 던가, 아니면 Scanner는 키보드 입력을 받는 것 외에도 파일을 읽고자 할 때, FileReader와 같은 역할을 한다 이런거요!

만약 어느 한 텍스트 파일을 읽고자 할 때, Scanner를 예로 들면, 이렇게 코드를 적어볼 수 있을까요? 모든 건 이미 import가 있다고 가정하고 작성해봤습니다...ㅎ:

... // 이전 코드 생략
try {
   File file = new File("testing.txt");
   Scanner scanner = new Scanner(file);
   while(scanner.hasNext()) {
      System.out.println(scanner.next());
      // 여기서 만약에 여러 줄들로 이루어진 텍스트에서 한 글자씩 따오려면,
      // 이전에 문자열 관련 질문 처럼 scanner.next().charAt을 쓰나요?
   }
   scanner.close();
} catch (FileNotFoundException e1) {
   e1.printStackTrace(); // 예외 처리 1
} catch (IOException e2) {
   e2.printStackTrace(); // 예외 처리 2
}

(2) 섹션 14에 있는 퀴즈 #13과 관련된 질문입니다! 제가 try문 안의 String input; scanner의 호출 스택(순서)을/를 제대로 이해했는지 알고 싶습니다...ㅎ

... // 이전 코드 생략
Scanner scanner = new Scanner(System.in);
try (BufferedReader br = new BufferedReader(new FileReader("saying.txt")))
{
   ... // 퀴즈 시작 및 제목 출력
   String quiz;
   String answer;
   String input;
   
   while (true) {
      quiz = br.readLine();
      answer = br.readLine();
      if (quiz == null || answer == null) {
         break;
      }
      
      System.out.println(" (문제) " + quiz);
      System.out.println(" (답 입력) ");
      input = scanner.next();
      ... // input.equal(answer), if-else문 생략
   }
   ...
} catch (IOException e) {
   e.printStackTrace(); // 예외 처리 
}

여기 이 코드에서, quiz랑 answer는 1줄 1줄 br.readLine();을 통해 단어 및 문장들을 인식하는 반면, 입력하는 답안의 경우에는 우선 try문 안에서 String input;을 선언하고, 대입 연산자 = 를 통해 .next();로 입력을 받은 다음, string으로 선언된 input을 .equal();로 입력받은 값과 정답을 비교하여 최종 결과를 출력하는 건가요?

프로그래밍 언어를 공부하다보니 여러 질문들과 궁금증이 많이 쌓이는데, (특히 최근에 들어선 더 많아졌네요...ㅎ) 그 때마다 제 궁금증을 답글을 통해 잘 해소줘서 진심으로 감사합니다..ㅎ :)

답변 1

2

나도코딩님의 프로필 이미지
나도코딩
지식공유자

안녕하세요?
BufferedReader, Scanner, FileReader는 파일이나 입력 스트림에서 데이터를 읽을 때 사용되는데 각각 장단점을 가지고 있으며 필요에 따라 선택을 하시면 되는데, 가급적 BufferedReader 를 사용하시면 무난합니다.
1) BufferedReader는 대량의 데이터를 읽을 때 사용합니다. BufferedReader는 데이터를 읽어올 때 임시 공간인 버퍼(buffer)를 사용하는데, 버퍼에 데이터가 가득 차면 한번에 전송하는 식으로 동작하여 속도가 빠릅니다. A 지점에서 B 지점으로 물건을 이동할 때 물건 하나마다 매번 이동하는게 아니라 카트에 여러개를 쌓아서 한 번에 이동하는 것으로 이해하시면 됩니다.
2) Scanner는 서식이 지정된 입력을 읽을 때 사용합니다. Scanner는 정수, 실수, 문자열과 같은 다양한 데이터 유형을 파싱할 수 있기 때문에 구조화된 형식으로 데이터를 읽는 데 유용합니다. 줄바꿈, 공백 등으로 구분된 내용을 수월하게 잘라서 읽을 수 있습니다.
3) FileReader 한 번에 하나의 문자를 읽기 때문에 작은 파일이나 데이터를 문자 단위로 처리해야 할 때 유용합니다.

보다 자세한 설명이 담겨 있는 참고 사이트를 공유 드립니다.

https://velog.io/@kkimbj18/%EB%B2%84%ED%8D%BC%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0-Feat.-BufferedReader-vs-Scanner-cache

 

Scanner 는 보통 줄바꿈, 공백으로 된 데이터들을 문자, 정수 등으로 구분하여 읽어오는데 사용합니다. 작성해주신 코드 기준으로 Scanner 를 이용하여 한 글자씩 읽으려면 이렇게 할 수 있겠네요.

public class ScannerExample {
    public static void main(String[] args) {
        try {
            File file = new File("testing.txt");
            Scanner scanner = new Scanner(file);
            while (scanner.hasNext()) {
                String token = scanner.next();
                for (int i = 0; i < token.length(); i++) {
                    System.out.println(token.charAt(i));
                }
            }
            scanner.close();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace(); // 예외 처리 1
        } catch (IOException e2) {
            e2.printStackTrace(); // 예외 처리 2
        }
    }
}

퀴즈 #13 의 코드 순서 잘 이해하셨습니다. 파일에서 줄 단위로 읽어와서 quiz / answer 에 각각 저장한 뒤에 scanner,next() 를 통해 사용자로부터 입력을 받아서 input 변수에 담고 문자열 비교를 통해 정답과 일치하는지를 확인합니다 😊

감사합니다

David님의 프로필 이미지
David

작성한 질문수

질문하기