Java Algo Core 20

String Methods (2)

초코너무조코 2024. 5. 8. 22:01
728x90

-compareTo(String another)

1. compareTo는 숫자타입과 String 타입을 모두 비교해준다.

 

 (1) 숫자 비교

 

숫자의 비교 같은 경우는 단순히 크다(1), 같다(0), 작다(-1) 의 관한 결과값을 리턴

 

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타입을 가지고 비교할 수 있다.

 

 (2) 문자 비교

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이 되는것이다.

 

비교대상과 전혀 다른 문자일 경우 역시 크게 다를거 없다.
이 역시도 비교가 불가능한 지점의 문자열 아스키값을 기준으로 비교한다.

str.compareTo("zefd") 이것의 값은 a = 97 / z = 122 이기 때문에 차이값인 -25가 반환되며

str.compareTo("ABCD") 이것과 같은 경우는 compareTo의 경우 대소문자를 구분하기 때문에
a = 97 / A = 65 이므로 차이값인 32가 반환되는 것이다.

여기서 대소문자를 무시하고 비교해주는 함수 compareToIgnorecase() 가 존재한다.

 

출처: https://mine-it-record.tistory.com/133 [나만의 기록들:티스토리]

728x90

'Java Algo Core 20' 카테고리의 다른 글

String Methods (6)  (0) 2024.05.08
String Methods (5)  (0) 2024.05.08
String Methods (4)  (0) 2024.05.08
String Methods (3)  (0) 2024.05.08
String Methods  (0) 2024.05.07