자바에서 표준 입력(키보드 입력)을 받기 위해 보통 Scanner
클래스를 많이 사용하지만, InputStream과 보조 스트림을 통해 동일한 기능을 구현할 수 있습니다. 이를 통해 다양한 방식으로 사용자 입력 처리 및 다국어 지원을 할 수 있습니다. 여기서는 InputStream
, InputStreamReader
, BufferedReader
를 사용하여 입력을 처리하는 방법을 사용합니다.
System.in
을 통해 바이트 스트림인 InputStream
을 사용하여 한 글자씩 입력받을 수 있습니다. 하지만, 기본적으로 ASCII 문자만 처리할 수 있기 때문에 다국어 지원이 어렵습니다.
package com.io1;
import java.io.IOException;
import java.io.InputStream;
public class IOEx21 {
public static void main(String[] args) {
InputStream is = null;
try {
is = System.in;
System.out.print("입력 : ");
int data = is.read();
System.out.println("입력값 : " + (char) data); // 다운캐스팅
} catch (IOException e) {
System.out.println("[에러] " + e.getMessage());
} finally {
if (is != null) { try { is.close(); } catch (IOException e) {} }
}
}
}
결과:
입력: aaa
입력값: a
InputStreamReader
는 InputStream
을 문자 스트림으로 변환하는 역할을 하여 다국어(유니코드) 입력을 지원합니다.
package com.io1.systen;
import java.io.IOException;
import java.io.InputStreamReader;
public class IOEx22 {
public static void main(String[] args) {
InputStreamReader isr = null;
try {
isr = new InputStreamReader(System.in);
System.out.print("입력 : ");
int data = isr.read(); // 한 글자 입력
System.out.println("입력값 : " + (char) data);
} catch (IOException e) {
System.out.println("[에러] " + e.getMessage());
} finally {
if (isr != null) { try { isr.close(); } catch (IOException e) {} }
}
}
}
결과:
입력: 가
입력값: 가
BufferedReader
는 버퍼링 기능을 추가하여 입력 속도를 향상시키고, 한 글자가 아닌 한 줄을 처리할 수 있는 기능을 제공합니다.
package com.io1.systen;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class IOEx22 {
public static void main(String[] args) {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("입력 : ");
int data = br.read(); // 한 글자 입력
System.out.println("입력값 : " + (char) data);
} catch (IOException e) {
System.out.println("[에러] " + e.getMessage());
} finally {
if (br != null) { try { br.close(); } catch (IOException e) {} }
}
}
}
결과:
입력: 가
입력값: 가
BufferedReader
의 readLine()
메서드를 사용하여 한 줄을 입력받을 수 있습니다. 이 메서드는 사용자가 입력을 완료할 때까지 대기하며, 줄 단위로 데이터를 처리합니다.
package com.io1.systen;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class IOEx22 {
public static void main(String[] args) {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("입력 : ");
String line = br.readLine(); // 한 줄 입력
System.out.println("입력값 : " + line);
} catch (IOException e) {
System.out.println("[에러] " + e.getMessage());
} finally {
if (br != null) { try { br.close(); } catch (IOException e) {} }
}
}
}
결과:
입력: 가나다
입력값: 가나다
입력을 계속 반복하다가 특정 조건(예: "exit" 입력)을 만나면 종료하는 무한 루프를 구현할 수 있습니다. 아래 코드는 사용자가 "exit"을 입력하면 루프를 빠져나갑니다.
package com.io1.system;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class IOEx23 {
public static void main(String[] args) {
BufferedReader br = null;
br = new BufferedReader(new InputStreamReader(System.in));
try {
while (true) {
System.out.print("동이름을 입력하세요. 입력을 마치려면 'exit' 입력 > ");
String strDong = br.readLine(); // 한 줄 입력
if (strDong.equals("exit")) { // exit 입력 시 종료
break;
}
System.out.println("동 이름: " + strDong);
}
System.out.println("프로그램 종료");
} catch (IOException e) {
System.out.println("[에러] " + e.getMessage());
} finally {
if (br != null) { try { br.close(); } catch (IOException e) {} }
}
}
}
결과:
동이름을 입력하세요. 입력을 마치려면 'exit' 입력 > 서초동
동 이름: 서초동
동이름을 입력하세요. 입력을 마치려면 'exit' 입력 > exit
프로그램 종료
InputStream
: 기본적인 바이트 스트림으로 한 글자씩 입력받으며, ASCII 문자만 처리할 수 있어 다국어 지원에 한계가 있음.InputStreamReader
: InputStream
을 문자 스트림으로 변환하여 유니코드를 처리할 수 있음.BufferedReader
: InputStreamReader
에 버퍼링 기능을 추가하여 입력 속도를 높이고, 줄 단위 입력 처리 가능.BufferedReader
와 readLine()
을 사용하여 사용자가 원하는 때까지 입력을 받을 수 있고, 특정 조건을 충족하면 루프를 종료하도록 설계할 수 있음.