자료구조 : 자바
comparable 인터페이스/오버라이드
String one = "hello world";
String two = "hello world";
if(one.equals(two)) {
System.out.println("they are the same");
위의 코드에서 equals 메서드가 어디서 왔는가?
-> 문자열에서 왔다
-> 정확히는 객체의 equals 메서드를 오버라이드 했다 (원래의 메서드 오버라이드)
Object o = one; //형변환
Object t = two;
if(o.equals(t))
객체를 비교할 때는 메모리 주소를 비교하고
문자열 클래스를 비교할 때는 메모리 주소를 비교하지 않는다
객체(원숭이)가 같은지 비교
Monkey m = new Monkey();
Monkey n = new Monkey();
if(m.equals(n))
객체의 equals 메서드는 문자열의equals와 다르다
객체 클래스의 equals는 메모리 주소를 비교하지만,
문자열 클래스의 equals를 오버라이드하면 메모리 주소 대신 문자열을 비교하게 만들 수 있다.
->이 equals 메서드를 보고 Monkey 클래스가 equals 메서드를
오버라이드 했는지 알 수 없다
-> 다른 사람이 이 자료구조를 이용할 때 문제가 발생
어떤 과정을 통해서 equals 메서드를 무조건 오버라이드 하도록 하거나
우리가 사용할 메서드를 무조건 오버라이드 하도록 해야 한다
-> 비교하는 과정을 확장할 수 있다
comparable 인터페이스
객체 클래스의 equals 메서드 외에도 두 가지가 같은지 알려주는 메서드이다
comparable<T> interface
정수를 반환하는 공개 메서드 compareTo는
public int compareTo(t obj)
a.compareTo(b)
if(a<b) return <0
if( a == b) return 0
if(a>b) return >0
의 규칙을 따른다
따라서 객체를 비교하고 싶을 때
comparable 인터페이스와 compareTo 메서드를 활용하여
어떤 객체를 넣고 어느 상황이든
상황에 따라 0보다 작거나 큰 수 혹은 0을 반환해주면 된다
compareTo 메서드의 다른 기능들
- 객체와 객체 비교
- 문자열 문자열 비교
- 여러 문자열 정렬
**자료구조를 설계할 때는 정렬은 중요하지 않지만
compareTo 메서드가 규칙에 맞는 작업을 해준다는 사실을 기억하면 좋다
정리
- 데이터가 있다면 compareTo 메서드에 넣으면 된다
- 자료구조에서는 이 데이터를 받고 이를 이용해 comparable의 compareTo 메서드에 전달한다
-> 둘을 비교하여 둘이 같은지 다른지 알 수 있다
if(((Comparable<T>) data) //형변환// .compareTo(obj) == o) -> 동일하다
이 코드의 의미 compareTo 메서드를 호출하게 되면
이 comparTo 메서드는 comparable에 들어있는 메서드가 된다
데이터를 가져와서 comparable로 형변환을 하고 compareTo를 호출한다
호출된 compareTo에 data와 같은 형식의 객체를 인자로 넣어준다
상황에 따라 다르게 반환이 될 것이다
-> 연결리스트에서 이것을 활용하게 된다
'CS지식 > 자료구조' 카테고리의 다른 글
TIL 정리_58 (0) | 2022.04.14 |
---|---|
TIL 정리_57 (0) | 2022.04.13 |
TIL 정리_51(Queue) (0) | 2022.04.07 |
TIL 정리_50(Stack) (0) | 2022.04.06 |
TIL 정리_49(StringBuilder) (0) | 2022.04.05 |