non primitive data를 비교할 때 equals
vs ==
중에서 무엇을 사용해야할까?
결론부터 말하면 객체비교에서 equals
를 사용하는 습관을 가져야한다.
==
을 사용하면 주소값을 비교하여 같은 값이라도 객체가 다르다면 주소값이 다를 수 있기 때문에 다르다고 판단한다. 따라서 값을 비교하기 위해서는 equals
를 사용해야한다.
본격적으로 왜 그런지 알아보자!
객체비교에서 equals
를 사용해야하는이유는 아래의 질문에 답변하면서 이해해보자!
Q ) 객체를 불러오면 value가 불러와질까?
정답은 아니다. 주소값이 불러와진다.
Q) 왜 주소값이 불러와지는 것일까?
객체 는 CBR 를 사용하기 때문이다.
| CBR란, call by reference로 대상을 선언했을 때 주소값이 부여되고 불러올 때 역시, 주소값을 불러오는 방식이다.
CBR은 JAVA의 non primitive data type에 대해서 적용된다.
primitive에는 int, float, double, byte 등이 있다.
non primitive에는 Strings , Arrays , Classes , Interface 등이 존재한다.
객체는 Class
로 생성하기 때문에 CBR을 따른다.
주소값을 비교하는 예제를 보자.
public class CBR {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
if(str=="0"){//---(1)
System.out.println("==");
}
if(str.equals("0")){//---(2)
System.out.println("equals");
}
}
}
0을 입력했을 때 (1)는 false, (2)는 true이다.
scanner는 새로운 string 객체를 만들어 반환하는데 "0"과 다른 객체인 str은 서로 다른 주소값을 가지고 있다.
따라서 주소값을 비교하면 값이 같더라도 다르다고 판단된다. 따라서, 주소값을 비교하면 안 되고 value자체를 비교하기 위해서는 equals
를 사용하면 된다.
Q) 그렇다면 다름을 비교하기 위해서는 어떻게 해야할까?
!string.equals("문자열")
위와 같이 사용하면 될 것이다.
또 다른 예제로 마무리하겠다
public class CBR {
public static void nonPrimitive(){
String str1 = new String("string");
String str2 = new String("string");
String str3 = str2;
if(str1==str2){
System.out.println("yes");
}else{
System.out.println("no");
}
if(str2==str3){
System.out.println("yes");
}else{
System.out.println("no");
}
if(str1.equals(str2)){
System.out.println("yes");
}else{
System.out.println("no");
}
}
public static void primitive(){
String str1 = "string";
String str2 = "string";
if(str1==str2){
System.out.println("yes");
}else{
System.out.println("no");
}
}
public static void main(String[] args) {
CBR.nonPrimitive();
CBR.primitive();
}
}
결과는
no
yes
yes
yes
가 나온다.
객체로 생성하게 되면 주소값을 반환하기 때문에 서로 다른 객체라면 ==
연산자일때 서로 다른 주소값이기에 false
결과가 나올 것이다.
값 자체를 비교하기 위해서는 String 객체를 새로 만들지 않거나 equals
를 사용하면 된다.