제네릭과 컬렉션

 

제네릭(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 = {12345};
Double[] doubleArray = {1.12.23.34.45.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(123);
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(314159265));
Collections.sort(numbers);
System.out.println(“Sorted List: “ + numbers); // Output: Sorted List: [1, 1, 2, 3, 4, 5, 5, 6, 9]
int[] array = {12345};
int index = Arrays.binarySearch(array, 4);
System.out.println(“Index of 4: “ + index); // Output: Index of 4: 3
cs

 

제네릭과 컬렉션은 Java 프로그래밍에서 매우 중요한 역할을 합니다. 제네릭을 사용하면 타입 안정성을 확보하고 코드의 재사용성을 높일 수 있습니다. 컬렉션은 다양한 데이터 구조를 제공하여 데이터를 효과적으로 저장하고 조작할 수 있게 해줍니다. 이 둘을 함께 사용하면 타입 안전하고 유연한 코드를 작성할 수 있습니다.

관련사이트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다