Chapter 12, 13, 14 (스레드, 컬렉션 프레임워크, 입출력 스트림)
Chapter 12 스레드
Chapter 12-1 멀티 스레드
멀티 스레드는 여러 작업을 동시에 처리할 수 있는 기술로, 자바에서 스레드는 기본적으로 Thread클래스나 Runnable인터페이스를 통해 생성될 수 있습니다.
스레드
스레드는 프로그램의 실행 단위로, 메인 스레드 외에도 여러 작업을 수행하는 작업 스레드를 생성하여 사용할 수 있습니다.
메인 스레드
자바 프로그램이 실행될 때 JVM에 의해 생성되는 기본 스레드입니다. 모든 스레드는 메인 스레드에서 시작되며, 메인 스레드가 종료되면 프로그램도 종료됩니다.
작업 스레드 생성과 실행
작업 스레드는 Thread클래스를 확장하거나 Runnable 인터페이스를 구현하여 생성할 수 있습니다.
public class BeepThread extends Thread {
public void run() {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i=0; i<5; i++) {
toolkit.beep();
try { Thread.sleep(500); } catch(Exception e) {}
}
}
}
동기화 메소드
멀티 스레드 환경에서 공유 자원에 대한 접근을 조정하기 위해 동기화가 필요합니다. synchronized키워드를 사용하여 메소드를 동기화할 수 있습니다.
public class Calculator {
private int memory;
public int getMemory() {
return memory;
}
public synchronized void setMemory(int memory) {
this.memory = memory;
try {
Thread.sleep(2000);
} catch(InterruptedException e) {}
System.out.println(Thread.currentThread().getName() + ": " + this.memory);
}
}
Chapter 12-2 스레드 제어
스레드 상태
스레드는 여러 상태를 가질 수 있습니다. 실행 가능, 대기, 차단 및 종료 상태 입니다. 각 상태는 스레드의 생명 주기에 따라 변화합니다.
스레드 상태 제어
Thread 클래스에서 제공하는 메소드를 사용하여 스레드를 제어할 수 있습니다. 예를 들어, sleep(), join(), interrupt() 메서드가 있습니다.
public class StopFlagExample {
public static void main(String[] args) throws Exception {
PrintThread1 printThread = new PrintThread1();
printThread.start();
try { Thread.sleep(1000); } catch (InterruptedException e) {}
printThread.setStop(true);
}
}
public class PrintThread1 extends Thread {
private boolean stop;
public void setStop(boolean stop) {
this.stop = stop;
}
public void run() {
while(!stop) {
System.out.println("실행 중");
}
System.out.println("자원 정리");
System.out.println("실행 종료");
}
}
데몬 스레드
데몬 스레드는 백그라운드에서 실행되는 스레드로, 주 스레드가 종료되면 함께 종료됩니다. setDaemon(true) 메소드를 사용하여 데몬 스레드를 설정할 수 있습니다.
Chapter 13 컬렉션 프레임워크
13-1 컬렉션 프레임워크
List 컬렉션
List는 순서가 있는 데이터의 집합으로, 중복을 허용합니다. ArrayList와 LinkedList가 대표적입니다.
import java.util.ArrayList;
import java.util.List;
public class ArrayListExample {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("JDBC");
list.add("Servlet/JSP");
list.add(2, "Database");
list.add("iBATIS"):
int size = list.size();
System.out.println("총 객체 수: " + size);
System.out.println(list);
}
}
Set 컬렉션
Set은 중복을 허용하지 않는 데이터의 집합입니다. HashSet과 TreeSet이 있습니다.
import java.util.HashSet;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("Java");
set.add("JDBC");
set.add("Servlet/JSP");
set.add("Java"); // 중복으로 저장되지 않는다
set.add("iBATIS"):
int size = set.size();
System.out.println("총 객체 수: " + size);
System.out.println(set);
}
}
Map 컬렉션
Map은 키-값 쌍으로 데이터를 저장합니다. HashMap과 TreeMap이 있습니다.
import java.util.HashMap;
import java.util.Map;
public class HashMapExample {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("신용권", 85);
map.put("홍길동", 90);
map.put("동장군", 80);
map.put("홍길동", 95);
System.out.println(총 Entry 수: " + map.size());
}
}
13-2 LIFO와 FIFO 컬렉션
Stack
Stack은 LIFO(Last in First Out) 구조를 가지며, 데이터를 쌓았다가 나중에 꺼낼 수 있는 구조입니다.
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(2);
System.out.println(stack.pop()); // 2가 출력됨
}
}
Queue
Queue는 FIFO(First In First Out) 구조를 가지며, 먼저 들어온 데이터가 먼저 나가는 구조입니다.
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<Integer>();
queue.offer(1);
queue.offer(2);
System.out.println(queue.poll()); // 1이 출력됨
}
}
Chapter 14 입출력 스트림
14-1 입출력 스트림
자바의 입출력 스트림은 데이터의 읽기와 쓰기를 추상화한 클래스입니다. 다양한 종류의 스트림이 있으며, 각각의 용도에 맞게 사용됩니다.
입출력 스트림의 종류
바이트(byte) 기반 스트림: 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용
문자(charactor) 기반 스트림: 문자 데이터를 읽고 출력할 때 사용
바이트 출력 스트림: OutputStream
OutputStream을 사용하여 바이트 데이터를 출력할 수 있습니다.
import java.io.FileOutputStream;
import java.io.OutputStream;
public class WriteExample {
public static void main(String[] args) throws Exception {
OutputStream os = new FileOutputStream("C:/Temp/test1.db");
byte a = 10;
byte b = 20;
byte c = 30;
os.write(a);
os.write(b);
os.write(c);
os.flush();
os.close();
}
}
바이트 입력 스트림: InputStream
InputStream을 사용하여 바이트 데이터를 입력받을 수 있습니다.
import java.io.FileInputStream;
import java.io.InputStream;
public class ReadExample {
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream("C:/Temp/test1.db");
while(true) {
int data = is.read();
if(data == -1) break;
System.out.println(data);
}
is.close();
}
}
문자 출력 스트림: Writer
Writer는 문자 데이터를 출력하는 스트림입니다.
import java.io.FileWriter;
import java.io.Writer;
public class WriteExample {
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("C:/Temp/test7.txt");
char a = 'A';
char b = 'B';
char c = 'C';
writer.write(a);
writer.write(b);
writer.write(c);
writer.flush();
writer.close();
}
}
문자 입력 스트림: Reader
Reader는 문자 데이터를 입력받는 스트림입니다.
import java.io.FileReader;
import java.io.Reader;
public class ReadExample {
public static void main(String[] args) throws Exception {
Reader reader = new FileReader("C:/Temp/test7.txt");
while(true) {
int data = reader.read();
if(data == -1) break;
System.out.println((char)data);
}
reader.close();
}
}
14-2 보조 스트림
보조 스트림 연결하기
보조 스트림을 사용하여 기본 스트림의 성능을 향상시킬 수 있습니다. 예를 들어, BufferedOutputStream을 사용하여 파일 출력을 버퍼링할 수 있습니다.
InputStream is = System.in;
InputStreamReader reader = new InputStreamReader(is);
BufferedReader br = new BufferedReader(reader);
문자 변환 보조 스트림
문자 변환 보조 스트림은 바이트 스트림과 문자 스트림 간의 변환을 도와줍니다. 예를 들어, InputStreamReader와 OutputStreamWriter를 사용하여 바이트 스트림을 문자 스트림 문자 스트림으로 변환할 수 있습니다.
FileOutputStream fos = new FileOutputStream("C:/Temp/test1.txt");
Writer writer = new OutputStreamWriter(fos);
성능 향상 보조 스트림
BufferedInputStream과 BufferedOutputStream을 사용하여 I/O 성능을 향상시킬 수 있습니다. 이들은 데이터 전송 시 버퍼를 사용하여 성능을 개선합니다.
기본 타입 입출력 보조 스트림
DataOutputStream과 DataInputStream을 사용하여 기본 데이터 타입(int, float 등)을 직접 읽고 쓸 수 있습니다.
프린터 보조 스트림
PrintWriter를 사용하여 데이터를 쉽게 출력할 수 있습니다. 이 클래스는 문자열, 정수 등을 쉽게 출력할 수 있는 메서드를 제공합니다.
객체 입출력 보조 스트림
ObjectOutputStream과 ObjectInputStream을 사용하여 객체를 파일에 저장하고 읽을 수 있습니다. 이 기능을 사용하면 객체를 쉽게 직렬화하고 역직렬화할 수 있습니다.
14-3 입출력 관련 API
자바는 입출력 스트림을 처리하는 데 유용한 API를 제공합니다. 주요 API는 System.in, System.out, Scanner, File클래스 입니다.
System.in 필드
System.in은 표준 입력을 나타내며, 일반적으로 키보드 입력을 받을 때 사용됩니다. InputStream으로 되어 있기 때문에 바이트 단위로 읽습니다. 예를 들어, System.in을 통해 사용자의 입력을 받을 수 있습니다.
System.out 필드
System.out은 표준 출력을 나타내며, 주로 콘솔에 데이터를 출력할 때 사용됩니다. PrintStream으로 되어 있어 문자열, 숫자 등 다양한 형식으로 출력할 수 있습니다.
Scanner 클래스
Scanner 클래스는 입력을 편리하게 처리할 수 있도록 도와주는 유틸리티입니다. 다양한 입력 소스(예: 키보드, 파일 등)로부터 데이터를 읽을 수 있었습니다. 이 클래스는 텍스트 기반의 입력을 처리하는 데 매우 유용합니다.
File 클래스
File 클래스는 파일과 디렉토리를 다루는 데 사용됩니다. 파일의 생성, 삭제, 정보 조회 등을 처리할 수 있습니다. 이 클래스를 통해 파일 시스템의 다양한 작업을 수행할 수 있습니다.