본문 바로가기
언어/JAVA

[Java] 입력 3가지 방법

by minhyeok.lee 2023. 2. 1.
반응형

자바(Java)

 자바에서 기본적으로 쓰이는 입력과 백준, 프로그래머스 등 알고리즘을 풀 때 시간단축에 욕심이 있는 분들이 보시면 좋다고 생각이 든다.

 

기본적인 입력

(1) Scanner() 클래스 -> Scanner sc = new Scanner(System.in);

 

그 다음으로 필자가 알고리즘 문제를 풀때 스캐너 대신 기본적으로 쓰는 입력인

(2) BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

 

마지막으로 속도의 한계를 실험해보고자 할 때..

(3) System.in.read()를 사용한 입력순서이다.

 

순서는 당연히 (1) < (2) < (3) 순서로 빠르다.  3이 제일 빠름

알고리즘 사이트에서 입력이 많은 문제를 풀 때는 계산하는 알고리즘은 그대로인데 입력만 바꿔줘도 2배가량 빨라지는 경우가 있다..

그래서 당연히 자바문제를 풀 때 (3)방식은 아니더라도 적어도 (2)로 풀어보는 것이 좋다고 생각한다.

 

ex)

       System.in = InputStream >> InputStreamReader >> BufferedReader or Scanner

                원시코드(byte)                       문자(char)                          문자열                    

 

Scanner와 BufferedReader안에 들어있는 System.in(System 클래스의 in 필드)는 InputStream의 정적 필드이고 InputStream으로 바이트 단위로 데이터를 보낸다. (read()는 1바이트씩 읽는다.)

 

InputStreamReader는 문자를 처리하는 방식이기 때문에 가변적인 문자열 처리는 끔찍하다..

그래서 사용하는 BufferedReader는 버퍼에 저장하고 한번에 내보내는 형식이다. Scanner와 가장 큰 차이점은 정규식 검사를 Scanner처럼 복잡하게 하지않아 Scanner보다 빠르다는 것!

 

다시 말해서 System.in, InputStreamReader, BufferedReader, Scanner 순서로 입력의 방식을 확장하지만 느려진다. (feat.  복잡한 정규식 검사 및 인코딩 등)

 

 

예시 - 정수형(int) 입력받기

ex 3 ~1) .. 예시는 속도가 빠른 순서로 한다!

 

1. System.in.read()로 구현한 입력

/ * Input Process

  *@see blog.naver.com/jihogrammer/222281999239

  */

private static int read() throws Exception {

  int c, n = System.in.read() - 48;

  while((c = System.in.read()) > 13) n = 10 * n + c - 48;

  return n;

}

 

// 위 입력 프로세스를 다른 방식으로 표현

private static int read() throws Exception {

  int c, n = System.in.read() & 15;

  while((c = System.in.read()) > 32) n = (n << 3) + (n << 1) + (c & 15);

  return n;

}

 

private static int read() throws Exception {

 int c&#44; n = System.in.read() - 48;

 while((c = System.in.read()) &gt; 13) n = 10 * n + c - 48;

 return n;

}



// 위 입력 프로세스를 다른 방식으로 표현

private static int read() throws Exception {

 int c&#44; n = System.in.read() & 15;

 while((c = System.in.read()) &gt; 32) n = (n &lt;&lt; 3) + (n &lt;&lt; 1) + (c & 15);

 return n;

}

 

필요한 상속은 없지만  + throws Exception 필요

 

 

2. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int x = Integer.parseInt(br.readLine());

    System.out.print(x);

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

 int x = Integer.parseInt(br.readLine());

 System.out.print(x);

 

 * 필요한 상속 + throws IOException

    import java.io.BufferedReader;

    import java.io.IOException;

    import java.io.InputStreamReader;

 

 

3. Scanner sc = new Scanner(System.in);

   int x = sc.nextInt();

   System.out.print(x);

 

Scanner sc = new Scanner(System.in);

 int x = sc.nextInt();

 System.out.print(x);

 

 * 필요한 상속

    import java.util.Scanner;

반응형

'언어 > JAVA' 카테고리의 다른 글

[Java] PECS(Producer-Extends, Consumer-Super) 공식  (0) 2023.02.14
[Java] 와일드카드 <?>  (0) 2023.02.13
[Java] 제네릭(Generic)  (0) 2023.02.13
[Java] 출력 3가지 방법  (0) 2023.02.01

댓글