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타입으로 캐스팅한다.
- InputStream은 1bye단위 처리 스트림이다. 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개 타입을 전부 익혀두기!
'국비교육(22-23)' 카테고리의 다른 글
22일차(1)/java 퀴즈 : input, output 활용 예제 (0) | 2022.11.04 |
---|---|
21일차(3)/java(30) : Input, Output(2) (0) | 2022.11.04 |
21일차(1)/java(28) : Thread (0) | 2022.11.03 |
20일차(3)/java 퀴즈 : Frame객체로 계산기 만들기 (0) | 2022.11.02 |
20일차(2)/java(27) : Frame(3) (0) | 2022.11.02 |