Java의 정석 기초편(남궁성) 정리 + a/15. 입출력

1 ~ 4 . 입출력과 스트림, byte기반 스트림, 보조 스트림, 문자기반 스트림

doriver 2024. 4. 16. 13:15

Input과 Output

컴퓨터 내부 또는 외부의 장치와 프로그램간의 데이터를 주고 받는것

예) 키보드로부터 데이터를 입력받고, 모니터로 출력

예) System.out.println() 을 이용해 화면에 데이터출력

 

 

스트림( stream )

데이터를 운반하는데 사용되는 연결 통로

 

자바에서 입출력을 수행하려면, 즉 어느 한쪽에서 다른쪽으로 데이터를 전달하려면

, 두 대상을 연결하고 데이터를 전송할수 있는 무언가가 필요한데 이것을 스트림(stream)이라고 정의 했다

 

스트림은 연속적인 데이터의 흐름을 물에 비유해서 붙여진 이름

물이 한쪽 방향으로만 흐르는것과 같이 스트림은 단방향통신만 가능하기 때문에, 하나의 스트림으로 입력과 출력을 동시에 처리할수 없다.

입력과 출력을 동시에 수행하려면

입력을 위한 입력스트림(input stream)과 출력을 위한 출력스트림(output stream), 2개의 스트림이 필요하다

 

스트림은 먼저 보낸 데이터를 먼저 받게 되어있으며 중간에 건너뜀 없이 연속적으로 데이터를 주고받는다

큐(queue)와 같이 FIFO( First In First Out )구조 ??

 

InputStream, OutputStream( byte기반 )

스트림은 byte단위로 데이터를 전송( 입출력의 단위가 1 byte )

 

입출력 대상에 따라 여러종류의 입출력 스트림이 있다

이들 모두 InputStream, OutputStream의 자손들 이다

 

어떤 대상에대해 작업할 것인지에 따라 해당 스트림을 선택

예) 어떤 파일 내용 읽고자 할땐 FileInputStream 사용

 

보조 스트림

스트림의 기능을 향상시키거나 새로운 기능 추가( 데이터 주고받는 스트림은 아니다, 데이터 입출력 기능x )

보조 스트림만으로 입출력을 처리할수 없고, 스트림을 먼저 생성한 다음에 이를 이용해 보조스트림을 생성해야한다.

	// 먼저 스트림 생성
	FileInputStream fis = new FileInputStream("test.txt");
			
	// 스트림을 이용해 보조스트림을 생성
	BufferedInputStream bis = new BufferedInputStream(fis);
	bis.read();

BufferedInputStream은 버퍼만을 제공한다.

버퍼를 사용한 입출력과 사용하지 않은 입출력간의 성능차이는 상당하여, 대부분 경우 버퍼를 이용한 보조스트림을 사용

 

한 바이트씩 입출력 하는것보다는 버퍼(바이트 배열)를 이용해서 한번에 여러 바이트를 입출력 하는것이 빠르다

 

문자기반 스트림( Reader, Writer )

C언어와 달리

, Java에선 한 문자를 의미하는 char형이 1 byte가 아니라 2 byte이기 때문에

바이트기반 스트림으로 2 byte인 문자를 처리하는데 어려움이있다

이를 보완하기 위해 문자기반 스트림이 제공된다.

문자데이터를 입출력 할때는 바이트기반 스트림 대신 문자기반 스트림을 사용하는게 좋음