java

자바의 입력(Input) , Scanner , BufferedReader

juniel 2024. 1. 18. 08:12

Input (입력)

콘솔의 입력을 받는 경우
System.in.read() 를 통해 받을 수 있다 (단, 1byte만 받아 올 수 있음 -> 한글은 2byte이므로 한글은 안 됨 )

예시)

public class ttttttt {



public static void main(String[] args) throws IOException {

System.out.print("문자 입력: ");



int code = System.in.read();



System.out.println("출력 : " + code);

}//mAIN

}

출력

이렇게 a의 char 값인 97이 출력이 된다 .

하지만 이런 방식은 너무 복잡하기에 잘 사용하지 않으며

BufferedReader 또는 Scanner 를 통해 작업을 한다 .

BufferedReader

이름 그대로 버퍼에 저장하여 읽는 형태인데

데이터를 한번에 다 읽어서 버퍼에 저장 한 다음 버퍼에서 데이터를 꺼내는 방식으로 출력을 하며
이로 인하여 Scanner에 비하여 상대적으로 메모리 용량을 효율적으로 가져가며

속도 또한 Scanner에 비해 빠르고 스레드 간의 공유가 가능하여 안전성 또한 Scanner에 비해 높다.

예시


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ttttttt {



public static void main(String[] args) throws IOException {

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

int num = 0;

String txt = "";

System.out.print("값을 입력하시오: ");

num = reader.read();

System.out.println(num+30);



}//mAIN

}

출력

예시2


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ttttttt {


        public static void main(String[] args) throws IOException {

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


            String txt = "";
            System.out.print("값을 입력하시오: ");

            txt = reader.readLine();
            System.out.printf("%s하세요",txt);





    }//mAIN


}

출력

Scanner

앞에 말한 BufferedReader 와 비슷하지만 차이점은 좀 더 사람에 맞춰진 라이브러리이다.

대표적 특징은

  • 공백과 개행문자들을 인식한다.
  • 원하는 타입으로 read가 가능함
  • BufferedReader에 비해 속도가 느림
  • BufferedReader에 비해 안전성이 떨어짐
  • BufferedReader에 비해 버퍼 사이즈 자체는 1/8 이다
  • InputStreamReader 를 import 하지 않아도 사용 가능하다.

예시


import java.util.Scanner;

public class ttttttt {



public static void main(String[] args) {

Scanner scan = new Scanner(System.in);

int math = 0;

int eng = 0;

System.out.print("수학 성적을 입력하시오");

math = scan.nextInt();

System.out.print("영어 성적을 입력하시오");

eng = scan.nextInt();

int sum = eng + math;

System.out.printf("수학 %d 영어 %d 총합 %d입니다.",math,eng,sum);

}//mAIN



}

출력

사용하는 코드 자체에선 둘의 차이가 없지만

버퍼, 메모리 , 속도등 보이지 않는 내부적인 요소에서의 차이가 있다보니

둘의 차이를 감안하여 상황에 맞는 것을 사용하면 좀 더 효율적인 프로그래밍을 할 수 있을 것이다.