자료구조(java) 2_4. 매개변수화 타입
매개변수화 타입(Parameterized Types)
자료구조에서는 컨테이너를 분리해야한다.
연결리스트, 해시, 트리 등 우리가 다루는 모든 자료구조는 컨테이너에 들어가는 내용(문자열, 정수, 원숭이, 사람, 학생, 자동차 등 객체)과 분리해야한다.
매개변수화 타입을 사용하면 컨테이너를 정의할 수 있다.
MyContainer<Monkey> = new MyContainer<Monkey>();
MyContainer<Monkey>
👉Monkey를 넣을 수 있는 MyContainer라는 컨테이너를 만들면,
new MyContainer<Monkey>();
여기에는 Monkey만 들어갈 수 있다.
하지만 이 컨테이너를 재사용 할 수는 있다.
MyContainer<Undergraduate> = new MyContainer<Undergraduate>();
- 이러한 재사용의 장점은
-
MyContainer를 한번만 사용해도 된다는 점. 즉, 모든 메소드가 잘 구현되었는지 한번만 확인하면 된다는 것.
이 컨테이너가 잘 동작한다는 것을 한번만 확인하고 나면,
이 컨테이너에 Monkey던지, Undergraduate던지, 문자열이던 정수던, 원하는 뭐든 담는데 사용할 수 있다.
이러한 구조를 구현하기 위해서 먼저,
제너릭 프로그래밍 & 매개변수화 타입을 사용할 것이라고 Java에게 알려줘야한다.
클래스를 정의할 때 제너릭 프로그래밍, 매개변수화
//변경 전
//변경 후
// 클래스
public class LinkedList
public class LinkedLilst<E>
// 함수
public void addFirst(String S)
public void addFirst(E obj)
public String removeFirst()
public E removeFirst()
매개변수화 타입이라는 것을 알려주는 < E >
E : element
이 클래스 안에서 타입들을 <E> 로 만들어주면 됨.
❗ 단, <E>를 사용하지 않는 예외적인 경우가 있다.
바로 생성자(Constructor)
예시로, 매개변수화 타입을 사용하여 어떤 자료형이든 담을 수 있는 제너릭 노드를 만들면 다음과 같다. 아래 코드에서 E는 모두 같은 자료형을 의미한다.
// 제너릭 노드
class Node<E>{
E data;
Node<E> next;
public Node(E obj){
data=obj;
next=null;
}
}
배열의 경우, 다음과 같이 정의한다.
// 배열
E[] storage = (E[]) new Object[size];
아래 코드는 컴파일이 되지 않는 에러 코드
// 배열 (컴파일 X)
E[] storage = new E[size];
생각해보기
\1) 매개변수화 타입과 객체를 사용하는 방식의 차이점은 무엇인가요?
매개변수화 타입을 사용하면 재사용성이 높아지고,
객체를 사용하는 방식은 형 변환을 하거나 그에 맞게 코드 수정을 해야하는 점이 차이점이다.
References
자바로 구현하고 배우는 자료구조 -Rob Edwards (boostcourse)
Leave a comment