제네릭, Comparable 인터페이스
알게 모르게 쓰고 있었던 것
List<Integer>
할 때 저 <> (다이아몬드 기호)를 말함
제네릭(Generic)
: 클래스 내부에서 지정하는 것이 아니라 외부에서 필요할 때 사용자에 의해 지정되는 것을 의미.
정확히 말하자면 지정된다기보다는 타입의 경계를 지정하고 컴파일 할 때 해당 타입으로 캐스팅하여
매개변수화 된 유형을 삭제하는 것.
Comparable 인터페이스
: 객체에서 원하는 자료형으로 비교할 수 있는 인터페이스
Comparable 인터페이스는 같은 자료형의 다른 객체 하나를 인자로 받아서 compareTo 함수를 사용하여 비교한다.
a.compareTo(b)는 a가 b보다 작을 때 0보다 작은 수, a와 b가 같으면 0, a가 b보다 크면 0보다 큰 수를 반환한다.
if(((Comparable<T>) date).compareTO(obj) == 0)
이렇게 Comparable 인터페이스를 만들면 <T>에 자료형에 맞는 데이터가 들어와서 같은 자료형의 데이터로 비교 가능
제네릭 프로그래밍
ex. 내가 리턴 타입을 int[]로 한 정말 잘 만든 함수가 있다고 할 때, 이 함수를 다른 자료형에 대해 사용하고 싶다면 제네릭 프로그래밍 기법을 이용하면 된다.
: 제네릭 프로그래밍은 다양한 자료형의 객체에 대해 작성한 코드를 재사용한다는 객체 지향 기법이다.
클래스 외부에서 타입을 지정해 주기 때문에 따로 타입을 체크하고 변환해 줄 필요가 없어 관리가 편하며
잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
매개변수화 타입 사용
: 제네릭 프로그래밍을 구현하기 위한 방법.
<> 안에 Type Parameter.를 넣어 컴파일 시 구체적인 타입이 결정되도록 한다.
매개변수화 사용하는 방법
// 클래스
public class LinkedList
public class LinkedLilst<E>
// 함수
public void addFirst(String S)
public void addFirst(E obj)
//생성자는 E를 쓸 필요 없음
public String removeFirst()
public E removeFirst()
예시
//제네릭 노드
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];
배열의 경우, Object로 생성자를 만들어준 후, 앞에 E[]로 형변환
+ 220804 Comparable 인터페이스 내용 추가, 제네릭 설명 보충
참고
https://www.youtube.com/watch?v=zgCnMvvw6Oo&list=PLpPXw4zFa0uKKhaSz87IowJnOTzh9tiBk