SlideShare a Scribd company logo
1 of 10
Item 12.
Comparable 인터페이스의 구현을 고려하
자
Chapter 3. 모든 객체에 공통적인 메소드
Comparable 인터페이스?
/**
…
*/
public interface Comparable<T> {
/**
…
*/
public int compareTo(T o);
}
Comparable 인터페이스?
/**
…
*/
public interface Comparable<T> {
/**
…
*/
public int compareTo(T o);
}
this > o : positive
this == o : 0
this < o : negative
Comparable 구현의 장점?
• Comparable 인터페이스를 구현한 객체들의 배열
– Arrays.sort(Type)
• Comparable 인터페이스를 구현한 객체들의 Collection
– Collections.sort(List)
 Comparable 인터페이스에 의존하는 알고리즘 및 컬렉션
클래스들을 이용가능!
 실제 자바 라이브러리의 모든 값 클래스들은 Comparable 인터페
이스를 구현 함
Comparable의 보편적인 계약
1. 모든 x와 y에 대하여
sgn(x.compareTo(y))=-sgn(y.compareTo(x))
가 되도록 해야 한다.
2. x.compareTo(y)>0 && y.compareTo(z)>0 이면
x.compareTo(z)>0 이어야 한다.
3. x.compareTo(y)==0 이라면, 모든 z에 대해
sgn(x.compareTo(z))==sgn(y.compareTo(z)) 이 되어야 한
다.
4. (x.compareTo(y) == 0) == (x.equals(y)) 가 되도록 하는 것이
좋다.
• compareTo 메소드에서 동일 여부를 검사할 때 equals 계
약 조항과 같은 제약을 따라야 한다.
– Reflexivity
– Symmetry
– Transivity
Comparable의 보편적인 계약
• compareTo 메소드에서의 비교가 equals메소드와 일치 X
 정렬 컬렉션들은(TreeSet, TreeMap, …) 컬렉션 인터페이스의 보
편적 계약을 따르지 않을 수 있다.
 BigDecimal 클래스의 compareTo 메소드와 equals 메소드가 일치
하지 않는다고 하면, new BigDecimal(“1.0”)와 new
BigDecimal(“1.00”) 두 객체를 HashSet에 추가한다면 두 객체 모
두 저장 되지만, TreeSet에 저장한다면 하나만 저장될 것.
Comparable의 보편적인 계약
Comparable의 구현
• 비교할 필드가 여러 개인 클래스
의 경우에는 순서대로 비교
– 필드 값이 같지 않으면 바로
return
– 모두 같으면 0 return
public int compareTo(PhoneNumber pn) {
// 지역 코드를 비교한다
if (areaCode < pn.areaCode)
return -1;
if (areaCode > pn.areaCode)
return 1;
// 지역 코드가 같으므로, 국번호를 비교한다
if (prefix < pn.prefix)
return -1;
if (prefix > pn.prefix)
return 1;
// 지역 코드와 국번호가 같으므로, 회선 번호
를 비교한다
if (lineNumber < pn.lineNumber)
return -1;
if (lineNumber > pn.lineNumber)
return 1;
// 모든 필드의 값이 동일하다
return 0;
}
Comparable의 구현
• 비교할 필드가 여러 개인 클래스
의 경우에는 순서대로 비교
– 필드 값이 같지 않으면 바로
return
– 모두 같으면 0 return
public int compareTo(CopyOfPhoneNumber pn) {
// 지역 코드를 비교한다
int areaCodeDiff = areaCode - pn.areaCode;
if (areaCodeDiff != 0)
return areaCodeDiff;
// 지역 코드가 같으므로, 국번호를 비교한다
int prefixDiff = prefix = pn.prefix;
if (prefixDiff != 0)
return prefixDiff;
// 지역 코드와 국번호가 같으므로, 회선 번호
를 비교한다
return lineNumber - pn.lineNumber;
}
Comparable의 구현
• 비교할 필드가 여러 개인 클래스
의 경우에는 순서대로 비교
– 필드 값이 같지 않으면 바로
return
– 모두 같으면 0 return
 오버플로우 발생 가능!
public int compareTo(CopyOfPhoneNumber pn) {
// 지역 코드를 비교한다
int areaCodeDiff = areaCode - pn.areaCode;
if (areaCodeDiff != 0)
return areaCodeDiff;
// 지역 코드가 같으므로, 국번호를 비교한다
int prefixDiff = prefix = pn.prefix;
if (prefixDiff != 0)
return prefixDiff;
// 지역 코드와 국번호가 같으므로, 회선 번호
를 비교한다
return lineNumber - pn.lineNumber;
}

More Related Content

What's hot

[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
 
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...Seok-joon Yun
 
연산자 오버로딩
연산자 오버로딩연산자 오버로딩
연산자 오버로딩수빈 박
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나병걸 윤
 
[C++ korea] effective modern c++ study item 2 understanding auto type deduc...
[C++ korea] effective modern c++ study   item 2 understanding auto type deduc...[C++ korea] effective modern c++ study   item 2 understanding auto type deduc...
[C++ korea] effective modern c++ study item 2 understanding auto type deduc...Seok-joon Yun
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장HolyTak
 
[Pl in c++] 9. 다형성
[Pl in c++] 9. 다형성[Pl in c++] 9. 다형성
[Pl in c++] 9. 다형성MinGeun Park
 

What's hot (10)

[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
 
C++11
C++11C++11
C++11
 
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
[C++ korea] Effective Modern C++ study item 19 use shared ptr for shared owne...
 
연산자 오버로딩
연산자 오버로딩연산자 오버로딩
연산자 오버로딩
 
5 swift 기초함수
5 swift 기초함수5 swift 기초함수
5 swift 기초함수
 
Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나Hoons 닷넷 정기세미나
Hoons 닷넷 정기세미나
 
C++11 1
C++11 1C++11 1
C++11 1
 
[C++ korea] effective modern c++ study item 2 understanding auto type deduc...
[C++ korea] effective modern c++ study   item 2 understanding auto type deduc...[C++ korea] effective modern c++ study   item 2 understanding auto type deduc...
[C++ korea] effective modern c++ study item 2 understanding auto type deduc...
 
Windosw via c 스터디2장
Windosw via c 스터디2장Windosw via c 스터디2장
Windosw via c 스터디2장
 
[Pl in c++] 9. 다형성
[Pl in c++] 9. 다형성[Pl in c++] 9. 다형성
[Pl in c++] 9. 다형성
 

Viewers also liked

Item10. toString 메소드는 항상 오버라이드 하자
Item10. toString 메소드는 항상 오버라이드  하자Item10. toString 메소드는 항상 오버라이드  하자
Item10. toString 메소드는 항상 오버라이드 하자Sungho Moon
 
Python3 10장 문자열이야기
Python3 10장 문자열이야기Python3 10장 문자열이야기
Python3 10장 문자열이야기Jihoon Kong
 
Item 30 int 상수 대신 enum을 사용하자
Item 30 int 상수 대신 enum을 사용하자Item 30 int 상수 대신 enum을 사용하자
Item 30 int 상수 대신 enum을 사용하자Sungho Moon
 
Item 26. 제네릭 타입을 애용하자
Item 26. 제네릭 타입을 애용하자Item 26. 제네릭 타입을 애용하자
Item 26. 제네릭 타입을 애용하자Sungho Moon
 
item15. 가변성을 최소화하자
item15. 가변성을 최소화하자item15. 가변성을 최소화하자
item15. 가변성을 최소화하자Sungho Moon
 
Item 24. 컴파일 경고 메시지가 없게 하자
Item 24. 컴파일 경고 메시지가 없게 하자Item 24. 컴파일 경고 메시지가 없게 하자
Item 24. 컴파일 경고 메시지가 없게 하자Sungho Moon
 
Item 33 서수 인덱스 대신 EnumMap을 사용하자.
Item 33 서수 인덱스 대신EnumMap을 사용하자.Item 33 서수 인덱스 대신EnumMap을 사용하자.
Item 33 서수 인덱스 대신 EnumMap을 사용하자.Sungho Moon
 
Item 19. 타입을 정의할 때만 인터페이스를 사용하자.
Item 19. 타입을 정의할 때만 인터페이스를 사용하자.Item 19. 타입을 정의할 때만 인터페이스를 사용하자.
Item 19. 타입을 정의할 때만 인터페이스를 사용하자.Sungho Moon
 

Viewers also liked (8)

Item10. toString 메소드는 항상 오버라이드 하자
Item10. toString 메소드는 항상 오버라이드  하자Item10. toString 메소드는 항상 오버라이드  하자
Item10. toString 메소드는 항상 오버라이드 하자
 
Python3 10장 문자열이야기
Python3 10장 문자열이야기Python3 10장 문자열이야기
Python3 10장 문자열이야기
 
Item 30 int 상수 대신 enum을 사용하자
Item 30 int 상수 대신 enum을 사용하자Item 30 int 상수 대신 enum을 사용하자
Item 30 int 상수 대신 enum을 사용하자
 
Item 26. 제네릭 타입을 애용하자
Item 26. 제네릭 타입을 애용하자Item 26. 제네릭 타입을 애용하자
Item 26. 제네릭 타입을 애용하자
 
item15. 가변성을 최소화하자
item15. 가변성을 최소화하자item15. 가변성을 최소화하자
item15. 가변성을 최소화하자
 
Item 24. 컴파일 경고 메시지가 없게 하자
Item 24. 컴파일 경고 메시지가 없게 하자Item 24. 컴파일 경고 메시지가 없게 하자
Item 24. 컴파일 경고 메시지가 없게 하자
 
Item 33 서수 인덱스 대신 EnumMap을 사용하자.
Item 33 서수 인덱스 대신EnumMap을 사용하자.Item 33 서수 인덱스 대신EnumMap을 사용하자.
Item 33 서수 인덱스 대신 EnumMap을 사용하자.
 
Item 19. 타입을 정의할 때만 인터페이스를 사용하자.
Item 19. 타입을 정의할 때만 인터페이스를 사용하자.Item 19. 타입을 정의할 때만 인터페이스를 사용하자.
Item 19. 타입을 정의할 때만 인터페이스를 사용하자.
 

Similar to item12. Comparable 인터페이스의 구현을 고려하자

나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선daewon jeong
 
Lua 문법 -함수
Lua 문법 -함수Lua 문법 -함수
Lua 문법 -함수Jaehoon Lee
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍Hyunsoo Jung
 

Similar to item12. Comparable 인터페이스의 구현을 고려하자 (6)

나에 첫번째 자바8 람다식 지앤선
나에 첫번째 자바8 람다식   지앤선나에 첫번째 자바8 람다식   지앤선
나에 첫번째 자바8 람다식 지앤선
 
Lua 문법 -함수
Lua 문법 -함수Lua 문법 -함수
Lua 문법 -함수
 
2012 Ds 03
2012 Ds 032012 Ds 03
2012 Ds 03
 
06장 함수
06장 함수06장 함수
06장 함수
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍7가지 동시성 모델 - 3장. 함수형 프로그래밍
7가지 동시성 모델 - 3장. 함수형 프로그래밍
 

item12. Comparable 인터페이스의 구현을 고려하자

  • 1. Item 12. Comparable 인터페이스의 구현을 고려하 자 Chapter 3. 모든 객체에 공통적인 메소드
  • 2. Comparable 인터페이스? /** … */ public interface Comparable<T> { /** … */ public int compareTo(T o); }
  • 3. Comparable 인터페이스? /** … */ public interface Comparable<T> { /** … */ public int compareTo(T o); } this > o : positive this == o : 0 this < o : negative
  • 4. Comparable 구현의 장점? • Comparable 인터페이스를 구현한 객체들의 배열 – Arrays.sort(Type) • Comparable 인터페이스를 구현한 객체들의 Collection – Collections.sort(List)  Comparable 인터페이스에 의존하는 알고리즘 및 컬렉션 클래스들을 이용가능!  실제 자바 라이브러리의 모든 값 클래스들은 Comparable 인터페 이스를 구현 함
  • 5. Comparable의 보편적인 계약 1. 모든 x와 y에 대하여 sgn(x.compareTo(y))=-sgn(y.compareTo(x)) 가 되도록 해야 한다. 2. x.compareTo(y)>0 && y.compareTo(z)>0 이면 x.compareTo(z)>0 이어야 한다. 3. x.compareTo(y)==0 이라면, 모든 z에 대해 sgn(x.compareTo(z))==sgn(y.compareTo(z)) 이 되어야 한 다. 4. (x.compareTo(y) == 0) == (x.equals(y)) 가 되도록 하는 것이 좋다.
  • 6. • compareTo 메소드에서 동일 여부를 검사할 때 equals 계 약 조항과 같은 제약을 따라야 한다. – Reflexivity – Symmetry – Transivity Comparable의 보편적인 계약
  • 7. • compareTo 메소드에서의 비교가 equals메소드와 일치 X  정렬 컬렉션들은(TreeSet, TreeMap, …) 컬렉션 인터페이스의 보 편적 계약을 따르지 않을 수 있다.  BigDecimal 클래스의 compareTo 메소드와 equals 메소드가 일치 하지 않는다고 하면, new BigDecimal(“1.0”)와 new BigDecimal(“1.00”) 두 객체를 HashSet에 추가한다면 두 객체 모 두 저장 되지만, TreeSet에 저장한다면 하나만 저장될 것. Comparable의 보편적인 계약
  • 8. Comparable의 구현 • 비교할 필드가 여러 개인 클래스 의 경우에는 순서대로 비교 – 필드 값이 같지 않으면 바로 return – 모두 같으면 0 return public int compareTo(PhoneNumber pn) { // 지역 코드를 비교한다 if (areaCode < pn.areaCode) return -1; if (areaCode > pn.areaCode) return 1; // 지역 코드가 같으므로, 국번호를 비교한다 if (prefix < pn.prefix) return -1; if (prefix > pn.prefix) return 1; // 지역 코드와 국번호가 같으므로, 회선 번호 를 비교한다 if (lineNumber < pn.lineNumber) return -1; if (lineNumber > pn.lineNumber) return 1; // 모든 필드의 값이 동일하다 return 0; }
  • 9. Comparable의 구현 • 비교할 필드가 여러 개인 클래스 의 경우에는 순서대로 비교 – 필드 값이 같지 않으면 바로 return – 모두 같으면 0 return public int compareTo(CopyOfPhoneNumber pn) { // 지역 코드를 비교한다 int areaCodeDiff = areaCode - pn.areaCode; if (areaCodeDiff != 0) return areaCodeDiff; // 지역 코드가 같으므로, 국번호를 비교한다 int prefixDiff = prefix = pn.prefix; if (prefixDiff != 0) return prefixDiff; // 지역 코드와 국번호가 같으므로, 회선 번호 를 비교한다 return lineNumber - pn.lineNumber; }
  • 10. Comparable의 구현 • 비교할 필드가 여러 개인 클래스 의 경우에는 순서대로 비교 – 필드 값이 같지 않으면 바로 return – 모두 같으면 0 return  오버플로우 발생 가능! public int compareTo(CopyOfPhoneNumber pn) { // 지역 코드를 비교한다 int areaCodeDiff = areaCode - pn.areaCode; if (areaCodeDiff != 0) return areaCodeDiff; // 지역 코드가 같으므로, 국번호를 비교한다 int prefixDiff = prefix = pn.prefix; if (prefixDiff != 0) return prefixDiff; // 지역 코드와 국번호가 같으므로, 회선 번호 를 비교한다 return lineNumber - pn.lineNumber; }