[240110]Scanner, Buffered

전역변주의 DB·2024년 1월 10일
0

하루회고

목록 보기
9/11

코딩테스트 공부를 하면서 Scanner를 통해서 입력을 받았는데 Buffered를 사용하는 것을 추천해서 익숙해지려고 공부..

BufferedReader

Scanner 와 비교

  • Scanner 는 스페이스와 엔터를 경계로 입력값을 인식하지만, BufferedReader는 엔터만 경계로 인식한다. 또한 받은 데이터를 String으로 고정하기 때문에 데이터 후처리를 해야한다.

BufferedReader 란?

  • Scanner 보다 빠르다.

  • InputStreamReader 에 버퍼링 기능이 추가된 클래스

    입력 스트림에서 문자를 읽는 함수
    문자나 배열, 라인들을 효율적으로 읽기 위해 문자들을 버퍼에 저장하고 읽는 방법을 취한다.
    버퍼의 사이즈는 사용자가 지정할 수 있으며, 지정하지 않으면 default 사이즈가 적용된다.

    InputStreamReader 문자열을 입력받았을 때, Character 단위로 읽는다.. 비효율적! 이기때문에 보완한 것이 BufferedReader

    Buffer : 데이터를 전송할 때, 일시적으로 그 데이터를 보관하는 임시메모리 영역
    Buffer flush : 버퍼에 남아 있는 데이터를 출력 시킨다.(버퍼를 비운다)
    BufferedReader : 버퍼를 이용한 입력
    BufferedWriter : 버퍼를 이용한 출력

    BufferedReader 특징

  1. 사용자가 요청할 때 마다 데이터를 읽어오는 것이 아닌 일정한 크기의 데이터를 한번에 읽어와 Buffer에 보관 후, 사용자의 요청이 있을 때 읽어오는 방식.
  2. 속도가 빠르고 시간 부하가 적다
  3. 공백도 String으로 인식

BufferedReader 를 적용한 나의 코드

BOJ 문제를 푼 코드입니다.

import java.io.*;

/*
첫째 줄에 연도가 주어진다. 연도는 1보다 크거나 같고, 4000보다 작거나 같은 자연수이다.
첫째 줄에 윤년이면 1, 아니면 0을 출력한다.
윤년은 연도가 4의 배수이면서, 100의 배수가 아닐 때 또는 400의 배수일 때이다.
 */

public class Main {
    public static void main(String[] args) throws IOException {
        // BufferedReader를 사용하기 위해서는 throws IOException을 해 주어야 함.
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        //Buffer 로 입력 받으면 무조건 String
        String input = br.readLine();

        //연산을 위해서 String -> int 로 형변환
        int year = Integer.parseInt(input);

        //입력받은 year에 대해서 1과 4000사이의 자연수가 맞는지 확인하는 함수
        checkInput(year);

        //윤년인지 아닌지 확인 하는 함수
        checkYear(year);

        br.close();
    }

    // 입력 조건에 맞지않은 값이 입력되면 프로그램 종료
    private static void checkInput(int year) {
        if (year < 0 || year > 4000) {
            System.exit(0);
        }
    }

    //윤년인지 아닌지 확인하는 함수, if문의 참인 조건(괄호) 안에는 윤년인이 아닌 경우를 true로 한다.
    private static void checkYear(int year) {
        if ( year % 4 != 0) { // 4의 배수가 아니라면
            System.out.println("0"); // 윤년이 아니다 0 출력
        } else if ( year % 100 == 0 && year % 400 !=0) { // 100의 배수 이고  400의 배수가 아니면 윤년이 아니다
            System.out.println("0");
        } else {
            System.out.println("1"); // 그래서 모든 조건을 만족하지 않으면 윤년이다.
        }
    }
}
profile
배운 내용을 기록하는 공간입니다.

0개의 댓글