아래 내용은 부스트코스 <자바로 구현하고 배우는 자료구조> 강의를 들으며 정리한 것입니다.
제너릭(Generic) 프로그래밍
generic
다양한 자료형의 객체에 대해 한 가지 코드를 작성해서 재사용할 수 있도록 하는 객체 지향 기법.
// 정렬 알고리즘 예시
public class ss{
public int[] superSort(int[] array){
// ...sort...
return array;
}
}
(후에 배우게 될) 위와 같은 정렬 알고리즘을 정수형이 아닌 다른 타입에 대해 적용하고 싶을 때, 제너릭 프로그래밍을 사용하면 일일히 타입을 변경하지 않아도 된다.
제너릭 프로그래밍을 구현하기 위해 매개변수화 타입을 사용하여 특정 종류의 공간에 넣을 내용을 정의할 수 있다.
예를 들면, 리스트 인터페이스를 구현한 연결 리스트를 만들어, 1번 과제에 정수를 넣고 2번 과제에 문자열을, 3번 과제에 다른 무언가를 넣게 될 때 매개변수화 타입을 사용한 제네릭 프로그래밍을 통해 연결 리스트를 한 번 만들어 디버깅하면 계속 재사용할 수 있다.
매개변수화 타입(Paramaterized Types)
꺾쇠괄호<> 안에 Type Parameter를 넣어 컴파일 시 구체적인 타입이 결정되도록 한다.
두 개 이상의 타입 파라미터도 사용 할 수 있다.
// 아랫 줄이 제너릭 사용
// 클래스
public class LinkedList
public class LinkedLilst<E> // E: Element (요소, 제너릭 타입 중 1)
// 메소드
public void addFirst(String S)
public void addFirst(E obj)
public String removeFirst()
public E removeFirst()
// 제너릭 노드
class Node<E>{
E data;
Node<E> next;
public Node(E obj){
data=obj;
next=null;
} //생성자
}
위와 같은 코드를 작성하며 생성자에서는 예외로 E를 사용하지 않는다고 하는데 무슨 의미인지 완전히 이해하지 못함..
어쨌든 위에서 E는 모두 같은 자료형이다.
// 배열 정의 방식
E[] storage = (E[]) new Object[size]; //제너릭 객체 배열을 만들어 E 배열로 형변환
아래와 같이 정의하면 컴파일 되지 않는다.
// 배열 (컴파일 X)
E[] storage = new E[size];
+ 제너릭 타입 인자 (자주 사용하는..)
| <E> | Element |
| <T> | Type |
| <K> | Key |
| <N> | Number |
| <V> | Value |
생각해보기
Q. 제너릭 프로그래밍의 장점은 무엇일까?
A. 코드의 재사용성이 높아진다. 불필요한 형변환을 안 할 수 있다. 타입 안정성을 높일 수 있다.(컴파일 시 의도하지 않은 타입이 들어오는 것을 막을 수 있다)
Q. 매개변수화 타입과 객체를 사용하는 방식의 차이점은 무엇인가?
A. 위의 답변과 같은 맥락으로 Object를 일일히 형변환 할 필요가 없이, 매개변수화 타입을 이용하면 재사용성이 높아지며 컴파일 시 의도하지 않은 타입이 들어오는 것을 막을 수 있다.
COMMENT
이 파트 교수님이 거듭 강조하시는 부분에서 '자료구조'를 배우는 것의 의미가 잘 다가온다. 어떠한 데이터가 들어가든 더 효율적이고 편리한 프로그래밍을 가능하게 하는... 중간중간에 이전의 내용들을 다시 말해주시고 기초적인 부분도 설명되어서 나는 기쁘다 안 짤린 전체 강의 듣고싶다
Questions and Exercises: Generics (The Java™ Tutorials > Learning the Java Language > Generics (Updated))
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Java Language Changes for a summary of updated
docs.oracle.com
3. Write a generic method to exchange the positions of two different elements in an array.
Answer:
public final class Algorithm {
public static <T> void swap(T[] a, int i, int j) {
T temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
8. Write a generic method to find the maximal element in the range [begin, end) of a list.
Answer:
import java.util.*;
public final class Algorithm {
public static <T extends Object & Comparable<? super T>>
T max(List<? extends T> list, int begin, int end) {
T maxElem = list.get(begin);
for (++begin; begin < end; ++begin)
if (maxElem.compareTo(list.get(begin)) < 0)
maxElem = list.get(begin);
return maxElem;
}
}
'Programming > java 자료구조' 카테고리의 다른 글
| 2-1) 연결 리스트, 노드와 크기 (0) | 2022.07.25 |
|---|---|
| 1-5) Autoboxing, 예외 처리 (0) | 2022.07.23 |
| 1-3) 객체지향 프로그래밍, Comparable 인터페이스 (0) | 2022.07.23 |
| 1-2) 빅 오 표기법 (0) | 2022.07.21 |
| 1-1) 자료구조의 시작, 복잡성 (0) | 2022.07.20 |