국비교육(22-23)

21일차(2)/java(29) : Input, Output(1)

서리/Seori 2022. 11. 4. 01:02

21일차(2)/java(29) : Input, Output

 

Step16_InputOutput

 

 

- java의 입출력을 위한 객체들.

  이미 사용해해보았다! 콘솔창 출력 / 키보드로부터 입력받기

- 입/출력하여 변수 or 필드 or 객체에 저장하여 사용한다.

 

- 2진수는 우리에겐 너무 불편하기 때문에, 1byte 묶음으로 생각한다.

- 2진수 8개를 묶어 1byte단위로 인식한다.

 

- 어떤 파일을 인터넷으로 전송하거나 복사한다면 수많은 byte 알갱이가 옮겨가는 것.

 

- byte 알갱이는 2진수 8개로 이루어져 있다.

- 10진수로 환산하면 256가지 종류가 된다.

 

 

- 1byte로 문자 하나하나를 대응시킨다면 키보드 문자를 모두 대응시켜도 256개를 넘지 않는다.

- 즉, 영문자, 숫자, 기호, ... (한글제외)  를 모두 1byte로 표현할 수 있다.

 

- 키보드로 bbc를 적으면 112로 기억한다. (바이트 알갱이 3개가 필요하다)

- 바이트 하나당 문자 하나씩 기록! 한글 같은 경우에는 문자 하나당 2바이트씩 처리한다.

 

- 256*256=65536 가지수로 모든 문자 하나하나를 처리할 수 있다.(문자 하나하나당 숫자,코드로 기록되어 있다)

- 유니코드, UTF-8 등 문자 표시방식을 약속해 둔 규약이 있다.

 (공백, 개행기호에도 모두 규약이 있다)

 

- 어떤 파일이 있다면, 이렇게 글자 하나하나가 바이트 알갱이로 전부 기록되어 있는 것이다.

- 데이터의 실체는 바이트!

 

- 숫자를 문자열로 보여주려면 변환하는 규칙이 서로 맞아야한다.

 글자→숫자 저장 방식, 숫자→글자 전환 과정의 규칙 등!

 

 

- 이클립스에서 window-preference의 enc(인코딩 설정) 검색하면 현재 인코딩이 무엇인지 나온다.

- 여태까지 한 작업들은 모두 UTF-8로 맞춰진 상태로 기록한 것으로, 다른 방식으로 바꿔버리면 글자가 깨진다!

 

- 문자 저장방식에 따라 한글로 설정해둔 값은 에러가 생기기 쉬우므로,

 계정이나 컴퓨터 이름, 폴더명 등은 영문으로, 공백 없이 사용하는것이 좋다 ㅎㅎ

 


 

MainClass01

- InputStream, read로 읽어오기

package test.main;

import java.io.IOException;
import java.io.InputStream;

/*
 * 입력, 출력 (Input, Output) 
 * - 어떤 대상으로부터 메모리로 읽어들이는 것을 입력이라고 한다.
 * - 프로그래밍 언어의 관점에서 메모리라는 것은 변수 or 필드 or 객체 로 생각하면 편하다.
 * - 데이터는 2진수로 이루어져있지만 2진수 8개의 묶음인 1byte 단위로 생각하면 편하다.
 * - 1byte는 총 256가지의 값을 표현할 수 있다.
 * - 1byte를 10진수로 환산하면 0~255 사이의 숫자중에 하나이다.
 * - 입력과 출력을 통해서 이동하는 데이터는 byte(byte알갱이) 하나하나가 이동한다고 생각하며 된다.
 */
public class MainClass01 {
	public static void main(String[] args) {
		//키보드와 연결된 InputStream type의 참조값을 kbd라는 지역변수에 담기
		//In 객체는 1byte단위 처리 스트림이다.
		//영문자 대소문자, 숫자, 특수문자만 처리할 수 있다. 한글처리 불가
		InputStream kbd=System.in;
		System.out.println("입력:");
		try {
			int code=kbd.read();
			System.out.println("code:"+code);
			//코드에 대응되는 문자 얻어내기
			char ch=(char)code;
			System.out.println("char:"+ch);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

- 문자 읽어와서 코드값을 int에 담기

- 읽어온 코드값을 다시 char 타입으로 변환하기

 

- System 객체의 in 필드를 가리킨다. 키보드와 연결된 InputStream 타입!

 

- read(); 메소드를 호출하면 정수 하나를 리턴한다.

 

- Read 안에 예외처리할 내용이 있으므로 try~catch 문으로 묶어주기

 

- 문자에 해당하는 코드값이 리턴된다. 

ex) a - code:97 / A - code:65

char ch=(char)code; : 반환되는 코드를 char타입으로 캐스팅한다.

- InputStream1bye단위 처리 스트림이다. 256가지에 대응되는 코드를 가지고 있다.
 단, 여기서는 한글은 처리되지 않는다.

 

- char: 부분에 처음에 입력했던 문자가 나와야 하는데, 한글은 안 된다.

 


 

MainClass02

- InputStreamReader로 읽어오기

package test.main;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class MainClass02 {
	public static void main(String[] args) {
		//1byte 처리 스트림
		InputStream is=System.in;
		//2byte 처리 스트림(한글 처리 가능)
		InputStreamReader isr=new InputStreamReader(is);
		System.out.println("입력:");
		
		try {
			int code=isr.read();
			System.out.println("code:"+code);
			char ch=(char)code;
			System.out.println("char:"+ch);
		} catch (IOException ioe) {			
			ioe.printStackTrace();
		}
	}
}

 

 

- 인자로 InputStream 타입이 들어가기때문에 System.in 이 들어갈 수 있다.

 

 

- InputStreamReader는 한글처리 가능(2byte)

 

- InputStreamReader는 InputStream을 생성자의 인자로 전달해서 기능을 업그레이드시킨 것!

- 하지만 read는 string을 리턴하지 않아서 좀 불편하다.

 


 

MainClass03

- BufferedReader로 읽어오기

package test.main;

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

public class MainClass03 {
	public static void main(String[] args) {
		/*
		InputStream is=System.in;		
		InputStreamReader isr=new InputStreamReader(is);
		//문자를 한줄씩 입력받을 수 있는 객체
		BufferedReader br=new BufferedReader(isr);
		*/
		
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		System.out.println("문자열 한줄 입력:");
		
		try {
			//BufferedReader 객체의 readLine메소드를 이용해서 문자열 한줄을 읽어들이기
			String line=br.readLine();
			System.out.println("line:"+line);
		} catch (IOException e) {			
			e.printStackTrace();
		}
		
		
	}
}

 

- 여기에는 String 타입을 읽을 수 있는 메소드도 있다. (readline)

 

 

 

- BufferedReader의 생성자 확인하기. 2가지 있다.

 

** InputStreamReader 설명 : 링크

- Reader가 부모로 상속관계에 있어 Reader가 필요한 곳에 InputStreamReader를 넣을 수 있다.

 

- is 가 키보드와 연결된 객체, 키보드로부터 읽어들인 값이기 때문에 키보드로 입력 요청을 해서 읽어온다.
- 만약 저 InputStream이 네트워크나, 파일시스템에 연결되어 있다면 거기서 한줄을 읽어들일 수 있다.

 

- 문자열 한줄이 잘 입력된다

 

InputStream is=System.in;
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
//
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

- 위 세줄을 이렇게 한줄로 쓸 수 있다!

 

- Scanner 객체로 입력하면 예외처리를 하지 않아도 되고 간편하다.

 


 

MainClass04

- PrintStream, OutputStream 로 출력해보기

package test.main;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;

public class MainClass04 {
	public static void main(String[] args) {
		//콘솔창과 연결된 객체의 참조값
		PrintStream ps=System.out;
		ps.println("콘솔창 출력");
		//학습을 위해서 PrintStream 객체를 부모type OutputStream으로 받아보기
		//OutputStream도 1byte 처리 스트림이다.
		OutputStream os=ps;
		
		try {
			os.write(97);
			os.write(98);
			os.write(99);
			os.write(44032);
			os.flush(); //방출
		} catch (IOException e) {			
			e.printStackTrace();
		}
	}
}

 

PrintStream ps=System.out;

- out이 printstream 타입을 받아서 성립하는 식

 

- 그동안 썼던 syso의 원리이다.

 

** PrintStream 설명 : 링크

 

- InputStream : 입력받는 객체

- OutputStream : 출력하는 객체

 

- write에서 예외처리가 발생하므로 try문으로 작성하기

- 출력 관련된 객체들은 flush 를 써서 방출을 함께 해줘야 한다.

 

- 숫자를 문자로 전환해주어서 콘솔 창에 출력되나,

  1byte 처리 시스템이어서 44302와 같은 한글문자는 처리되지 않는다.

 


 

MainClass05

- OutputStreamWriter 출력해보기

package test.main;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;

public class MainClass05 {
	public static void main(String[] args) {
		PrintStream ps=System.out;
		//학습을 위해서 PrintStream 객체를 부모type OutputStream으로 받아보기
		//OutputStream도 1byte 처리 스트림이다.
		OutputStream os=ps;
        //2byte 처리 스트림
		OutputStreamWriter osw=new OutputStreamWriter(os);		
		try {
			osw.write(48148);
			osw.write(48372);
			osw.write("아니야");			
			osw.flush();
		} catch (IOException e) {			
			e.printStackTrace();
		}
	}
}

 

- write 메소드의 인자를 받는 방식이 5가지 있다.

 

- 한글 하나하나에 대한 코드값이 대응되어 있어서, 숫자를 넣어도 읽어진다.

 


 

MainClass06

- BufferedWriter 로 출력해보기

package test.main;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;

public class MainClass06 {
	public static void main(String[] args) {
		PrintStream ps=System.out;
		//학습을 위해서 PrintStream 객체를 부모type OutputStream으로 받아보기
		//OutputStream도 1byte 처리 스트림이다.
		OutputStream os=ps;
		//2byte 처리 스트림
		OutputStreamWriter osw=new OutputStreamWriter(os);
		//조금더 좋은 기능을 가지고 있는 BufferedWriter 객체 사용해 보기
		BufferedWriter bw=new BufferedWriter(osw);
		try {
			bw.write("하나\r\n");
			bw.write("두울");
			bw.newLine(); //개행기호를 출력해주는 메소드
			bw.write("세엣");			
			bw.flush();
		} catch (IOException e) {			
			e.printStackTrace();
		}
	}
}

 

- BufferedWriter 에는 newline이라는 메소드가 있어서

  개행기호를 따로 입력하지 않아도 줄바꿈을 출력할 수 있다.

- /r/n 을 () 안에 문자로 써도 개행기호로 인식한다.

 

 


 

- 첫줄 두개는 바이트알갱이 하나하나씩을 처리한다.

 (문자열의 입출력은 좀 불편하다)

 

- 입력-출력 6개 타입을 전부 익혀두기!