자바(JAVA)/미니 프로젝트 & 기초 공부

Java 기초 또 다시 공부하기 19일차 - 컬렉션 프레임워크2(LIFO와 FIFO 컬렉션), 입출력 스트림(I/O 스트림)

개발학생 2025. 7. 8. 11:04
반응형

1. 컬렉션 프레임워크2(LIFO와 FIFO 컬렉션)

  • 자바 컬렉션의 스택(Stack) 클래스과 큐(Queue) 인터페이스는 순서 기반 로직에서 자주 사용

1) Stack 클래스 

(1) 기본 개념 

  • Stack의 구조 LIFO(Last In First Out): 마지막에 들어온 요소가 먼저 나감 

Stack 구조 도식화

  • 주요 메서드
리턴 타입 메서드 설명
E push(E item) 주어진 객체를 스택에 추가
E peek() 스택의 맨 마지막 객체를 가져옴(스택에서 객체 제거 x)
E pop() 스택의 맨 마지막 객체를 가져옴(스택에서 객체 제거 o)

 

  • 객체 생성 방법: 저장할 객체 타입을 E 타입 파라미터 자리에 표기하고 기본 생성자를 호출
Stack<E> stack = new Stack<E>();
Stack<E> stack = new Stack<>();  // E타입 파라미터를 생략하면, 왼쪽 Stack에 지정된 타입을 따라감

(2) 사용 예시

  • 웹 페이지 탐색(뒤로가기), 재귀 호출, 실행 취소 기능
  • 코드 예제(케이스에서 동전 꺼내기) 

Stack 사용 예시: 자바 컴파일러 사이트

2) Queue 인터페이스

(1) 기본 개념 

  • Queue의 구조 FIFO(First In First Out): 먼저 들어온 요소가 먼저 나감 

Queue 구조 도식화

  • 주요 메서드
리턴 타입 메서드 설명
boolean offer(E e) 주어진 객체를 추가
E peek() 객체 하나를 가져옴(큐에서 객체 제거 x)
E poll() 객체 하나를 가져옴(큐에서 객체 제거 o)
  • 객체 생성 방법: LinkedList 객체를 Queue 인터페이스로 변환
Queue<E> queue = new LinkedList<E>();
// LinkedList의 E 타입 파라미터를 생략하면, 왼쪽 Queue에 지정된 타입을 따라감
Queue<E> queue = new LinkedList<>();

(2) 사용 예시

  • 작업 스케줄링, 프린터 대기열, 이벤트 처리
  • 코드 예제(비동기 메시지 시스템)
import java.util.*;
import java.lang.*;
import java.io.*;

// 메인 클래스: 실행 진입점
class Main {
    public static void main(String[] args) throws InterruptedException {

        // 메시지를 저장하는 FIFO 큐 생성 (LinkedList로 구현)
        Queue<String> messageQueue = new LinkedList<>();

        // 생산 상태를 표시하는 플래그 배열 (익명 클래스에서 참조 가능)
        final boolean[] isProducing = {true};

        // 생산자 스레드: 메시지를 생성해서 큐에 삽입
        Thread producer = new Thread(() -> {
            for (int i = 1; i <= 5; i++) {
                String msg = "Message-" + i;
                messageQueue.offer(msg); // 메시지를 큐에 넣음
                System.out.println("[Producer] Produced: " + msg);

                try {
                    Thread.sleep(500); // 메시지를 0.5초 간격으로 생성
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt(); // 인터럽트 시 안전하게 종료
                }
            }
            // 생산 완료 플래그 설정
            isProducing[0] = false;
        });

        // 소비자 스레드: 큐에서 메시지를 꺼내 처리
        Thread consumer = new Thread(() -> {
            // 생산이 계속되거나 큐에 메시지가 남아있는 동안 반복
            while (isProducing[0] || !messageQueue.isEmpty()) {
                String msg = messageQueue.poll(); // 메시지 하나 꺼냄
                if (msg != null) {
                    System.out.println("[Consumer] Consumed: " + msg); // 처리 결과 출력
                }
                try {
                    Thread.sleep(300); // 메시지를 0.3초 간격으로 처리
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });

        // 스레드 실행 시작
        producer.start();
        consumer.start();

        // 메인 스레드는 producer가 끝날 때까지 대기
        producer.join();

        // consumer 스레드도 끝날 때까지 대기
        consumer.join();

        // 프로그램 종료 메시지 출력
        System.out.println("메시지 큐 데모 종료!");
    }
}

Queue 사용 예시: 자바 컴파일러 사이트

2. 입출력 스트림(I/O 스트림)

  • java.io 패키지에서 여러 가지 종류의 스트림(Stream) 클래스 제공
구분 바이트 기반 스트림 문자 기반 스트림
입력 스트림 출력 스트림 입력 스트림 출력 스트림
최상위 클래스 InputStream OutputStream Reader Writer
하위 클래스(예시) XXXInputStream
(FileInputStream)
XXXOutputStream
(FileOutputStream)
XXXReader
(FileReader)
XXXWriter
(FileWriter)

1) 바이트 출력 스트림: OutputStream

 

  • 바이트 단위로 데이터를 출력하는 추상 클래스이며, 대표 구현체로 FileOutputStream이 있음
  • 텍스트, 이미지, 음성, 영상 등 이진 데이터 처리에 적합

OutputStream 예시: 자바 컴파일러 사이트

 

2) 바이트 입력 스트림: InputStream

 

  • 바이트 단위의 데이터를 입력받는 추상 클래스로, 대표 구현체로 FileInputStream, BufferedInputStream 클래스가 있음
  • 문자가 아닌 이진 데이터(binary data)를 다룰 때 사용
    -> JPEG, MP3, MP4 같은 파일을 byte로 읽어 가공하거나 네트워크로 전송
  • InputStream 예시 코드: byte-output.txt라는 파일이 있으면 내용을 읽어 입력함 
import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) throws InterruptedException {
        try (FileInputStream fis = new FileInputStream("byte-output.txt")) {
            int b;
            while ((b = fis.read()) != -1) {
                System.out.print((char) b); // 바이트를 문자로 변환해서 출력
            }
            System.out.println("\n파일 바이트 입력 완료!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

자바 컴파일러 사이트에 코드를 입력하고 실행하면, 파일이 없어 읽지 못한다는 오류 발생

 

3) 문자 출력 스트림: Writer

  • 문자(character) 단위로 데이터를 출력하는 추상 클래스
  • 구현 클래스로 FileWriter가 있음

Writer 예시: 자바 컴파일러 사이트

4) 문자 입력 스트림: Reader

 

  • 문자 데이터를 입력받는 추상 클래스
  • 일반적으로 FileReader나 BufferedReader와 함께 사용
  • Reader 예시 코드: char-output.txt라는 파일이 있으면 내용을 읽어 입력함 
import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) throws InterruptedException {
         try (FileReader fr = new FileReader("char-output.txt")) {
            int ch;
            while ((ch = fr.read()) != -1) {
                System.out.print((char) ch); // 문자 단위로 출력
            }
            System.out.println("\n문자 입력 완료!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

자바 컴파일러 사이트에 코드를 입력하고 실행하면, 역시나 파일이 없어 읽지 못한다는 오류 발생

 

 

반응형