Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

백엔드 개발 공부 일지

JAVA Basic - 자바 입출력 본문

Java 입문

JAVA Basic - 자바 입출력

JungCat 2022. 12. 14. 10:30

● 자바 입출력과 스트림

입출력은 프로그램의 가장 기본 기능이지만, 외부 저장 장치 네트워크와 연동해야 하기 때문에 장치에 따라 다르게 구현해야 한다. 자바는 장치에 따라 독립적이고 효율적인 입출력 기능을 제공한다.

 

- 스트림이란??

자바에서 모든 입출력은 스트림(stream)을 통해 이루어진다. (스트림은 네트워크에서 유래된 용어이다)

입출력장치의 다양성으로 인해 장치에 따라 호환성문제를 해결하기 위하여 자바는 일종의 가상 통로인 스트림을 제공한다.

자료를 읽어들이려는 소스(source)와 자료를 쓰려는 대상(target)에 따라 각각 다른 스트림 클래스를 제공한다.

 

스트림을 세 가지 기준에 따라 분류해보면 다음과 같다.

 

1) 입력 스트림과 출력 스트림

입력 스트림 : 어떤 대상으로부터 자료를 읽어 드릴 때 사용하는 스트림, InputStream이나 Reader로 끝나는 이름의 클래스 (FileInputStream, FileReader, BufferdInputStream, BufferedReader 등)

 

출력 스트림 : 사용자가 작성한 내용을 파일에 저장할 때 사용하는 스트림, OutputStream이나 Writer로 끝나는 이름의 클래스 (FileOutputStream, FileWriter, BufferedOutputStream, BufferedWriter 등)

 

스트림은 '단방향'으로 자료가 이동하기 떄문에 입출력을 동시에 할 수 없다.

2) 바이트 단위 스트림과 문자 단위 스트림

원래 자바의 스트림은 바이트(byte) 단위로 자료의 입출력이 이루어진다. 그러므로 그림, 동영상, 음악 파일등 대부분 파일은 바이트 단위로 읽거나 쓰면 된다. 그러나, 자바에서 하나의 문자를 나타내는 char형은 2바이트이기 때문에 1바이트만 읽으면 한글같은 문자는 깨지게 된다.

따라서 입출력 중 가장 많이 사용하는 자료인 문자를 위해 문자 스트림을 별도로 제공한다.

즉, 일어들이는 자료형에 따라 바이트용과 문자용 스트림이 있다.

 

스트림 클래스의 이름이 Stream으로 끝나는 경우는 바이트 단위를 처리하는 Stream이다.

Reader나 Writer로 끝나는 이름은 문자를 위한 스트림 클래스이다.

 

바이트 스티림 : FileInputStrema, FileOutputStream, BufferedInputStream, BufferedOutputStream 등

문자 스트림 : FileReader, FileWriter, BufferedReader, BufferedWriter등

3) 기반 스트림과 보조 스트림

마지막으로 어떤 스트림이 자료를 직접 읽거나 쓰는 기능을 제공하는 스트림인가, 아니면 다른 스트림에 부가 기능을 제공하는가에 따라 기반스트림과 보조스트림으로 구분할 수 있다.

 

기반 스트림은 소스나 대상에서 직접 읽고 쓸 수 있으며 입출력 대상에 직접 연결되어 생성되는 스트림이다.

반면, 보조 스트림은 직접읽고 쓰는 기능은 없다.

따라서 항상 다른 스트림을 포함하여 생성되어야 한다.

 

기반스트림과 보조스트림은 이름으로의 구별이 어려우므로 많이 사용하는 클래스 위주로 기억해주는 것이 좋다.

(대부분의 기반 스트림은 소스나 대상의 이름을 가지고 있긴 하다.)

 

기반 스트림 : FileInputStream, FileOutputStream, FileReader, FileWriter 등

보조 스트림 : InputStreamReader, OutputStreamWriter, BufferedInputStream, BufferedOutputStream 등

 

 

● 표준 입출력

자바에서는 화면에 출력하고 입력받는 표준 입출력 클래스를 미리 정의해 두었다. (이 클래스는 프로그램이 시작될 때 자동으로 생성된다.)

자료형 변수 이름 설명
static PrintStream out 표준 출력 스트림
static InputStream in 표준 입력 스트림
static OutputStream err 표준 오류 출력 스트림

- System.in

System.in을 사용하여 문자를 입력받는 프로그램을 구현해 보자.

입출력에 관련한 코드는 예외처리를 항상 해주어야 한다.

package stream.inputstream;


import java.io.IOException;

public class SystemInTest {
    public static void main(String[] args) {
        System.out.println("알파벳 여러개를 쓰고 Enter를 누르세요");
        int i;
        try {
            while ((i = System.in.read()) != '\n') {
                System.out.print((char) i);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

- Scanner 클래스

Scanner 클래스는 java.util 패키지에 있는 입력 클래스이다.

 

Scanner클래스는 문자뿐 아니라 정수, 실수 등 다른 자료형도 읽을 수 있다.

또한 콘솔 화면 뿐 아니라 파일이나 문자열을 생성자의 매개변수로 받아 자료를 읽어 올 수 있다.

여러대상에서 자료를 읽는 Scanner클래스의 생성자는 다양하다

 

생성자 설명
Scanner(File source) 파일을 매개변수로 받아 Scanner를 생성
Scanner(InputStream source) 바이트 스트림을 매개변수로 받아 Scanner를 생성
Scanner(String source) String을 매개변수로 받아 Scanner를 생성

 

Scanner scanner = new Sanner(System.in) 처럼 사용하면 표준 입력으로부터 자료를 읽어들이는 기능을 사용할 수 있따.

(이는 System.in으로 입력받는 것보다 다양한 메서드를 활용할 수 있기 때문에 자주 사용하는 클래스이다.)

(또한, 표준입력을 사용하면 바이트 단위 자료만 처리할 수 있어 한글같은 경우 보조스트림을 추가로 사용하여야 하는데 Scanner는 다양한 자료형을 입력할 수 있어 많이 활용된다.)

 

Scaaner클래스에서 제공하는 메서드는 다음과 같다.

 

메서드 설명
boolean nextBollena() boolean  자료를 읽음
bute nextBute() 한 바이트 자료를 읽음
short nextShort() short 자료형을 읽음
int nextInt() int 자료형을 읽음
long nextLong() long 자료형을 읽음
float nextFloat() float 자료형을 읽음
double nextDouble() double 자료형을 읽음
String nextLine() 문자열 String을 읽음

 

- Console 클래스

System.in을 사용하지 않고 간단히 콘솔 내용을 읽을 수 있는 Console클래스도 있다. (이클립스와는 연동이 되지 않는다.)

호환성도 떨어지므로 그냥 Scanner 쓰자 ㅎ

● 바이트 단위 스트림

이제부터 Stream의 종류와 사용방법에 대해 정리해보자. (모두 외워야하는 것은 아니니 흐름만 파악해보자)

- Input스트림

바이트 단위로 읽는 스트림중 최상위 스트림 (추상 클래스이다.)

 

대표적인 하위 클래스는 아래와 같다.

스트림 클래스 설명
FileInputStream 파일에서 바이트 단위로 자료를 읽는다.
ByteArrayInputStream byte 배열 메모리에서 바이트 단위로 자료를 읽는다.
FilterInputStream 기반 스트림에서 자료를 읽을 때 추가 기능을 제공하는 보조 스트림의 상위 클래스이다.
 
InputStream은 바이트 자료를 읽기 위해 다음 메서드를 제공한다.

 

메서드 설명
int read() 입력 스트림으로부터 한 바이트의 자료를 읽습니다. 읽은 자료의 바이트 수를 반환한다.
int read(byte[ ] b) 입력 스트림으로부터 b[ ] 크기의 자료를 b [ ]에 읽습니다. 읽은 자료의 바이트 수를 반환한다.
int read(byte [ ] b, int off, int len) 입력 스트림으로부터 b[ ] 크기의 자료를 b [ ]의 off 변수 위치부터 저장하여 len만큼 읽습니다. 읽은 자료의 바이트 수를 반환합니다.
void close() 입력 스트림과 연결된 대상 리소스를 닫습니다.
(예 : FileInputStream인 경우 파일 닫음)
 
read() 메서드의 경우 한바이트를 읽어 int에 저장하지만, 더이상 읽어 드릴 이유가 없는 경우 -1이 반환됨을 유의하자.

● 문자 단위 스트림

- Reader

문자 단위로 읽는 스트림 중 최상위 스트림으로 다음 하위클래스를 주로 사용한다.

스트림 클래스 설명
FilerReader 파일에서 문자 단위로 읽는 스트림 클래스이다.
InputStreamReader 바이트 단위로 읽은 자료를 문자로 변환해 주는 보조 스트림 클래스
BufferedReader 문자로 읽을 떄 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공해 주는 보조 스트림
대표적인 메서드는 다음과 같다.
메서드 설명
int read() 파일로부터 한 문자를 읽고 읽은 값을 반환한다.
int read(char[ ] buf) 파일로부터 buf 배열의 문자를 읽는다.
int read(char[ ] buf, int off, int len) 파일로부터 buf 배열의 off 위치에서부터 len개수만큼 문자를 읽는다.
void close() 스트림과 연결된 파일 리소스를 닫는다.

- FileReader

FileReader를 생성하는 데 사용하는 생성자는 다음과 같다.

(FileInputStream과 마찬가지로 읽으려는 파일이 없으면 FileNotFoundException이 발생한다.)

 

생성자 설명
FileReader(String name) 파일 이름 name(경로 포함)을 매개변수로 받아 입력 스트림을 생성
FilerReader(File f) File 클래스 정보를 매개변수로 받아 입력 스트림을 생성

- Writer

역시 문자 단위로 출력하는 스트림중 최상위 스트림으로 다음 하위클래스를 주로 사용한다.

스트림 클래스 설명
FilerWriter 파일에 문자 단위로 출력하는 스트림 클래스이다.
OutputStreamWriter 바이트 단위로 출력한 자료를 문자로 변환해 주는 보조 스트림 클래스
BufferedWriter 문자로 쓸 때 배열을 제공하여 한꺼번에 쓸 수 있는 기능을 제공해 주는 보조 스트림
메서드 설명
void write(int c) 한 문자를 파일에 출력한다.
void write(char[ ] buf) 문자 배열 buf의 내용을 파일에 출력한다.
void write(char[ ] buf, int off, int len) 문자 배열 buf의 off 위치에서부터 len개수만큼 문자를 파일에 출력한다.
void write(String str) 문자열 str을 파일에 출력한다.
void write(String str, int off, int len) 문자열 str의 off번째 문자부터 len 개수만큼 파일에 출력한다.
void flush() 파일에 출력하기 전에 자료가 있는 공간(출력 버퍼)을 비워 출력한다.
void close() 파일과 연결된 스트림을 닫는다. 출력 버퍼도 비워진다.

- FileWriter

다른 스트림 클래스와 마찬가지로 생성자를 사용해서 스트림을 생성한다.

FileOutputStream과 마찬가지로 출력파일이 존재하지 않으면 파일을 생성한다. 생성자는 다음과 같다.

생성자 설명
FileWriter(String name) 파일 이름 name(경로 포함)을 매개변수로 받아 출력 스트림을 생성한다.
FileWriter(String name, boolean append) 파일 이름 name(경로 포함)을 매개변수로 받아 출력 스트림을 생선한다. append값이 true이면 파일 스트림을 닫고 다시 생성할 때 파일 끝에 이어서 쓴다. (기본값은 false)
FileWriter(File f,) File 클래스 정보를 매개변수로 받아 출력 스트림을 생성한다.
FileWriter(File f, boolean append) File 클래스 정보를 매개변수로 받아 출력 스트림을 생성ㅎ나다. append값이 true이면 파일 스트림을 닫고 다시 생성할 떄 파일 끝에 이어서 쓴다. (역시 기본값 false)

● 보조 스트림

아래부터는 나중에 정리하자

● 직렬화

● 그 외 입출력 클래스

 

'Java 입문' 카테고리의 다른 글

Java Basic - 컬렉션 프레임 워크  (0) 2023.02.01
JAVA Basic - 예외처리  (0) 2022.12.12
JAVA Basic - 기본 클래스  (0) 2022.12.12
JAVA Basic - 인터페이스  (0) 2022.12.08
JAVA Basic - 추상 클래스  (0) 2022.12.08
Comments