th42500의 TIL

[Java] 입/출력 처리 본문

ComputerLanguage/Java

[Java] 입/출력 처리

th42500 2021. 12. 24. 00:44

알고리즘 문제를 풀다가 가장 기본이라고 생각되는 입/출력 처리에 대해 정확하게 짚고 넘어가고자 오늘은 입/출력 처리에 대해 정리해보고자 한다.

 

표준 입출력

✔ System.in : 표준 입력 

👉 데이터 입력 방법

  1️⃣ 콘솔에 TestCase 입력

  2️⃣ 파일을 통해 TestCase 입력

System.out : 표준 출력

 System.err : 표준 에러 출력

 

표준 입출력의 대상변경

 System.setOut()

 System.setErr()

 System.setIn() : 원하는 형식으로 입력 스트림 변경

더보기
package scanner;

import java.util.Scanner;

public class ScannerTest {
	
    public static void main(String[] args) {
    	
        System.setIn(new FileInputStream("input.txt"));  // 표준 입력을 파일로 변경
        
        Scanner sc = new Scanner(System.in);
        System.out.println("학번? " );
        int no = sc.nextInt();
        
        System.out.println("자신을 한마디로 표현하자면? ");
        sc.nextLine();  // 앞의 개행문자 없애주기
        
        String slogan = sc.nextLine();
        System.out.println(no + ":" + slogan);
    }
}

 

표준 입출력과 관련된 클래스

1️⃣ java.util.Scanner

✔ 자바에서 입력받을 때 가장 많이 쓰이는 입력 클래스

✔ 파일, 입력 스트림 등 대상에서 데이터를 읽어 구분자로 토큰화하고 다양한 타입으로 형변환하여 리턴해주는 클래스

✔ 장점

- 입력 스트림을 다루는 방법을 몰라도 쉽게 입력처리 가능

- 데이터 형변환이 자동으로 이루어져 편리

✔ 단점

- 대량의 데이터 처리 시 수행시간이 비효율적 (BufferedReader와 비교했을 때 최대 약 30%정도의 속도 차이 발생)

✔ 자주 사용하는 주요 메소드

next() 문자열을 반환
유효 문자열 후 공백 문자 만났을 때 처리
nextLine() 문자열을 반환
개행 문자 만났을 때 처리
next()와 달리 문자열 안에 공백과 tab을 포함한 채로 반환
nextInt() 정수형을 반환
유효 문자열 후 공백 문자 만났을 때 처리
nextDouble() 실수형(double)을 반환
유효 문자열 후 공백 문자 만났을 때 처리

nextLine()외의 메소드들은 구분자 직전까지 반환 (토큰화)

※ nextLine() 사용 시 주의할 점

더보기

앞서 next(), nextInt(), nextDouble() 등을 이용한 이후 nextLine()을 통해 입력을 받고자 한다면 앞서 사용되었던 개행문자를 nextLine()이 인식하여 원하는 입력을 할 수 없게 된다.

그러므로, 이런 경우에는 nextLine()을 앞에 한번 더 사용하여 개행문자를 처리해준 후 nextLine()으로 입력을 받도록 해야한다.

 

2️⃣ java.io.BufferedReader

✔ 필터 스트림 유형

✔ Line단위로 문자열 처리 👉 readLine()

✔ 대량의 데이터 처리 시 수행시간이 효율적

※ BufferedReader로 입력받을 때 주의할 점

더보기
BufferedReader는 생성자로 Reader유형을 받으므로 BufferedReader()의 매개변수로 바로 System.in을 넘길
수 없음

그러므로 BufferedReader 사용 시 표준 입력인 inputStream을 InputStreamReader()필터를 이용하여 Reader유형으로
변환하여 입력을 받아야 함

StringTokenizer

👉 BufferedrReader를 이용하여 입력받은 문자열들을 구분자 기준으로 토큰화 할 때 사용

👉 StringTokenizer 변수명 = new StringTokenizer(토큰화할 대상, 토큰화 기준);

👉 토큰화한 대상은 내가 사용하고자 하는 자료형으로 형변환하는 과정이 필요

 

3️⃣ java.lang.StringBuilder

 

✔ 문자열의 변경을 지원하는 클래스

✔ Java에서 하나의 문자열을 다른 문자열과 연결하였을 때 새로운 문자열이 생성되는 것을 방지

StringBuilder를 사용하는 이유

더보기
❗ Java에서의 String 객체는 상수이다. 
즉, 변경이 불가능한 객체이므로 한 번 생성되면 내용을 바꿀 수 없다.

그러므로 하나의 문자열과 다른 문자열을 연결하게 되면 새로운 문자열이 생성되고, 변경 전의 문자열은 가비지 
컬렉터로 들어가게 된다.

만약, 10만개의 문자열을 연결해야하는 상황이라면? 10만번 새로운 문자열을 생성해야 하므로 엄청난 메모리를 
잡아먹게 된다. 

이럴때 문자열을 변경할 수 있는 StringBuilder를 이용하여 String을 합치게 되면 불필요한 메모리 소비를 막을 수
있다.

✔ append()

   👉 문자열을 합치는 메소드

✔ toString()

   👉 StringBuilder를 String 자료형으로 변환하는 메소드

✔ setLength()

   👉 StringBuilder의 길이를 정해진만큼 잘라내는 메소드

   👉 가끔 문자열의 뒤에 있는 ','나 '!' 등의 필요없는 부분을 제외하고 출력할 때 유용하게 사용되는 메소드 

 

Comments