[혼공자] 7주차_스레드,컬렉션 프레임워크, 입출력 스트림

혼자 공부하는 자바 개정판


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 클래스는 파일과 디렉토리를 다루는 데 사용됩니다. 파일의 생성, 삭제, 정보 조회 등을 처리할 수 있습니다. 이 클래스를 통해 파일 시스템의 다양한 작업을 수행할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다