[Java] 기초3 (입력, 출력)

sua_ahn·2022년 12월 21일
0

Java

목록 보기
4/15
post-thumbnail

📇 입력

InputStream

가장 기본이 되는 입력 스트림!
여기서 '스트림'은 입력장치로부터 프로그램으로 데이터가 흐르는 관이라고 이해하면 쉽다. (입력장치 =스트림=> 프로그램)

System이라는 클래스의 in 변수(System.in)는 InputStream의 정적 필드로, 표준 입력 스트림이다.

	InputStream inputstream = System.in;
    int a = inputstream.read();
    
    System.out.println(a);

그런데 여기서 입력과 출력이 다르게 나온다 ❗

그 이유는 InputStream이 바이트 단위로 데이터를 보내고,
입력메소드인 read()1 byte 값만 읽어들이기 때문이다.
또한, 입력 데이터가 운영체제 인코딩 형식의 10진수로 저장되기 때문이다.

Scanner

Java를 배울 때 가장 먼저 배우는 입력 방법이다.

[ 동작 방식 ]

아래 코드 new Scanner(System.in)을 보면,
InputStream을 통해 표준 입력을 받음을 알 수 있다.

또한, Scanner 클래스 내부에 있는 InputStreamReader
바이트 데이터를 문자 단위로 변환하는 중개자 역할을 하여 온전한 문자 형태로 입력된다.

입력받은 문자는 입력메소드인 next() 등을 통해
강력한 정규식 검사를 거치고 타입에 맞게 저장된다.

문자열의 경우 Scanner 내부에 임시 배열을 두어 문자열처럼 사용한다.

[ 특징 ]

  1. java.util package의 Scanner class를 import 해야 함
    (eclipse의 경우, 자동 입력됨 or ctrl+shift+o)
  2. 원하는 데이터 타입으로 입력 받음
  3. 많은 정규식 검사로 인해 속도가 느리나, 타입 변환의 안정성이 높음
  4. 공백 또는 개행을 기준으로 입력 값 인식함
	Scanner sc = new Scanner(System.in);

	int i = sc.nextInt();
	double d = sc.nextDouble();
	boolean b = sc.nextBoolean();
	String s = sc.next();

BufferedReader

[ 동작 방식 ]

Scanner처럼 InputStreamReader로 문자를 처리하나,
배열을 만들지 않고 Buffer에 문자를 쌓아둔다.
입력메소드인 readLine()을 통해 한 번에 문자열로 저장한다.

[ 특징 ]

  1. java.io package의 BufferedReader, InputStreamReader class를 import 해야 함
  2. String으로만 입력되므로 데이터 가공 필요
  3. 정규식 검사가 없어 속도가 빠르나, 예외처리 필요
  4. 개행을 경계로 인식
public static void main(String[] args) throws Exception {

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

	String sentence = br.readLine();
}

참고: https://st-lab.tistory.com/41


📰 출력

System.out.println()

java.lang.System 클래스 내에는 static 객체인 out이 있고,
out 객체는 PrintStream의 객체이므로,
PrintStream이 갖고있는 println 메소드를 사용한다.

BufferedWriter

많은 양을 출력할 시 Buffer를 사용하는 것이 빠르다.
Buffer를 사용한 후에는 flush()로 스트림을 비우고,
close()로 스트림을 닫아야 한다.

	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
    bw.write("출력");
    bw.newLine();
    bw.flush();
    bw.close();
profile
해보자구

0개의 댓글