compareTo()
- int compareTo(NumberSubClass referenceName)
- int compareTo(String anotherString)
- compareTo() 함수는 두개의 값을 비교하여 int 값으로 반환해주는 함수이다.
compareTo() 함수에는 위에서 설명하는바와 같이 "문자열의 비교" 와 "숫자의 비교" 두 방식이 존재한다.
숫자의 비교 같은 경우는 단순히 크다(1), 같다(0), 작다(-1) 의 관한 결과값을 리턴해주는 반면
문자열의 비교 같은 경우는 같다(0), 그 외 양수/음수값 같이 참 재미난 결과를 반환해준다.
숫자형 비교
public class CompareToTest{
public static void main(String[] args){
Integer x = 3;
Integer y = 4;
Double z = 1.0;
System.out.println( x.compareTo(y) ); // -1
System.out.println( x.compareTo(3) ); // 0
System.out.println( x.compareTo(2) ); // 1
System.out.println( z.compareTo(2.7) ); // -1
}
}
위에 예제를 보면 알겠지만 숫자형 비교는 Byte, Double, Integer, Float, Long 또는 Short 등을 비교할 수 있으며, 반환되는 값의 경우 아래의 규칙을 따른다.
- 기준 값과 비교대상이 동일한 값일 경우 0
- 기준 값이 비교대상 보다 작은 경우 -1
- 기준 값이 비교대상 보다 큰 경우 1
예제를 보면 타입을 Integer로 선언해 주었는데, 만약 int타입을 가지고 비교하고자 한다면 다음과 같이 사용하면 된다.
int x = 4;
int y = 5;
Integer.compare(x,y);
이런식으로 Integer.compare 메서드를 사용해주면 int타입을 가지고 비교할 수 있다.
문자열 비교
문자열 비교의 경우 모르고 사용하면 반환해주는 값이 예상이 안돼서 참 당황스러운데,
왜 그러한 값들을 반환해주는지 하나씩 알아보도록 하자.
public class CompareToTest{
public static void main(String[] args){
String str = "abcd";
// 1) 비교대상에 문자열이 포함되어있을 경우
System.out.println( str.compareTo("abcd") ); // 0 (같은 경우는 숫자나 문자나 0을 리턴)
System.out.println( str.compareTo("ab") ); // 2
System.out.println( str.compareTo("a") ); // 3
System.out.println( str.compareTo("c") ); // -2
System.out.println( "".compareTo(str) ); // -4
// 2) 비교대상과 전혀 다른 문자열인 경우
System.out.println( str.compareTo("zefd") ); // -25
System.out.println( str.compareTo("zEFd") ); // -25
System.out.println( str.compareTo("ABCD") ); // 32
}
}
1) 비교대상에 문자열이 포함되어있을 경우
str.compareTo("ab") 의 결과값이 왜 2라는 값이 나올까?
이유는 "abcd" 에 "ab" 가 포함되어있으면 즉,
기준값에 비교대상이 포함되어있을 경우 서로의 문자열 길이의 차이값을 리턴해주기 때문이다.
같은 이유로 아래와 같은 값이 출력되는 것이다.
- "abcd"(4) - "ab"(2) = 2,
- "abcd"(4) - "a"(1) = 3,
- "abcd"(4) - ""(0) = 4
그럼 여기서 하나 의문인게,
왜 str.compareTo("c") 의 결과값이 왜 -2가 나올까?
분명 중간에 포함되어있는데 같은 이유로 길이를 비교해줘야 하는거 아닌가?
아쉽게도 comparTo는 같은 위치의 문자만 비교하기 때문에, 첫번째 문자부터 순서대로 비교해서 다를 경우 바로 아스키값을 기준으로 비교처리를 한다.
비교가 불가능한 지점의 각 문자열의 아스키값을 기준으로 비교를 해준다.
"abcd" 와 "c" 를 비교해줄 경우 첫번째 위치에서 비교가 실패했기 때문에,
"a" 와 "c"의 아스키코드 값의 차이값을 리턴해준다.
이둘의 아스키코드의 차이값은 a = 97 / c = 99 이기 때문에 순서에 따라 -2값이 리턴되는것이다.
추가적으로 몇가지 예를 가지고 다시 살펴보자.
"abhg".compareTo("h"); // -7
"abcd".compareTo("abfd"); // -3
첫번째 예제는 a = 97 / h = 104 이기 때문에 차이값은 -7이 되는것이다.
두번째 예제는 비교가 불가능한 시점을 찾아줘야 하는데, 여기서 비교가 불가능한 시점이 어디일까?
ab는 서로 동일하기에 c와 f의 비교에서 비교가 불가능하다.
그렇기 때문에 c = 99 / f =102 이기 때문에 차이값은 -3이 되는것이다.
2) 비교대상과 전혀 다른 문자열인 경우
비교대상과 전혀 다른 문자일 경우 역시 크게 다를거 없다.
이 역시도 위에서 설명한것과 마찬가지로 비교가 불가능한 지점의 문자열 아스키값을 기준으로 비교한다.
str.compareTo("zefd") 이것의 값은 -25가 나오는데 그 이유는 모두 짐작한거와 같이
a = 97 / z = 122 이기 때문에 차이값인 -25가 반환되며
str.compareTo("ABCD") 이것과 같은 경우는 compareTo의 경우 대소문자를 구분하기 때문에
a = 97 / A = 65 이므로 차이값인 32가 반환되는 것이다.
여기서 대소문자를 무시하고 비교해주는 함수 compareToIgnorecase() 가 존재한다.
댓글