2 minute read

Comparable 인터페이스

제네릭 자료 구조나 객체를 이용해 비교

제네릭 프로그래밍이란 하나의 데이터가 특정 데이터 타입에만 종속되지 않고 여러 데이터 타입을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그램 방식이다. - 위키백과

제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.

한마디로 특정(Specific) 타입을 미리 지정해주는 것이 아닌 필요에 의해 지정할 수 있도록 하는 일반(Generic) 타입이라는 것이다.

정확히 말하자면 지정된다는 것 보다는 타입의 경계를 지정하고, 컴파일 때 해당 타입으로 캐스팅하여 매개변수화 된 유형을 삭제하는 것이다.


  • Generic(제네릭)의 장점

1. 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.

2. 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.

3. 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.

타입 설명
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number



String one = "hello world";
String two = "hello world";

if (one.equals(two))	//true
  system.out.println("they are the same.")

equals( ) 메소드 는 String class(문자열 클래스)에서 온 것.

👉 Object 클래스의 equals( ) 가 아닌, Object.equals( ) 를 오버라이드 한 것.



두 변수를 객체로 형변환 하여 비교해보면,

Object o = one;
Object t = two;

if (o.equals(t))	//false

Object 클래스의 equals 메소드는 메모리 주소를 비교하게 된다.



💡이처럼, 객체 클래스의 equals는 메모리 주소를 비교하지만, 문자열 클래스의 equals를 오버라이드하면 메모리 주소 대신 문자열을 비교하게 만들 수 있습니다.



Monkey m = new Monkey();
Monkey n = new Monkey();

if(m.euquals(n))

여기서 m.equals( ) 는 Monkey 클래스가 equals 메소드를 오버라이드 했는지 알 수 없다.

그러므로 우리가 사용할 equals메소드를 무조건 오버라이드 하도록 해야한다.


따라서 Object 클래스의 equals( ) 이외에도 두가지가 같은지 아닌지 알려주는 Comparable Interface 방법이 있다.




Comparable 인터페이스

Comparable Interface 는 단 하나의 메소드만 있다.

바로 정수를 반환하는 공개 메소드 CompareTo.

Comparable<T> interface	//comparable 인터페이스를 구현하고,
  public int compareTo(T obj)	//정수를 반환하는 공개 메소드인 compareTo를 만든다


이제 만든 공개 메소드 compareTo에 어떤 객체를 넣어도 비교가 가능하다.


a.compareTo(b)
  if (a < b) //return < 0 (0보다 작은 수를 반환)
  if (a == b) //return 0 (0을 반환)
  if (a > b) //return > 0 (0보다 큰 수를 반환)


compareTo 를 만듦으로써 나의 자료구조를 설계할 때 이 메소드는 데이터의 유입에 있어서 규칙에 맞는 작업을 해줄 것이다.

자료구조는 데이터들을 받아 compareTo에 넣고 이들이 같은지 다른지 알 수 있다.

if ( ( (Comparable<t>) data).compareTo(obj) == 0 ) )
  //여기서 호출한 compareTo 메소드는 Comparable에 들어있는 메소드.(형변환을 해주었기 때문)
  1. (Comparable<t>) data 👉 받은 data에 대해서 comparable로 형변환(casting)을 해준다.

여기서 받은 data는 어디서 온 것인지 추후 다룰 예정

  1. (Comparable<t>) data).compareTo(obj) 👉 비교대상(obj) 를 인자로 넣은 compareTo 메소드 호출

이 값이 == 0 이라면, 이 둘은 같은 것.




생각해보기

\1) Comparable 인터페이스의 T는 무엇을 의미할까요?

Type




References

자바로 구현하고 배우는 자료구조 -Rob Edwards (boostcourse)

제너릭(Generic)의 이해 - Stranger’s LAB

Updated:

Leave a comment