자바

[자바 개념] IO(입출력)

라임온조 2023. 3. 19. 14:34

1. 스트림

1) 개념

데이터가 입출력되는 곳

2) 종류

구분 바이트 기반 스트림 문자 기반 스트림
입력 스트림 출력 스트림 입력 스트림 출력 스트림
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스 XXXInputStream XXXOutputStream XXXReader XXXWriter

입력 스트림

프로그램이 데이터를 입력받음

출력 스트림

프로그램이 데이터를 보냄

바이트 기반 스트림

그림, 멀티미디어, 문자 등 모든 종류의 데이터를 받고 보낼 수 있음

문자 기반 스트림

문자만 받고 보낼 수 있도록 특화

3) 특징

  • java.io 패키지에서 사용 가능

2. Reader

1) 개념

문자 기반 입력 스트림의 최상위 클래스로 추상 클래스. 모든 문자 기반 입력 스트림은 이 클래스를 상속받아서 만들어짐

2) 특징

  • FileReader, BufferedReader, InputStreamReader 클래스는 모두 Reader 클래스를 상속함

3) 메서드

read()

입력 스트림으로부터 한 개의 문자를 읽고 리턴

 

3. 보조 스트림

1) 개념

다른 스트림과 연결되어 여러 가지 편리한 기능을 제공해주는 스트림

2) 특징

  • 자체적으로 입출력을 수행할 수 없기 때문에 입력 소스와 바로 연결되는 Stream(InputStream, Reader...)이나 출력 소스와 바로 연결되는 Strema(OutputStream, Writer)등에 연결해서 입출력을 수행함
  • 문자 변환, 입출력 성능 향상, 기본 데이터 타입 입출력, 객체 입출력 등의 기능 제공

3) 생성

자신이 연결될 스트림을 생성자의 매개값으로 받는다

4) 종류

문자 변환 보조 스트림

소스 스트림이 바이트 기반 스트림이면서 입출력 데이터가 문자라면 Reader와 Writer로 변환해서 사용하는 것을 고려해야 함. Reader와 Writer는 문자 단위로 입출력하기 때문에 바이트 기반 스트림보다 편리하고, 문자셋의 종류를 지정할 수 있어서 다양한 문자를 입출력할 수 있기 때문

InputStreamReader

  • 바이트 입력 스트림에 연결되어 문자 입력 스트림인 Reader로 변환시키는 보조 스트림

OutputStreamWriter

  • 바이트 출력 스트림에 연결되어 문자 출력 스트림인 Writer로 변환시키는 보조 스트림

성능 향상 보조 스트림

프로그램이 입출력 소스와 직접 작업하지 않고 중간에 메모리 버퍼와 작업함으로써 실행 성능을 향상시킬 수 있음. 프로그램은 직접 하드 디스크에 데이터를 보내지 않고 메모리 버퍼에 데이터를 보냄으로써 쓰기 속도 향상. 버퍼는 데이터가 쌓이기를 기다렸다가 꽉 차게 되면 데이터를 한꺼번에 하드 디스크로 보냄으로써 출력 횟수 줄임.

BufferedReader

  • 문자 입력 스트림에 연결되어 버퍼를 제공
  • 입력 소스로부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장
  • 프로그램은 외부의 입력 소스로부터 직접 읽는 대신 버퍼로부터 읽음으로써 읽기 성능 향상
  • 생성자의 매개값으로 문자 입력 스트림을 설정
  • Reader 클래스에 있는 메서드에 추가로 readLine() 메서드를 추가로 가지고 있음. 엔터로 구분된 행 단위의 문자열을 한꺼번에 읽음

BufferedWriter

  • 문자 출력 스트림에 연결되어 버퍼를 제공
  • 출력 소스로부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장

 

4. 콘솔 입출력

1) 콘솔 개념

시스템을 사용하기 위해 키보드로 입력을 받고 화면으로 출력하는 소프트웨어

2) System.in

개념

프로그램이 콘솔로부터 데이터를 입력받을 때 사용하는 System 클래스의 in 정적 필드

특징

  • InputStream 타입의 필드
  • 입력된 키를 단순한 바이트 정보로 응용프로그램에게 제공하여 응용프로그램은 받은 바이트 정보를 문자나 숫자로 변환해야함

3) Scanner 클래스

개념

콘솔로부터 기본 타입의 값을 바로 읽을 수 있는 java.util 패키지에서 제공하는 클래스

생성

생성자에 System.int 매개값을 주면 됨

특징

  • 사용자가 입력하는 키 값을 공백 문자(' ', '\t', '\n')를 기준으로 분리하여 토큰 단위로 읽는다
    • 예: kim seoul 2 라고 입력하면 kim, seoul, 2 이렇게 분리하여 읽는 것
  • import java.util.Scanner를 통해 사용가능하다
  • 응용프로그램 전체에 Scanner 객체를 하나만 생성하고 공유하는 것이 바람직함. Scanner 객체를 여러 개 생성해도 이들은 모두 하나뿐인 System.in을 공유하므로 한 군데서 Scanner.close()를 호출하여 Scanner 객체를 닫아버리면 System.in 도 닫혀버려 응용프로그램 내 다른 Scanner 객체에서 키 입력을 받을 수 없게 됨

처리 과정

System.in 객체를 이용하여 키보드로부터 일련의 바이트 정보들을 입력받고, 이 바이트들을 정수, 실수, 문자, 문자열 등 자바 응용프로그램이 원하는 타입으로 변환하여 리턴한다. 이때, 변환은 Scanner 클래스에 있는 메소드를 이용한다.

주요 메서드

next, nextByte, nextShort, nextInt, nextLong, nextFloat, nextDouble, nextBoolean, nextLine, close, hasNext

next

  • 다음 토큰을 문자열로 리턴
  • enter키를 입력하여도 문자열이나 숫자 등 다른 키가 입력될 때까지 기다림, 결코 빈 문자열을 리턴하지 않음

nextInt

  • 다음 토큰을 int타입으로 리턴

nextLine

  • '\n'을 포함하는 한 라인을 읽고, '\n'을 버린 나머지 문자열 리턴
  • 공백이 낀 문자열을 입력받기 위해서 사용
  • enter 키만 입력될 때 빈 문자열을 리턴하면서 바로 돌아옴

close

  • Scanner의 사용 종료
  • scanner 객체가 닫히면 System.in도 함께 닫힘

hasNext

  • 현재 입력된 토큰이 있으면 true, 아니면 입력 때까지 무한정 대기
  • ctrl-z 키가 입력되면 입력 끝이므로 false 리턴

 

 

 

 

 

'자바' 카테고리의 다른 글

[자바 개념] Date  (0) 2023.03.19
[자바 개념] StringTokenizer  (0) 2023.03.19
[자바 개념] Optional<T>  (0) 2023.03.08
[자바 개념] 정규표현식, Pattern  (0) 2023.02.10
[자바 개념] StringBuffer, StringBuilder  (0) 2023.02.06