본문 바로가기
Language/JAVA

[JAVA] 자바_compareTo ( 값 [문자열/숫자] 비교 )

by 썸머워즈 2019. 6. 11.
반응형

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() 가 존재한다.

반응형


댓글

TOP