본문 바로가기
Java/Java

자바입출력/byte기반) 시스템을 대상으로한 입출력 (System.in, System.out)

by 박채니 2022. 3. 29.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


자바 입출력(java IO)

- 프로그램을 기준으로 외부로부터 데이터가 들어오는 입력(input)과 프로그램에서 외부로 나가는 출력(output)으로 구성

- 입력의 대상 : 키보드/마우스/파일/네트워크 등

- 출력의 대상 : 화면/프린터/파일/네트워크/콘솔 등

 

자바 입출력 종류

① byte 단위 입출력

  - 송수신하고자 하는 데이터를 byte 단위로 쪼개 보내고 받는 것

② char 단위 입출력

  - 텍스트 전송에 특화된 방법

 

 

입력의 최상위 추상 클래스인 InputStream을 상속해 추상 메소드를 구현한 대표적인 자식 클래스에는 FileInputStream, BufferedInputStream, DataInputStream 등이 있습니다.

자바에서 콘솔 입력을 위해 미리 객체를 생성해 제공하는 System.in도 InputStream을 구현한 클래스의 객체 입니다.

 

출력의 최상위 추상 클래스인 OutputStream을 상속해 추상 메소드를 구현한 대표적인 자식 클래스에는 FileOutputStream, BufferedOutputStream, DataOutputStream 등이 있습니다.자바에서 콘솔 출력을 위해 미리 객체를 생성해 제공하는 System.out도 PrintStream 타입의 객체 입니다.

 

InputStream 주요 메소드

int available() inputStream의 남은 바이트 수를 리턴
abstract int read() int(4byte)의 하위 1byte에 읽은 데이터를 저장해 리턴 (추상메소드)
void read(byte[] b) 읽은 데이터를 byte[] b의 0번째 위치부터 저장하며 읽은 바이트 수를 리턴
int read(byte[] b, int off, int len) len 개수만큼 읽은 데이터를 byte[] b의 off 위치부터 저장
void close() InputStream의 자원 반환

 

OutputStream 주요 메소드

void flush() 메모리 버퍼에 저장된 output stream 내보내기(실제 출력 수행)
abstract void write (int b) int(4byte)의 하위 1byte를 output 버퍼에 출력(추상 메소드)
void write(byte[] b) 매개변수로 넘겨진 byte[] b의 0번째 위치에서부터 메모리 버퍼에 출력
void write(byte[] b, int off, int len) byte[]의 off 위치에서 len개를 읽은 후 출력
void close() OutputStream의 자원 반환

System을 대상으로한 입출력

 

int data = 0;
System.out.print("> 키보드의 문자를 입력하세요 : ");
		
try {
	while((data = System.in.read()) != -1) {
		System.out.println(data);
	}
} catch(IOException e) {
	e.printStackTrace();
	}
}

@콘솔출력값
> 키보드의 문자를 입력하세요 : abc
97
98
99
13
10
a
97
13
10
안녕
236
149
136
235
133
149
13
10

사용자의 키보드 입력(System.in)을 읽어와서(read()) 1byte씩 int형의 data 변수에 담아 읽어올 값이 더이상 없을 때(-1 리턴)까지 while문을 돌려 data를 출력해보았습니다.

int형으로 받아 출력하기 때문에 아스키코드 값이 출력되는 것을 알 수 있습니다.

13은 '\r'을 의미, 10은 '\n'을 의미하므로 엔터 값이라고 생각하면 될 것 같습니다.

또한, 한글은 utf-8 형식으로 읽어와 3byte 처리 되어 1byte씩 읽어오려고 하니 위처럼 처리가 되었습니다.

 

읽어온 data 값을 char로 형변환하여 글자 출력을 해보겠습니다.

int data = 0;
System.out.print("> 키보드의 문자를 입력하세요 : ");
		
	try {
		while((data = System.in.read()) != -1) {
			System.out.println((char)data);
	}
	} catch(IOException e) {
		e.printStackTrace();
	}
}
    
@콘솔출력값
> 키보드의 문자를 입력하세요 : abc
a
b
c




a
a




안
ì
•
ˆ

한글의 경우 3byte짜리를 1byte씩 쪼개서 불러와서 글자가 깨진 상태로 출력이 되었습니다.

 

Scanner 이전 사용자 입력 값 처리

//기본스트림 System.io(byte기반) -> 브릿지스트림 InputStreamReader -> 보조스트림 BufferedReader(char기반)
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
		
System.out.print("> 문자를 입력하세요 : ");
String data = null;
		
try {
	while((data = br.readLine()) != null) {
		System.out.println(data);
	}
} catch(IOException e) {
	e.printStackTrace();
}

@콘솔출력값
> 문자를 입력하세요 : abc
abc
안녕하세요
안녕하세요
Hello world
Hello world
Hello JAVA
Hello JAVA

BufferedReader는 문자기반 스트림이지만 입력(엔터 전까지) 문장을 읽어와서 유용하게 사용이 됩니다.

따라서 byte기반 스트림을 문자기반 스트림과 함께 사용이 불가하므로, InputStreamReader를 통하여 사용하였습니다.

 

스트림을 나눠서 객체 생성할 수도 있겠지만, 한 번에 처리할 수도 있겠죠?

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

 

커스텀 nextInt() 메소드 만들기

public void test3() {
	System.out.print("> 숫자를 입력하세요 : ");
	int input = nextInt();
	System.out.println(input + "을 입력하셨습니다.");	
}
	
public int nextInt() {
	int n = 0;
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
	try {
		String data = br.readLine();
		n = Integer.parseInt(data);
	} catch(IOException e) {
		e.printStackTrace();
	}
	return n;
}
    
@콘솔출력값
> 숫자를 입력하세요 : 4
4을 입력하셨습니다.