본문 바로가기
자바(Java)

자바 코딩테스트를 위한 정리 - 입출력

by codeyaki 2022. 5. 10.
반응형

입력

1. scanner()

가장 기본적인 입력 클래스이다.

import java.util.Scanner;

사용하기 위해서는 패키지를 추가해주어야 한다.

Scanner scanner = new Scanner(System.in);

 

 

스캐너는 토큰 단위로 동작하는 클래스임을 기억하자.(토큰 단위: 공백/개행 문자로 구분되는 단위)

Scanner() 메서드 (반환형)

- close(): 입력 종료, 할당받았던 자원들 반납하기

띄어쓰기 단위

- next(): String 읽기  (String)

- nextInt(): int 읽기 (int)

- nextBoolean(): boolean 읽기 (boolean)

- nextByte(): byte읽기 (byte)

- nextShort(): short 읽기 (short)

- nextLong(): long 읽기 (long)

- nextFloat(): float 읽기 (float)

- nextDouble(): double 읽기 (double)

엔터 단위

- nextLine(): 한줄 전부 다 읽기, 엔터('\n')가 나오기 전까지 전부 다 읽음 (String)

 

 

예제) 두개의 수를 입력으로 받아서 더해보기.

import java.util.Scanner;
class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        System.out.println(a+b);
    }
}

 

입력: 5 4

결과: 9

2. BufferedReader()

버퍼를 사용하는 입력 클래스로 Scanner() 보다 더욱 빠른 것이 특징이다.

코딩 테스트를 진행하다보면 입력이 많이 들어오는 경우가 많은데 Scanner()로 구현하면 시간이 오래 걸려 불합격하는 경우가 있다. 그러므로 가능하면 해당 클래스를 사용해주는 것이 좋다.

 

사용방법

import java.io.BufferedReader;
import java.io.InputStreamReader;

클래스를 사용해주기 위해선 해당 패키지들을 추가해주어야 한다.

또한 사용하는 클래스에 IOException을 추가해주거나 메서드 사용 코드를 try/catch로 감싸주어야 한다

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

그 후 해당 방법으로 객체를 생성해주면 된다.

여기서 사용하는 InputStreamReader는 1byte단위로 읽는 System.in을 스트림으로 읽어 Charter단위로 읽을 수 있도록 만들어주는 클래스인데 BufferedReader를 통해 이를 buffer에 담아 line 단위(엔터)로 읽을 수 있게 만들어 주는 방법이다.

왜냐하면 InputStreamReader만 사용하면 읽을 배열의 크기를 직접 지정해주어야 하기 때문이다. 

 

메서드(반환형)

- close(): 입력을 종료! (할당 받았어 자원들을 반납하기)

- mark(int readAheadLimit): 현재 위치를 마킹하기

- markSupperted(): 해당 스트림이 mark기능 지원 여부 (boolean)

- read(): 한 글자를 읽어 아스키코드로 반환(system.in과 같은 기능) (int)

- read(char[] cbuf, int offset, int length):

    cbuf의 offset위치부터 length만큼의 문자를 스트림으로부터 읽어 아스키코드로 반환 (int)

- readLine(): 한줄 읽기 (String)

- ready(): 입력스트림이 사용 가능한 상태 여부, 사용 가능할 경우 ture반환 (boolean)

- reset(): 마킹이 있는 경우 해당 위치부터 다시 시작하기, 없으면 처음부터 시작.

- skip(long n): n개의 문자를 건너 뛰기 (long)

 

예제) 두개의 수를 입력으로 받아서 더해보기.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        StringTokenizer st = new StringTokenizer(s);
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        System.out.println(a+b);
    }
}

입력: 5 4

결과: 9

 

%참고% StringTokenizer()

StringTokenizer()는 String을 token단위로 나눠주는 클래스이다. String.split()과 비슷한 역할을 한다.

import java.util.StringTokenizer;

사용 패키지는 util이며 생성자로 문자열을 넣어주면 된다.

StringTokenizer st = new StringTokenizer(s);

생성자 : StringTokenizer(문자열, 구분자, boolean)

    구분자, boolean은 생략 가능하다. 

    구분자를 넣을 경우 구분자를 기준으로 문자열을 나눠준다. (띄어쓰기가 디폴트)

    구분자는 여러개도 가능하다. (예를 들어 ':'와 '-' 둘 다 구분자로 사용하고 싶다면 StringTokenizer(str, ":-"); 로 생성)

    boolean에 true를 넣을 경우 구분자를 포함해서 반환, false시 포함하지 않고 반환한다. (false가 디폴트)

사용 메서드

- boolean hasMoreTokens(): 토큰이 남아있는 경우 true, 없을 경우 false 반환

- boolean hasMoreElements(): 객체가 남아있는 경우 true, 없을 경우 false 반환

- boolean nextToken(): 다음 토큰을 반환

- Object nextElements(): 다음 객체를 반환

- countTokens(): 모든 토큰의 개수를 반환

 

 

출력

1. System.out.println()

설명할 필요없이 잘 알려진 기본적인 자바 출력

패키지를 포함할 필요 없이 그냥 사용해주면 된다.

혹시나 개행 문자를 포함시키지 않고 싶다면 println()이 아닌 print()를 사용해주면 된다.

 

2. BufferedWriter()

출력을 여러번 반복해서 해야 할 때 1번의 방법보다 빠른 속도로 출력하는 방법이다.

사용하기 위해서는 패키지를 추가해주어야 한다.

import java.io.BufferedWriter
import java.io.OutputStreamWriter

입력과 마찬가지로 OutputStreamWriter클래스도 사용하므로 같이 추가해 주어야 한다.

또한 사용하는 클래스에 IOException을 추가해주거나 사용 코드를 try/catch로 감싸주어야 한다

그 후 객체를 생성해준다.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

 

 

메서드

- close(): 출력을 종료, 할당받은 자원을 반환하기. 종료하기 전에 flushing을 해줘야 한다.

- flush(): 버퍼에 담겨있는 내용을 전부 출력하고 버퍼를 비운다.

- newLine(): 버퍼에 개행문자를 삽입한다.

- write(char[] cbuf, int offset, int length): 버퍼cbuf의 offset위치부터 length크기만큼 버퍼에 입력

- write(int c): 한글자 쓰기(아스키코드)

- write(String s, int offset, int length): 문자열 s의 offset위치부터 length크기만큼 버퍼에 입력

(위 메서드들은 전부 반환형이 void로 없다.)

 

예제) 두 개의 수를 입력으로 받아서 더해보기.

import java.io.*;
import java.util.StringTokenizer;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        StringTokenizer st = new StringTokenizer(s);
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        //출력
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(a + b);
        bw.flush();
        bw.close();
    }
}
반응형