컴퓨터 공부/JAVA

[JAVA] compareTo, equal, == 의 차이점

나정_ 2013. 2. 8. 13:54

오늘은 compareTo와 equal 그리고 == 에 대하여 정리 해보도록 하겠다. 

앞서 말한 이 세가지는 값을 비교할 때 사용하지만 사용용도는 각기 다르기때문에 정확히 알고 사용하여야한다. 



1. compareTo


두 문자열을 비교하는 메서드 


예시 

public static void main(String args[] ){


String a = "ABC";

String b = "ABC";

String c = "BCD";

String d = "ABCDEF";


System.out.println( a.compareTo(b) );

System.out.println( a.compareTo(c) );

System.out.println( a.compareTo(d) );



결과값 : 

0

-1

-3



예시를 들어서 compareTo에 대하여 설명해보자면 

compareTo는 두 문자열을 비교하지만 반환하는 값은 int형으로 반환한다. 


여기서 반환되는 값들은 단순히 같다 틀리다의 개념을 넘어서서 비교 문자열 길이가 같은지, 순서에 맞게 char로 비교하는 결과를 나타낸다. 


 반환되는 값

설명 

두 문자열이 같음 

r>0

r = string1.compareTo(string2) 일 경우 string1>string2 일경우 

 r<0

 r = string1.compareTo(string2) 일 경우 string1<string2 일경우 



여기서 string1 과 string 2를 비교할 때는 


1. 문자열 길이가 다를 경우 

2. 문자열이 다를 경우 

두가지로 나뉘어서 값이 리턴된다. 


위 예시를 참고하여 이해해 보자 

1. System.out.println( a.compareTo(b) ); 

같은 경우 값이 0이 나온 이유는 두 문자열이 같기 때문에 나왔다 


2. System.out.println( a.compareTo(c) ); 

두 문자열 길이는 같으나 문자열 비교( 문자열 비교는 string1.charAt(0)-string2.charAt(0))시 

A - B는 Char 형 숫자가 리턴되므로 -1 값  


3,System.out.println( a.compareTo(d) ); 

두 문자열 길이가 다르기 떄문에 

string1.length()- string2.length 기준으로 = 3-5 = -2 

라는 값이 리턴되는 것이다. 


* 길이와 문자열 이 둘다 다를 경우 문자열이 다른것이 먼저 적용되는 듯함 


2. equals 와 == 


equals()는 비교대상의 문자열 값을 비교하는 메소드이다. 

또한 == 도 비교를 할 때 사용하는데 둘은 엄연히 다르다. ( 둘다 반환되는 값은 boolean임 )


예시 

public static void main(String args[] ){


String a = "안녕";

String b = new String("안녕");

String c = "안녕"; 


System.out.println( a.equals(b) );

System.out.println( a == b ); 

System.out.println( a == c );



결과값 

true

false

true


흔히 == 와  많이 비교되는 이유는 , 

자바에서는 a와 b는 안녕이라는 똑같은 문자열을 가지고 있지만 

== 같은 경우 a와 b의 대상 객체를 비교하는 것이고 

equals는 객체의 값을 비교하기 때문이다.  





String은 call by reference이기 때문에 그냥 new 연산자를 사용하지 않아도 객체가 생성된다. 

그렇기 때문에 String a 는 (임의) 메모리 주소인 10에 할당된다. 

두번째로 String b는 new연산자로 생성되었으며 이렇게 직접적으로 new를 사용할시에 무조건 객체가 새로 생성된다. 

마지막으로 String c ~ 여기서 필자는 c가 가르키는 객체가 새로 생성될 것인지 아님 이전에 있던 객체를 가리킬 것인지에 대하여 헷갈렸다. 

결론은, 자바같은 경우 new 연산자로 생성되지 않은 상태인 String의 참조값이 값이 같을 경우 이전에 가지고 있던 객체를 가르킨다는 사실이다.~ 

그렇기 때문에 마지막 a == c 의 값이 true로 나올 수 있는 것이다.