JAVA - 7장: 제네릭과 컬렉션, 8장: 스트림과 입출력

m0d0ri205·2024년 11월 24일
0

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 예제
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        System.out.println(list); // [A, B]
        
        // Set 예제
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(1); // 중복된 값
        System.out.println(set); // [1, 2]
        
        // Map 예제
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 10);
        map.put("banana", 20);
        System.out.println(map.get("apple")); // 10
    }
}

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()); // Hello
        
        Box<Integer> intBox = new Box<>();
        intBox.set(123);
        System.out.println(intBox.get()); // 123
    }
}

3. 주요 컬렉션 클래스

1. Vector

  • 가변 크기의 배열, 동기화 지원.
  • 주요 메소드:
    • add(E e): 요소 추가.
    • get(int index): 요소 가져오기.
Vector<Integer> vector = new Vector<>();
vector.add(1);
vector.add(2);
System.out.println(vector); // [1, 2]

2. ArrayList

  • 가변 크기 배열, 동기화 미지원 (성능 우수).
ArrayList<String> list = new ArrayList<>();
list.add("Hello");
list.add("World");
System.out.println(list); // [Hello, World]

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); // 10

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();

2. FileInputStream/FileOutputStream (바이트 스트림)

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]; // 1KB 버퍼
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();

profile
말하는 감자중.....

0개의 댓글