포스코x코딩온 웹 풀스택 양성과정

[포스코x코딩온] 웹 풀스택 과정 17주차 회고 | JAVA 래퍼, 제네릭, 콜렉션

Codult 2024. 4. 18. 23:30
728x90

 

📌 Wrapper 클래스

8가지 기본 데이터 타입을 객체로 표현하기 위해 제공되는 클래스이다.

  • byte - Byte
  • short - Short
  • int - Integer
  • long - Long
  • float - Float
  • double - Double
  • char - Character
  • boolean - Boolean

Wrapper의 사용

  • 자바의 컬렉션(ex. ArrayList)은 기본 데이터 타입을 직접 저장할 수 없어, Wrapper 클래스를 사용하여 저장해야 한다.
  • 오토박싱(auto-boxing): 기본 데이터 타입을 Wrapper 클래스 객체로 자동 변환한다.
  • 오토언박싱(auto-unboxing): Wrapper 클래스 객체를 기본 데이터 타입으로 자동 변환한다.
  • 오토박싱, 오토언박싱으로 자동으로 타입 변환되어도, 성능 저하를 막기 위해 명시해주는 것이 좋다.

📌 제네릭

형 안전성을 높이기 위해 도입된 프로그래밍으로, 컴파일 시간에 타입 오류를 효과적으로 찾아낼 수 있고 클래스, 인터페이스, 메소드에 대한 타입을 파라미터로 전달할 수 있다.

제네릭 특징

  • 타입 안전성: 잘못된 타입의 객체가 저장되는 것을 컴파일 시간에 방지한다.
  • 형 변환 필요성 감소: 명시적인 형 변환이 필요없다.
  • 코드 재사용성: 일반 클래스나 메소드로 다양한 타입에 대해 동작하는 코드를 작성할 수 있다.

제네릭 클래스

  • <T>를 이용하여 제네릭을 지정한다. (K, V 등..)
  • 인스턴스를 생성할 때 형을 지정한다.
import java.util.ArrayList;

class MyClassGeneric<T> {
	ArrayList<T> list = new ArrayList<>();
    
    public void addElement (T element) {
    	list.add(element);
    }
    public void removeElement (T element) {
    	list.remove(element);
    }
}

public class Generic {
	public static void main(String[] args) {
    	MyClassGeneric<String> list = new MyClassGeneric<>();
        list.addElement("element1");
        list.addElement("element2");
        // list.addElement(1); // 타입 오류
        String text = list.get(1);
   }
}

제네릭 제한

  • extends 키워드를 이용하여 제네릭 타입을 제한할 수 있다.
  • 원하는 타입의 가장 상위 클래스를 입력하여 지정하면 된다.
    (ex. Integer의 가장 상위클래스: Number, String은 그 자체가 가장 상위 클래스)
class Box<T extends Number> {
	private T item;
    public void setItem(T item) {
    	this.item = item;
    }
    public T getItem () {
    	return item;
    }
}

public class GenericExample1 {
	public static void main(String[] args) {
    	// Box<String> stringBox = new Box(); // String은 Number의 하위클래스가 아니므로 타입 오류.
        Box<Integer> intBox = new Box<>();
        Box<Double> doubleBox = new Box<>();
        intBox.setItem(5);
        doubleBox.setItem(2.2);
    }
}
  • 특정 인터페이스를 구현하는 클래스로도 제네릭 타입을 제한할 수 있다.
interface Movable {
	void move();
}
class Car implements Movable {
	@Overrid
    public void move() {
    	System.out.println("자동차 출발");
    }
}

class Container<T extends Movable> {
// Container 클래스는 Movable 인터페이스를 구현하는 클래스만 허용한다.
	private T item;
    public Container {
    	this.item = item;
    }
    public void makeItMove() {
    	item.move();
    }
}
public class GenericExample2 {
	public static void main(String[] args) {
    	Container<Car> carContainer = new Container<>(new Car());
        carContainer.makeItMove();
    }
}


📌 Collection

데이터 구조와 알고리즘을 제공하는 프레임워크로, 객체의 그룹을 효율적으로 관리하기 위한 다양한 클래스와 인터페이스를 제공한다.

💡 List

순서가 있는 데이터의 집합을 다룰 때 사용하며, 데이터의 중복을 허용한다.

주요 메소드

  • add(E element): 요소를 리스트이 끝에 추가
  • add(int idx, E element): 지정된 위치에 요소를 삽입
  • get(int idx): 지정된 위치의 요소를 반환
  • remove(int idx): 지정된 위치의 요소를 삭제하고 반환
  • set(int idx, E element): 지정된 위치의 요소를 지정된 요소로 교체
  • indexOf(Object o): 지정된 요소의 인덱스를 반환 (존재하지 않으면, -1 반환)
  • size(): 리스트의 크기를 반환한다.

ArrayList

  • 초기 크기가 있지만, 요소가 추가되면 자동으로 크기가 확장된다.
  • 배열 기반이므로 인덱스를 사용한 요소 접근이 빠르지만, 중간 요소를 삽입하거나 삭제하는 연산은 느린 편이다.

LinkedList

  • 연결 리스트 기반이므로 중간 요소를 삽입하거나 삭제하는 연산이 빠르지만, 인덱스를 사용한 요소 접근은 느린 편이다.

💡 Set

순서가 없는 데이터의 집합을 다룰 때 사용하며, 데이터의 중복을 허용하지 않는다. (중복을 제거함)

주요 메소드

  • add(E element): 요소를 Set에 추가한다. (이미 존재할 경우 추가되지 않음)
  • remove(Object o): 지정된 요소를 Set에서 제거한다.
  • contains(Object o): Set이 지정된 요소를 포함하고 있는지 확인한다.
  • size(): Set의 크기 (요소의 수)를 반환한다.
  • isEmpty(): Set이 비어있는지 확인한다.
  • clear(): Set의 모든 요소를 제거한다.

HashSet

  • Set의 대표적인 클래스로, 해시 테이블을 사용하여 요소를 저장한다.
  • 순서를 보장하지 않는다.

LinkedHashSet

  • 요소의 삽입 순서를 기억한다.

TreeSet

  • 요소를 자동으로 정렬된 순서로 저장한다. (사용자 정의 정렬도 가능)

💡 Map

키-값의 쌍으로 데이터를 저장하며, 키는 고유해야 한다.

주요 메소드

  • put(K key, V value): 지정된 키와 값을 Map에 저장한다.
  • get(Object key): 지정된 키에 연관된 값을 반환한다.
  • remove(Object key): 지정된 키와 그에 연관된 값을 제거한다.
  • containsKey(Object key): 지정된 키를 포함하고 있는지 확인한다.
  • containsValue(Object value): 지정된 값을 포함하고 있는지 확인한다.
  • size(): Map에 저장된 키-값 쌍의 수를 반환한다.
  • clear(): Map의 모든 키-값 쌍을 제거한다.

HashMap

  • 해시테이블을 사용하여 키-값 쌍을 저장한다.
  • 순서를 보장하지 않는다.

LinkedHashMap

  • 삽입 순서를 기억한다.

TreeMap

  • 키에 따라 자동으로 정렬되어 저장한다.
package java_generic;
import java.util.*;

public class Collection {

	public static void main(String[] args) {
//		LinkedList
		List<String> linkedList = new LinkedList<>();
		linkedList.add("A");
		linkedList.add("B");
		linkedList.add(1, "C");
		System.out.println(linkedList);
		
// Set
//		HashSet
		Set<String> hashSet = new HashSet<>();
		hashSet.add("A");
		hashSet.add("B");
		hashSet.add("A");
		System.out.println(hashSet);
		
//		LinkedHashSet - 순서를 기억함
		Set<String> linkedHashSet = new LinkedHashSet<>();
		linkedHashSet.add("C");
		linkedHashSet.add("B");
		linkedHashSet.add("A");
		linkedHashSet.add("A");
		System.out.println(linkedHashSet);
		
//		TreeSet - 자동 정렬
		Set<String> treeSet = new TreeSet<>();
		treeSet.add("B");
		treeSet.add("C");
		treeSet.add("A");
		System.out.println(treeSet);

// Map
//		HashMap
		Map<String, Integer> hashMap = new HashMap<>();
		hashMap.put("one", 1);
		hashMap.put("two", 2);
		hashMap.put("three", 3);
		System.out.println(hashMap);
		
//		LinkedHashMap - 순서를 기억함
		Map<String, Integer> linkedHashMap = new LinkedHashMap<>();
		linkedHashMap.put("one", 1);
		linkedHashMap.put("three", 3);
		linkedHashMap.put("two", 2);
		System.out.println(linkedHashMap);
		
//		TreeMap - 키에 따라 자동 정렬
		Map<String, Integer> treeMap = new TreeMap<>();
		treeMap.put("one", 1);
		treeMap.put("two", 2);
		treeMap.put("three", 3);
		System.out.println(treeMap);
		
	}

}
728x90