제네릭(Generics)과 컬렉션(Collections)은 Java 5부터 도입된 기능으로, 타입 안정성을 제공하고 코드 재사용성을 높이는 데 도움이 됩니다.
1. 제네릭(Generics)
제네릭은 클래스, 인터페이스, 메소드를 정의할 때 타입 매개변수를 사용하여 타입 안정성을 제공하는 기능입니다. 제네릭을 사용하면 컴파일 시점에 타입 오류를 검출할 수 있어 런타임 오류를 방지할 수 있습니다.
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Box<T> {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
Box<String> stringBox = new Box<>();
stringBox.setItem(“Hello, World!”);
String item = stringBox.getItem();
|
cs |
2. 제네릭 메소드(Generic Methods)
제네릭 메소드는 메소드 선언부에 타입 매개변수를 사용하여 정의된 메소드입니다. 제네릭 메소드를 사용하면 다양한 타입의 인수를 처리할 수 있습니다.
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.print(element + ” “);
}
System.out.println();
}
Integer[] intArray = {1, 2, 3, 4, 5};
Double[] doubleArray = {1.1, 2.2, 3.3, 4.4, 5.5};
String[] stringArray = {“Hello”, “World”, “!”};
printArray(intArray); // Output: 1 2 3 4 5
printArray(doubleArray); // Output: 1.1 2.2 3.3 4.4 5.5
printArray(stringArray); // Output: Hello World !
|
cs |
3. 와일드카드(Wildcards)
와일드카드는 제네릭 타입에서 알 수 없는 타입을 나타내는 데 사용됩니다. 와일드카드에는 세 가지 종류가 있습니다.
<?>
(Unbounded Wildcard): 모든 타입을 허용합니다.<? extends T>
(Upper Bounded Wildcard): T와 T의 하위 타입을 허용합니다.<? super T>
(Lower Bounded Wildcard): T와 T의 상위 타입을 허용합니다.
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
|
public static void printList(List<?> list) {
for (Object element : list) {
System.out.print(element + ” “);
}
System.out.println();
}
List<Integer> intList = Arrays.asList(1, 2, 3);
List<String> stringList = Arrays.asList(“Hello”, “World”);
printList(intList); // Output: 1 2 3
printList(stringList); // Output: Hello World
|
cs |
4. 컬렉션(Collections)
컬렉션은 객체 그룹을 저장하고 조작하는 데 사용되는 프레임워크입니다. Java의 컬렉션 프레임워크는 List
, Set
, Map
등의 인터페이스와 해당 인터페이스를 구현한 클래스들로 구성됩니다.
List
List
는 순서가 있는 요소의 모음입니다. 중복 요소를 허용합니다.
ArrayList
: 동적 배열 기반의 리스트 구현체입니다.LinkedList
: 이중 연결 리스트 기반의 리스트 구현체입니다.
Set
Set
은 순서가 없는 요소의 모음입니다. 중복 요소를 허용하지 않습니다.
HashSet
: 해시 테이블 기반의 집합 구현체입니다.TreeSet
: 이진 검색 트리 기반의 집합 구현체입니다.
Map
Map
은 키-값 쌍의 모음입니다. 각 키는 고유하며, 각 키는 하나의 값에 매핑됩니다.
HashMap
: 해시 테이블 기반의 맵 구현체입니다.TreeMap
: 레드-블랙 트리 기반의 맵 구현체입니다.
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
List<String> list = new ArrayList<>();
list.add(“Apple”);
list.add(“Banana”);
list.add(“Orange”);
System.out.println(“List: “ + list); // Output: List: [Apple, Banana, Orange]
Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(3);
System.out.println(“Set: “ + set); // Output: Set: [1, 2, 3]
Map<String, Integer> map = new HashMap<>();
map.put(“A”, 1);
map.put(“B”, 2);
map.put(“C”, 3);
System.out.println(“Map: “ + map); // Output: Map: {A=1, B=2, C=3}
|
cs |
5. 컬렉션 유틸리티 클래스
Java에서는 컬렉션 관련 작업을 지원하는 다양한 유틸리티 클래스를 제공합니다.
Collections
: 컬렉션 관련 작업을 위한 정적 메소드를 제공합니다.Arrays
: 배열 관련 작업을 위한 정적 메소드를 제공합니다.
예제 코드
1
2
3
4
5
6
7
|
List<Integer> numbers = new ArrayList<>(Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5));
Collections.sort(numbers);
System.out.println(“Sorted List: “ + numbers); // Output: Sorted List: [1, 1, 2, 3, 4, 5, 5, 6, 9]
int[] array = {1, 2, 3, 4, 5};
int index = Arrays.binarySearch(array, 4);
System.out.println(“Index of 4: “ + index); // Output: Index of 4: 3
|
cs |
제네릭과 컬렉션은 Java 프로그래밍에서 매우 중요한 역할을 합니다. 제네릭을 사용하면 타입 안정성을 확보하고 코드의 재사용성을 높일 수 있습니다. 컬렉션은 다양한 데이터 구조를 제공하여 데이터를 효과적으로 저장하고 조작할 수 있게 해줍니다. 이 둘을 함께 사용하면 타입 안전하고 유연한 코드를 작성할 수 있습니다.
관련사이트