바이트 vs 문자
가장 큰 차이점은 바이트는 Stream, 문자는 Reader를 사용한다.
<바이트>
입력 : InputStream
출력 : OutputStream
인코딩 x
복사할 때
-> 문서를 읽어야 한다면 문자로 가는게 나음.
<문자>
입력 : Reader
출력 : Writer
인코딩 자동!
텍스트 읽기만
FileInputStream(xx, "EUC-KR"); 파일 읽기
복사 : Input, OutputStream을 사용해야 파일이 깨지지 않음!
임시 공간 메모리.
한번에 담고 이동한다고 생각하면됨 -> 효율적!
byte 배열로 만들어서 사용한다.
Reader reader = new FileReader("data.txt");
텍스트 문서에만 사용
InputStream in = new FileInputStream("data2.txt");
InputStreamReader isr = new InputStreamReader(in, "euc-kr");
BufferedReader br = new BufferedReader(isr);
br.readLine(); // 마지막 사용법 살짝 변경
-> 흔히 쓰이는 파일 읽는 코드.
작업을 실행하기 위한 코드라고 생각하면 쉽다.
스레드를 시작하는 코드 :
thread.start();
join()을 사용하면 현재 동작 중인 스레드가 끝날 때까지 대기 상태로 들어간다. 특정 스레드 먼저 수행. -> 스레드의 특색이 사라짐
일시정지
sleep(1000)
정의 : 하나의 자원을 공유하는 것. 해당 메소드에 여러 스레드가 동시에 접근하지 못하도록 막는 방법이다.
동기화 방법에는 2가지가 있다.
public synchronized void increment() {}
-> 메소드 앞에 synchronized를 붙이면 된다. 다른 메소드는 작업이 끝날 때까지 대기한다.
class Counter {
private int count = 0;
private final Object lock = new Object();
public void increment() {
synchronized (lock) { #lock 객체를 기준으로, 하나의 스레드만 진입 가능하게 만듦.
count++;
System.out.println(Thread.currentThread().getName() + ": " + count);
}
}
}
point : 블록 외 코드들은 동시 실행 가능하여, 병렬적으로 움직이는 보다 객체지향프로그램스럽다!

위의 코드에서 숫자 순서대로 반응이 일어난다.
Socket socket = new Socket("127.0.0.1", 20000); -> 클라이언트가 먼저 요청
클라이언트가 접속하기를 기다리는 코드 :
Socket socket = sSocket.accept() -> 서버에서 반응