혼자 공부하는 자바 개정판

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

Posts created 242

답글 남기기

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

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top

원활한 서비스 이용을 위한 안내

현재 광고 차단 프로그램이 켜져 있습니다. 이로 인해 사이트의 일부 기능이 제한될 수 있으니, 쾌적한 이용을 위해 광고 차단 해제 후 새로고침 부탁드립니다.