교수님이 쓰라고 하셔서 쓰는 그런데 은근 재밌는 듯

JAVA

[JAVA] Generic & Collection

shinyunha 2025. 9. 19. 16:40

 

Generic

제네릭을 사용하는 이유

1) 강한 타입 체크가 가능하다. 타입이 잘못 들어가면 컴파일 시 에러가 발생한다. 

2) 타입변환을 하지 않아도 된다. 

 

제네릭 사용방법

클래스 또는 인터페이스 이름 뒤에 "<>" 기호를 추가하고 타입 파라미터 작성

함수 리턴 타입 앞에 "<>" 기호를 추가하고 타입 파라미터를 작성

 

와일드카드 타입 

<?> 제한없음: 모든 클래스나 인터페이스 타입이 올 수 있다

<? extends 상위타입 > 상위클래스 제한: 상위타입이나 상위타입의 하위타입만 올 수 있다 - 내 아래만 가능

<? super 하위타입> 하위클래스 제한: 하위타입이나 하위타입의 상위타입만 올 수 있다 - 내 위만 가능

타입제한에서는 super 안 됨

 

PECS 원칙: Producers는 Extends, Consumer는 Super

목적: 안전한 데이터 이동

 

Producer는 읽기, 꺼내기

Consumer는 쓰기, 넣기

public static <T> void copy(List<? extends T> src, List<? super T> dest){}

PECS 원칙이 적용된 copy 메소드 헤더


Collection

Collection(인터페이스) Map (인터페이스)
List (인터페이스) Set (인터페이스)
ArrayList HashSet HashMap

 

컬렉션을 사용하는 이유

1) 객체들을 효율적으로 추가, 삭제, 검색할 수 있다

주의: 컬렉션은 객체만 저장하기 때문에 Wrapper 클래스로 박싱하여 저장해야 한다


List

특징: 순서 있음, 중복 가능

 

List 주요 메소드

add(int index, E element) 주어진 인덱스에 객체를 추가
set(int index, E element) 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈
get(int index) 주어진 인덱스에 저장된 객체를 리턴
size() 저장되어 있는 전체 객체수 리턴
remove(int index), remove(Object o) 주어진 인덱스에 저장된 객체 또는 주어진 객체를 삭제

 

 

List<E> list = new ArrayList<E>();
List<String> list = Arrays.asList(new String[size]); //일반 배열을 리스트로 변환

List<E> list = new LinkedList<E>();

Set

특징: 저장순서가 유지되지 않고 원소의 중복을 허용하지 않는다

 

Set 주요 메소드

add(E element) 주어진 객체를 저장
size() 저장되어 있는 전체 객체수 리턴
remove(Object o) 주어진 객체를 삭제

 

Set<E> set = new HashSet<E>();
set.containsAll(set2); //set2가 set의 부분집합이면 참
set.addAll(set2); //set을 set2와 set의 합집합으로 만들기
set.retainAll(set2); //set을 set2와 set의 교집합으로 만들기
set.removeAll(set2); //set을 set2와 set의 차집합으로 만들기

 

LinkedHashSet은 삽입 순서대로 원소 저장


Map

특징

1) key와 value로 구성된 Map.Entry 객체를 저장하는 구조이다

2) 요소의 저장순서를 유지하지 않는다

3) key는 중복 불허, value는 중복 허용

 

Map 주요 메소드

put(K key, V value) 주어진 키와 값을 추가
get(K key) 주어진 키의 값을 리턴
size() 저장되어 있는 키의 총 수를 리턴
Map<K, V> map = new HashMap<>();

Set<K> keys = map.keySet(); //모든 키를 Set에 담아서 리턴
Collection<V> values = map.values(); //모든 값을 Collection에 담아서 리턴
Set<Map.Entry<K,V>> entrySet = map.entrySet(); //모든 Map.Entry 객체를 Set에 담아서 리턴

 

LinkedHashMap은 저장 순서 유지

TreeMap은 Key값 기준으로 정렬 (숫자-알파벳대소문자-한글)


컬렉션을 순환하면서 출력하는 3가지 방법

Iterator 

Iterator <T> it = data.iterator(); 

while(it.hasNext())
	System.out.print(it.next() + " ");

 

for-each

for(E e : data)
	System.out.print(e + " ");

 

Lambda

data.forEach((e) -> System.out.print(e + " "));

'JAVA' 카테고리의 다른 글

[JAVA] 디자인 패턴 - 템플릿 메소드  (0) 2025.10.17
[JAVA] 디자인 패턴 - 전략 (짱구 예제)  (0) 2025.10.15
[JAVA] 커피메이커 Ver.1  (3) 2025.10.01
[JAVA] Thread  (0) 2025.09.24
[Refactoring] Battle_상속,모듈화 문제 (JAVA)  (0) 2025.09.16