JAVA 제어문 == VS equals

5844 단어 TILJavaJava

2021/5/23

생활코딩 JAVA1 이후 JAVA 제어문

JAVA 제어문 부분에서는 현재까지 boolean 연산자, 조건문, 비교연산자 등 다양한 기본적인 정보들을 습득했다. 하지만 그동안의 내용들은 c언어를 조금이라도 배워봤다면 쉽게 할 수 있는 부분들이었고 나조차도 이해한 부분이니 .. 뭐 그다지 정리하지 않겠다...
(깃허브에 생활코딩에서 학습하며 정리했던 내용은 업로드해야겠담)

== 연산자와 equals

자 드디어 c언어와 다른 부분이 등장했다. (솔직히 조금 신났음)
c언어 너무 노잼이라 적당히 풀다가 자바 해볼까하고 들어온건데 뭐 사용방법과 메소드, 클래스 이런 차이는 아직 덜 습득한 상태였기에 그렇다쳐도 웬만해선 지금까지 배운 기본적인 부분은 너무 비슷해보였다... 새로운 걸 알아가는 맛이 약간 부족했달까 ㅋ... 이제 얼마나 달라져서 후회할지는 미래의 나에게 맡기겠다 ㅋㅎ

일단 이 코드 내용은 사용자의 아이디를 대조해보는 고런 프로그램 ~

System.out.println(args[0]);

        String id = "spolice";
        String inputID = args[0];

argument에 분명 spolice를 ID로 넘겨주었으나


       if(id == inputID)
             System.out.println("Welcome Master, spolice!");
        else
                System.out.println("Who are you?");
    

를 작성하고 run을 하였을 땐 Who are you?가 출력되는 걸 확인할 수 있다.

그 이후 이고잉님의 강의에서는

          if(inputID.equals(id)
            System.out.println("Welcome Master, spolice!");
        else
                System.out.println("Who are you?");

코드를 이런식으로 수정을 하였고, 그후 정상적으로 나에게 인사하는 코드를 확인할 수 있었다!

그래서 ==와 equals 메소드의 차이는?

Details

(정리 요약은 summary 참고)

자바에는 원시라는 의미의 primitive 데이터, 더이상 쪼갤 수 없는 데이터라고 칭할 수 있는 데이터 타입이 존재한다. 그외에 문자열, 배열, date, 파일, 그리고 우리가 만드는 class 들은 non primitive 데이터 타입으로 구분할 수 있다. 우리가 이렇게 구분하는 이유가 있다.

예를 들어 우리가 int p1 = 1이라는 변수를 선언하면 1이라는 값이 저장될 것이다. 그 이후 int p2를 선언하고 그 값도 1이라고 한다면? 새로운 공간에 저장하는건 데이터 낭비이므로 자바에서는 이름이 다르지만 이 두 변수는 똑같이 1이라는 값이 저장된 공간을 가리키게 한다. 이때 p1과 p2가 같냐는 의미로 p1 == p2 라는 동등비교 연산자를 사용하게 되면, 둘이 같은 곳을 가리키고 있냐는 것을 물어보는 의미이고, 당연히 true가 나올 것이다. 원시데이터 타입들은 이런식으로 동작한다.

하지만 이렇게 o1이라는 문자열을 담는 변수에 new를 이용해서 문자열을 만들고, o2도 만들어 둘다 "java"라는 내용을 담아도 서로 다른 데이터 공간에 값이 저장된다. 이때 o1 과 o2를 o1 == o2로 동등비교 연산자를 사용해 비교하게 된다면 두 값이 같은 곳에 위치하는 지를 따져보고 같은 곳에 있지 않기 때문에 false가 된다.

그렇다면 어떻게 하면 되냐,
원시데이터 타입이 아닌 객체들은 equals라는 메소드를 다 갖고 있다.

o1.equals(o2) 또는 o2.equals(o1)

이렇게 메소드를 호출하게 되면 이 메소드가 o2와 o1이 같은지 내부적으로 계산하고 이 값이 같으면 true를 리턴한다.

하지만 예외로 string(문자열) 데이터 타입은 워낙 우리가 많이 쓰므로 또 특혜를 받고 있다 ~ ㅎ

문자열의 경우 o3, o4를 동등비교 연산자로 했을 때 true가 나올 수도 있다.ㅎㅋ.. 근데 내부적으로 계산 후 다르다고 판단하는 경우가 위의 프로그램처럼 존재하는 경우가 있기 때문에 equals를 사용하는 것이 좋다.

요약 정리

summary

동등비교 연산자 (==) : "값이 같은 곳에 위치해있는가?"를 따져본다.
equals() 메소드 : "내용이 같은가?"를 따져보기 위해 만들어진 메소드.

  • 원시 데이터 타입을 비교할 때는 동등비교 연산자를 사용하면 된다.
    (equals 메소드를 사용할 수도 없음. error 발생)
  • 원시 데이터 타입이 아닐 때는 equals 쓰기

좋은 웹페이지 즐겨찾기