[JAVA] equals method와 == 비교연산자의 차이점

sujin·2023년 4월 15일
0

java

목록 보기
1/2
post-thumbnail

equals method와 == 비교연산자 사용시 주의점

non primitive data를 비교할 때 equals vs == 중에서 무엇을 사용해야할까?

결론부터 말하면 객체비교에서 equals를 사용하는 습관을 가져야한다.
==을 사용하면 주소값을 비교하여 같은 값이라도 객체가 다르다면 주소값이 다를 수 있기 때문에 다르다고 판단한다. 따라서 값을 비교하기 위해서는 equals를 사용해야한다.

본격적으로 그런지 알아보자!


call by reference

객체비교에서 equals를 사용해야하는이유는 아래의 질문에 답변하면서 이해해보자!
Q ) 객체를 불러오면 value가 불러와질까?
정답은 아니다. 주소값이 불러와진다.
Q) 왜 주소값이 불러와지는 것일까?
객체CBR 를 사용하기 때문이다.

  • 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를 사용하면 된다.

0개의 댓글