Java

제네릭, Comparable 인터페이스

hyecozy 2022. 5. 15. 00:58

알게 모르게 쓰고 있었던 것

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