반응형
1. 컬렉션 프레임워크2(LIFO와 FIFO 컬렉션)
- 자바 컬렉션의 스택(Stack) 클래스과 큐(Queue) 인터페이스는 순서 기반 로직에서 자주 사용
1) Stack 클래스
(1) 기본 개념
- Stack의 구조 LIFO(Last In First Out): 마지막에 들어온 요소가 먼저 나감
- 주요 메서드
리턴 타입 | 메서드 | 설명 |
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) 사용 예시
- 웹 페이지 탐색(뒤로가기), 재귀 호출, 실행 취소 기능
- 코드 예제(케이스에서 동전 꺼내기)
2) Queue 인터페이스
(1) 기본 개념
- Queue의 구조 FIFO(First In First Out): 먼저 들어온 요소가 먼저 나감
- 주요 메서드
리턴 타입 | 메서드 | 설명 |
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("메시지 큐 데모 종료!");
}
}
2. 입출력 스트림(I/O 스트림)
- java.io 패키지에서 여러 가지 종류의 스트림(Stream) 클래스 제공
구분 | 바이트 기반 스트림 | 문자 기반 스트림 | ||
입력 스트림 | 출력 스트림 | 입력 스트림 | 출력 스트림 | |
최상위 클래스 | InputStream | OutputStream | Reader | Writer |
하위 클래스(예시) | XXXInputStream (FileInputStream) |
XXXOutputStream (FileOutputStream) |
XXXReader (FileReader) |
XXXWriter (FileWriter) |
1) 바이트 출력 스트림: OutputStream
- 바이트 단위로 데이터를 출력하는 추상 클래스이며, 대표 구현체로 FileOutputStream이 있음
- 텍스트, 이미지, 음성, 영상 등 이진 데이터 처리에 적합
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가 있음
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();
}
}
}
반응형
'자바(JAVA) > 미니 프로젝트 & 기초 공부' 카테고리의 다른 글
Java 기초 또 다시 공부하기 20일차(마지막) - 입출력 스트림(보조 스트림, 입출력 관련 API) (0) | 2025.07.09 |
---|---|
Java 기초 또 다시 공부하기 18일차 - 스레드(스레드 제어), 컬렉션 프레임워크 (1) | 2025.07.07 |
Java 기초 또 다시 공부하기 17일차 - 기본 API 클래스(java.util 패키지), 스레드(멀티 스레드) (0) | 2025.07.02 |
Java 기초 또 다시 공부하기 16일차 - 기본 API 클래스(java.lang 패키지) (0) | 2025.06.20 |
Java 기초 또 다시 공부하기 15일차 - 예외 처리(예외 클래스, 예외 처리) (1) | 2025.06.18 |