자료구조(java) 2_2. comparable 인터페이스
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에 들어있는 메소드.(형변환을 해주었기 때문)
- (Comparable<t>) data 👉 받은 data에 대해서 comparable로 형변환(casting)을 해준다.
여기서 받은 data는 어디서 온 것인지 추후 다룰 예정
- (Comparable<t>) data).compareTo(obj) 👉 비교대상(obj) 를 인자로 넣은 compareTo 메소드 호출
이 값이 == 0 이라면, 이 둘은 같은 것.
생각해보기
\1) Comparable 인터페이스의 T는 무엇을 의미할까요?
Type
References
자바로 구현하고 배우는 자료구조 -Rob Edwards (boostcourse)
Leave a comment