7장: 제네릭과 컬렉션
1. 컬렉션의 개념
- 컬렉션(Collection): 데이터를 효율적으로 저장하고 관리하기 위한 객체들의 컨테이너.
- 크기 자동 조절 및 동적 관리.
- 데이터 삽입, 삭제, 검색을 손쉽게 처리.
- 주요 컬렉션 인터페이스 및 클래스:
- List: 순서 유지, 중복 허용 (
ArrayList
, LinkedList
).
- Set: 중복 비허용 (
HashSet
, TreeSet
).
- Map: 키-값 쌍 관리 (
HashMap
, TreeMap
).
예제: 다양한 컬렉션의 활용
import java.util.*;
public class CollectionExample {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
System.out.println(list);
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(1);
System.out.println(set);
Map<String, Integer> map = new HashMap<>();
map.put("apple", 10);
map.put("banana", 20);
System.out.println(map.get("apple"));
}
}
2. 제네릭(Generic)의 개념
- 제네릭: 다양한 데이터 타입을 처리할 수 있도록 클래스/메소드를 일반화.
- 타입 안정성 제공: 컴파일 시 타입을 체크해 오류 방지.
- 중복된 코드를 줄여 효율적인 프로그래밍 가능.
- 주요 타입 매개변수:
<E>
: 요소 (Element).
<K>
: 키 (Key).
<V>
: 값 (Value).
<T>
: 데이터 타입 (Type).
예제: 제네릭 클래스
class Box<T> {
private T item;
public void set(T item) {
this.item = item;
}
public T get() {
return item;
}
}
public class GenericExample {
public static void main(String[] args) {
Box<String> stringBox = new Box<>();
stringBox.set("Hello");
System.out.println(stringBox.get());
Box<Integer> intBox = new Box<>();
intBox.set(123);
System.out.println(intBox.get());
}
}
3. 주요 컬렉션 클래스
1. Vector
- 가변 크기의 배열, 동기화 지원.
- 주요 메소드:
add(E e)
: 요소 추가.
get(int index)
: 요소 가져오기.
Vector<Integer> vector = new Vector<>();
vector.add(1);
vector.add(2);
System.out.println(vector);
2. ArrayList
- 가변 크기 배열, 동기화 미지원 (성능 우수).
ArrayList<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");
System.out.println(list);
3. HashMap
- 키-값 쌍으로 데이터 관리, 중복된 키 불가.
HashMap<String, String> map = new HashMap<>();
map.put("apple", "사과");
System.out.println(map.get("apple"));
4. 자동 박싱/언박싱
- 기본 타입 데이터를 객체로 변환(박싱)하거나, 객체를 기본 타입으로 변환(언박싱).
- 컬렉션은 객체만 저장 가능하므로 기본 타입을 자동 변환.
Vector<Integer> vector = new Vector<>();
vector.add(5);
int value = vector.get(0);
예제: 자동 박싱과 언박싱
Vector<Integer> numbers = new Vector<>();
numbers.add(10);
int n = numbers.get(0);
System.out.println(n);
8장: 스트림과 입출력
1. 스트림의 개념
- 스트림(Stream): 입력/출력 데이터의 흐름.
- 바이트 스트림: 바이너리 데이터 처리 (
InputStream
, OutputStream
).
- 문자 스트림: 문자 데이터 처리 (
Reader
, Writer
).
- 스트림 특징:
- 단방향: 입력 또는 출력만 가능.
- 버퍼를 이용해 입출력 성능 최적화.
2. 주요 입출력 클래스
1. FileReader/FileWriter (문자 스트림)
FileReader fr = new FileReader("input.txt");
int c;
while ((c = fr.read()) != -1) {
System.out.print((char) c);
}
fr.close();
FileInputStream fis = new FileInputStream("input.dat");
FileOutputStream fos = new FileOutputStream("output.dat");
int data;
while ((data = fis.read()) != -1) {
fos.write(data);
}
fis.close();
fos.close();
3. 고속 파일 복사 (블록 단위)
FileInputStream fis = new FileInputStream("source.dat");
FileOutputStream fos = new FileOutputStream("destination.dat");
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
fis.close();
fos.close();
4. 파일 관리 (File 클래스)
- File 클래스: 파일과 디렉터리의 경로 및 속성 관리.
File file = new File("example.txt");
if (file.exists()) {
System.out.println("파일 크기: " + file.length());
}
예제: 디렉터리 탐색
File dir = new File("C:\Temp");
if (dir.isDirectory()) {
for (File file : dir.listFiles()) {
System.out.println(file.getName() + " (크기: " + file.length() + ")");
}
}
5. 버퍼 입출력
- BufferedReader/BufferedWriter: 버퍼를 사용해 성능 개선.
BufferedReader br = new BufferedReader(new FileReader("input.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));
String line;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
}
br.close();
bw.close();