#오류에 대해 지적해 주시면 수정하겠습니다.

 

System class

입출력을 하기위해선 운영체제의 도움이 반드시 필요하다. 하지만 자바는 운영체제 상에서 바로 실행되는 것이 아니라 JVM이라는 가상 머신위에서 작동된다. 따라서 직접 운영체제가 제공하는 기능에 접근하기는 힘들다.

JVM

 

 

이러한 기능들을 접근할 수 있게 도와주는게 System class이다!

System class를 이용하면 운영체제의 일부 기능을 이용할 수 있다. 예를 들면 프로그램 종료, 입출력, 시간읽기 등이 있다. System class의 모든 필드와 메소드는 static으로 구현되어 있다.

System class의 일부

System class 내부를 보면 InputStream, PrintStream이라는 객체형태의 in, out, err이 선언되어있다. 바로 이것들을 사용해서 자바는 입출력을 한다!

 

 

 


 

 

InputStream/OutputStream

InputStream이나 OutputStream은

"데이터가 들어오고 나가는 통로의 역할에 대해 규정해 놓은 추상클래스"라고 생각하면 된다.

InputStream class
OutputStream class

 

 

 


 

 

자바의 입출력

기본적으로 자바의 입출력은 Stream 기반이다. 컴퓨터 공학에서 스트림이란 연속적인 데이터의 흐름이나 데이터를 전송하는 소프트웨어 모듈을 의미한다. 다음 그림과 같이 자바는 스트림을 통해 입력/출력을 받게 된다.

책 - 황기태, 『 명품 JAVA Programming 』, 생능출판(2005), 442p

 

Stream의 특징

이러한 Stream은 3가지 대표적인 특징이있는데, 다음과 같다.

  1. 단방향
  2. 기본 단위는 바이트/문자
  3. FIFO구조

 

 

Byte Stream/Char Stream

Stream의 입출력 기본 단위는 바이트나 문자이다. 바이트를 기본단위로 받는 스트림을 Byte Stream, 문자를 기본단위로 받는 스트림을 Char Stream이라 한다.

 

-ByteStream중 입력을 받는 class들은 InputStream 추상클래스를 상속받아 만들어진다. 모두 InputStream로 끝난다.

-ByteStream중 출력을 하는 class들은 OutputStream 추상클래스를 상속받아 만들어진다. 모두 OutputStream로 끝난다.

-CharStream중 입력을 받는 class들은 Reader 추상클래스를 상속받아 만들어진다. 모두 Reader로 끝난다.

-CharStream중 출력을 하는 class들은 Writer 추상클래스를 상속받아 만들어진다. 모두 Writer로 끝난다.

InputStream/OutputStream/Reader/Writer을 상속받는 다양한 종류의 Stream들

 

 

자바의 버퍼입출력

버퍼입출력에 대해서는 조금더 자세히 알아보겠다.

ByteStream계열에는 BufferedInputStream, BufferedOutputStream

CharStream계열에는 BufferedReader, BufferedWriter이 해당된다.

 

입출력은 운영체제 API를 호출하는 방식으로 작동 되는데, 당연히 자주 운영체제 API가 호출될 수록 실행속도가 떨어진다. 그래서 스트림에게 각각 버퍼를 가지게 해서, 한번에 호출해서 가져오는 것이다.

책 - 황기태, 『 명품 JAVA Programming 』, 생능출판(2005), 442p

 

 

Stream Chain

스트림은 서로 연결 될 수 있다. 마치 쿠키를 만드는 시스템과 같다. 컨베이어 벨트 위에있는 밀가루 반죽을 한 파트는 적절한 크기로 자르고 한 파트는 쿠키틀로 모양을 내고 한 파트는 구울 것이다. 스트림도 그와 마찬가지로 입력 혹은 출력값을 내가 원하는 형태로 입력/출력하는 것이다. 스트림은 몇 개라도 연결 될 수 있다.

자바로 코딩테스트하면 맨날 쓰는 문장!

 

 

 


 

 

 

표준입출력과 객체입출력

- 표준입출력

System클래스를 사용하여 하는 입출력을 표준입출력이라 한다. 시스템 클래스를 보면 정수형, 실수형, 문자형, 바이트 등등.. 다양한 자료형을 입출력 하기위한 메서드가 있다.

 

표준입출력
출력을 하기위해 오버로딩된 print 메서드들

 

- 객체입출력

하지만 이세상에 그보다 훨씬 다양한 자료형이 존재한다. 이를테면 우리가 수업시간에 만든 class들이 있겠다. 이러한 객체들을 입출력하는 것을 객체입출력이라 한다. 객체입출력을 하기 위해서는 직렬화/역직렬화를 해야한다. 이에 대해서는 다음글에서 더 자세히 알아보겠다.

 

 

 

 

 

 

(+)

 

PrintStream vs OutputStream에 대해서

https://stackoverflow.com/questions/11372546/printstream-vs-printwriter

 

+ Recent posts