[ JAVA ] 표준 입출력

70_0ewd ㅣ 2022. 8. 16. 12:30

 

자바에서는 사용자 요청사항에 대한 응답 메시지를 전달하기 위해 System 이라는 표준 입출력 클래스를 제공한다. 

System 클래스는 다음 세 가지 필드를 가지고 있다.

  • out : PrintStream / 표준 출력 스트림
  • in : InputStream / 표준 입력 스트림
  • err : PrintStream / 표준 에러 출력 스트림

stream은 JAVA의 후반부 내용이어서 아직 정확하게 무엇인지는 모른다..일단은 데이터의 흐름 정도로 알고있자.


표준 출력

System.out()

  • print() : 줄바꿈을 하지 않고 출력
  • println() : 줄바꿈을 해주면서 출력
  • printf() : 지정된 형식의 문자열을 출력
System.out.print("ABCD");
System.out.println("EFGH");
int x = 10;
System.out.printf("%d",x);
//ABCD EFGH
//10

BufferedWriter()

BufferedWrier는 write()명령어를 쓴다고 바로 출력되는 것이 아니라 buffer에 저장해둔뒤 flush나 close될 때 출력 stream에 반영하면서 화면에 출력한다.     

import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
 
public class BufferedWriterTest {
    public static void main(String[] args) throws Exception {
    	//객체선언
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        bw.write("Hello World!");
        bw.flush();		//계속 출력하고자 한다면 flush를 사용

        bw.newLine();	//개행 방법1
        bw.write("new line\n");		//개행 방법2
        bw.write(String.valueOf(100));		
        //BufferedWiter를 통해 정수 출력을 하려면 String으로 형변환을 해야함
        bw.close();		//출력을 끝내고자 하면 close를 사용
    }
}
/*
Hello World!
new line
100
*/

표준 입력

System.in은 java.io.* 를 import 해야 사용할 수 있으며 값이 여러방식으로 들어오기 때문에 잘못된 값이 들어온 경우에 에러가 나지 않도록 IOException을 사용하여 예외처리를 필수로 해줘야 한다.

 

System.in.read()

import java.io.*;

public class SystemIn {
	public static void main(String[] args) throws IOException {
    
    	//System.in.read()는 아스키코드로 값을 받기때문에 int형으로 받기 위해선 -48을 해야함.
    	int Num = System.in.read()-48;
        
        //아스키코드에서 char형으로 형변환을 하면 문자열로 입력을 받을 수 있음.
        char Char = (char)System.in.read();
        
        //System.in.read(바이트배열, StartByte, EndByte) -> 바이트배열로 입력값 삽입
        byte[] Byte = new byte[4096];        // Byte배열 선언
        System.in.read(Byte,0,4096);         //배열에 값을 입력
        String StrByte = new String(Byte);   // Byte -> String 전환
        StrByte = StrByte.trim();            //전환 시 Byte배열의 쓰레기데이터를 정리
        
        System.out.println("Number : " + Num);
        System.out.println("Char : " + Char);
        System.out.println("StrByte : " + StrByte);
    }
}
        /*
        입력값 : 9AABCDEFGHIJKLMNOPQRSTUVWXYZ
        Number : 9
        Char : A
        StrByte : ABCDEFGHIJKLMNOPQRSTUVWXYZ
        */

new BufferedReader(new InputStreamReader(System.in)) 

scanner보다 복잡하긴 하지만 효율성이 더 좋아서 실무에서 자주 사용.

import java.io.*;

public class SystemIn {
	public static void main(String[] args) throws IOException {
    	
        //BufferedReader 변수 선언
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        //readLine()을 사용하여 Enter키를 입력하기 전까지의 값을 입력받음.
        String brStr = br.readLine();
        
        //BR은 String변수만 받으므로 Int변수로 변화하려면 Integer.parseInt를 사용해야함.
        int brInt = Integer.parseInt(br.readLine());
        
        System.out.println("brStr : " + brStr);
        System.out.println("brInt : " + brInt);
     }
 }
        /*
        입력값 : ABCDEFGHIJKLMNOPQRSTUVWXYZ 
        	 1234567890
        brStr : ABCDEFGHIJKLMNOPQRSTUVWXYZ 
        brInt : 1234567890
        */

new Scanner(System.in)

import java.io.*;
import java.util.Scanner;

public class SystemIn{
	public static void main(String[] args) throws IOException {
    
    	//System.in을 사용해서 Scanner의 다양한 메서드를 쓰면서 값을 입력받음.
        Scanner sc = new Scanner(System.in);
        
        //next()를 사용하여 Space를 치기 전까지의 값을 입력받음
        String str1 = sc.next();
        
        //nextLine()을 사용하여 Enter()를 치기 전까지의 값을 입력받음
        String str2 = sc.nextLine();
        
        //nextInt()를 사용하여 Enter()를 치기 전까지 숫자값을 입력받음 (문자열 불가)
        int scanInt = sc.nextInt();
        
        System.out.println("str1 : " + str1);
        System.out.println("str2 : " + str2);
        System.out.println("scanInt : " + scanInt);
    }
}
	/* 
        입력값 : ABCDE FGHIJK
        	 1234567890
        str1 : ABCDE
        str2 :  FGHIJK
        scanInt : 123456789
        */

 

이외에도 공부를 하다 알게되는 입출력 방법이 생기면 추후 추가 할 예정!