sink stream
jvm 밖의 DataSource와 직접 Data를 주고받는 stream들
filter stream
sink을 통해 받아온 Data를 조작하는 Stream들
FileReader fr = new FileReader("파일경로"); // sink stream
BufferedReader br = new BufferedReader(fr); // filter stream
-인터페이스지만 메소드로 아무것도 가지지 않는 인터페이스이다. 대부분 타입체크에 활용된다.
import java.io.*;
public class UserVo implements Serializable{
private int no;
private String name;
public UserVo() {
}
}
public class WriteObjectFile{
public static void main(String[] args) throws Exception{
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("UserInfo.obj"));
oos.writeObject(new UserVO(1,"홍길동"));
oos.flush();
oos.close();
}
}
UserVO class는 implements Serializable
하지 않으면 java.io.NotSerializableException 에러가 발생한다.
외부로 데이터를 보내기 위해서는 Serializable를 implements 해야 하기 때문이다. 이렇듯 구현할 코드는 없지만, implements는 해야 되는 interface를 marker interface라 한다.
thread란 process의 작업 단위이다 하나의 프로세스는 여러 개의 thread를 가지며 thread들은 process들의 자원을 공유한다.
process의 자원을 공유하기에 thread가 여러 개 실행될 때 동시에 자원에 접근할 수 있고 사용할 수 있다.
public class AfterThread extends Thread{
private String name;
public AfterThread(String name){
this.name = name;
}
public void run(){
for(int i=1;i<100;i++){
System.out.println(name+" : "+i+"*"+9+"="+i*9);
}
}
public static void main(String[] args){
AfterThread bt1 = new AfterThread("1st");
AfterThread bt2 = new AfterThread("2st");
bt1.start();
bt2.start();
}
}
java.lang의 Thread class를 상속받아 사용하는 방법이다. Thread의 start() 메서드는 해당 클래스의 run() 메서드를 thread 작업으로 등록해 실행한다.
java는 하나의 상속만 가능하기에 다른 class를 상속받아 thread를 사용하려면 문제가 존재한다.
public class AfterThreadRunnable implements Runnable{
private String name;
public AfterThreadRunnable(String name) {
this.name = name;
}
public void run() {
for(int i = 0; i<100; i++) {
System.out.println(name + " : " + i);
}
try{
Thread.sleep(100); //process의 block 영역으로 보내 100ms동안 thread 실행을 멈춘다
}catch(InterruptedException e) {
System.out.println(e); }
}
public static void main(String[] args) {
AfterThreadRunnable b1 = new AfterThreadRunnable("1st");
AfterThreadRunnable b2 = new AfterThreadRunnable("2st");
Thread t1 = new Thread(b1);
Thread t2 = new Thread(b2);
t1.start();
t2.start();
}
}
Runnable interface로 위 문제를 해결할 수 있다.
Thread는 Runnable을 파라미터로 받는 생성자가 존재한다. 따라서 A라는 class가 Thread의 메서드를 사용하고 싶다면 A class는 Runnable을 implements 하면 된다.
Runnable의 run() method를 overriding하여 thread 작업을 등록 할 수있다.
1. start()를 통해 thread를 생성한 뒤 Runnable이라는 공간에 등록
2. java는 multi thread를 지원하기에 한 번에 하나의 thread를 처리하는 것이 아닌 여러 thread를 번갈아가며 처리
3. thread를 처리하는 공간인 Running thread가 일정 부분 실행된 후 대기하는 공간인 Runnable을 통해 여러 thread를 번갈아가며 처리
4. suspend(), sleep(), wait()을 통해 thread를 Blocked 공간에 보내어 thread를 일정 시간 멈춘 후 다시 Runnable에 보내 실행 가능
5. stop()을 통해 thread를 종료 가능
thread는 process 안의 자원을 공유한다는 장점도 있지만 여러 개의 thread가 하나의 자원을 조작한다면 문제가 발생한다.
이러한 문제를 해결하는 방법이 synchronized이다. 하나의 Thread가 공유자원을 사용할 때 다른 Thread들은 해당 공유자원 접근을 막는 방식이다.
메서드나 코드 블록에 synchronized 키워드를 붙여 사용할 수 있다
Q1. int count = in.read(byte[] b) 왜 입력이 bytes인지
A. 바이트를 읽은 뒤 byte 배열에 저장하고 해당 배열에 저장된 바이트의 개수를 반환한다, 즉 읽은 바이트 개수를 바이트 배열에 저장하고 그 수만큼 반환한다.
Q2. concrete method란?
A. abstract method가 아닌 method들이다 abstract method가 아니기에 구체적으로 구현할 수 있고 override를 통해 재정의할 수 있다.