입력과 출력 (Input / Output)


입출력을 공부할 때마다 느끼는거지만, 알면 알수록 어려운거 같다.

예를 들어, 어떤 파일의 데이터를 입력으로 받고 새로운 파일로 출력한다고 해보자. 그럼 파일 시스템은 ?

Unix 시스템은 개행이 '\n'으로 이뤄져있고, Windows는 '\r\n'으로 이뤄져있는 등 저수준으로 가면 생각해야할게 참 많은 듯하다.

 

Java는 입출력을 크게 2가지로 분류한다. ( C/C++도 이렇게 분류한다. )

 

1. Byte 단위 입출력

Byte 단위 입출력의 최상위 클래스는 InputStreamOutputStream 추상 클래스다.

InputStream과 구현 클래스들을 나타내면 아래 그림과 같다. ( 구현 클래스 이거말고도 몇 개 더 있음 )

 

 

2. 문자 단위 입출력

문자 단위 입출력의 최상위 클래스는 ReaderWriter 추상 클래스다.

문자 단위로 입출력을 따로 구분짓는 이유는 문자라는게 다루기 까다롭기 때문. (생각해야할게 많다.)

문자를 1Byte로 표현한다면 Single-Byte Character Sets, 문자를 유동적인 Byte로 표현하고 싶다면 Multi-Byte Character Sets

 

Reader와 구현 클래스들을 나타내면 아래 그림과 같다. ( 구현 클래스 이거말고도 몇 개 더 있음 )

 

 

 

 

Scanner 클래스를 이용한 입력


키보드로 입력을 받기 위해 System.in 표준 입력스트림(정적 필드)를 이용한다. 그럼 바이트 단위로 입력을 받아들이는데, 입력받은 바이트 값들을 가지고 직접 원시 타입으로 변환해 사용하는게 불편했기 때문에 쉽게 원시 타입으로 변환할 수 있도록 Scanner 클래스를 사용한다.

 

Scanner 클래스는 JDK 1.5 부터 사용 가능하다.

 

Scanner 클래스는 기능이 정말 많은데, 몇 가지 기본적인 예제 코드를 살펴보자.

public class demo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
    }
}