Java

[Java]입력과 출력(Input and Output) - part.1 Basic

MoZZANG 2022. 3. 23. 18:21

▲ 일반적으로 우리가 컴퓨터에 어떠한 데이터값을 넣을 때는 키보드를 통해서 입력한다. 또한 일반적으로 우리는 모니터를 통해서 다양한 데이터들을 접한다. 때문에 표준이 되는 입력장치는 키보드라 할 수 있고, 표준이 되는 출력장치는 모니터라 할 수 있다.

 

노드(node)란 입력하는 쪽, 입력받은 것을 돌리는 프로그램쪽 그리고 출력하는 쪽에 서로 연결할 수 있는 부분들을 가리킨다. 

▲노드에 연결된 스트림을 노드스트림이라하며 데이터 소스나 목적지에 직접 연결할 수 있는 스트림이다.

입력장치에 연결된 노드스트림인 입력스트림이라하고 출력장치에 연결된 노드스트림은 출력스트림이라 한다.

 

 

이제 각각 다른 입력장치에서 입력받아서 출력장치로 출력해보자

 

1. 키보드에서 입력 받아서 파일과 모니터로 출력

▲ System.in은 키보드에서 입력받아서 1byte씩 프로그램으로 보내준다. 1byte씩 보내기때문에 바이트기반인 InputStream을 사용해서 값을 받아준다.

 

키보드로 입력한 값들을 파일로만들어서 저장을 위해서는 FileOutputStream을 사용해야한다. OutputStream 역시 바이트 기반의 값을 출력장치로 1byte씩 전송해주기 때문이다.

 

InputStream과 OutputStream이 붙은건 모두 바이트 기반의 클래스라고 생각하면 된다.

 

 

 

이번에는 키보드로 입력받은 것을 모니터로 바로 출력해보도록 하자.

 

▲ PrintStream은 OutputStream을 상속받은 자식클래스이다. 즉 OutputStream과 동일한 기능이라고 생각하면된다.

 

바이트기반으로 입력받은 데이터 즉, InputStream으로 받은  is로 키보드입력값을 읽고 출력을 위한 클래스PrintStream으로 입력된 값을 출력할 것이다 즉, ps로 출력할 것이다.

 

inputStream에 있는 read()메소드는 입력스트림에 있는 데이터를 1byte만큼 읽고 바이트값을 반환한다. 만약 입력스트림으로부터 반환할 데이터가 없다면 -1을 반환하게 된다. 

 

fos 즉,  FileOutputStream에는 write()라는 출력용 메소드가 있다. 하지만 write()는 데이터값을 출력스트림안으로 보내주는 기능만을 한다 출력스트림안에서 실제로 모니터로 출력시켜주는 역할은 없는 것이다. 따라서 write()는 무조건 flush()를 해줘야 출력이 된다는 점을 유의하자

 

또한 표준입출력장치 즉, 키보드에서 받거나 모니터로 출력을 하는 경우는 해당사항이 없지만 만약 파일에서 데이터를 읽어오거나 파일로 데이터를 내보낸다면 꼭 마지막에는 노드스트림을 제거해줘야한다. 파일안정성을 위해서. 따라서 꼭 close()메소드를 이용해서 닫아줘야한다는 것도 기억하자

 

 

 

▼ 메인메소드에서 코드를 실행시켜보면 키보드로부터 입력을 받는다. 입력을 하면 곧바로 모니터에 출력이 되는 것을 볼 수 있다.

 

▼ 또한 우리가 입력한 데이터값이 저장된 파일이 생성된다. 파일을 열어보면 아래와 같이 우리가 입력한 데이터들이 잘 저장되있는 것을 알 수 있다.

 

 

 

 

입력과 출력에서 각각 바이트 기반과 문자기반의 최상위 추상클래스와 하위 스트림을 정리해놓은 표이다.

 

기본적으로 입력을 바이트 스트림으로 받으면 즉, 1byte씩 읽는다면 출력또한 바이트 스트림으로 해주어야한다.

입력을 문자스트림 즉 한 문자씩 읽는다면 출력 또한 문자스트림으로 해주어야한다.

 

하지만 입력을 바이트 스트림으로 입력을 받았지만 Bridge Stream 을 이용해서 바이트를 문자기반으로 변형 후 문자 스트림을 이용해서 한 문자씩 읽어서 출력할 수도 있다.

 

반대로 문자스트림으로 입력받아서 bridge Stream으로 바이트기반으로 바꾼 후 1byte씩 읽어서 출력할 수도 있다.

 

비유하자면 형변환이라고 생각해도 좋다.

 

'Java' 카테고리의 다른 글

[Java]입력과 출력 -part.3(File -> Monitor, File)  (0) 2022.03.23
[Java]입력과 출력 -part.2(bridge stream)  (0) 2022.03.23
[Java]Thread  (0) 2022.03.22
[Java]익명 클래스(Anonymous Class)  (0) 2022.03.22
[Java]Builder pattern  (0) 2022.03.22