자바에서 String 클래스의 equals() 메소드와 동등비교연산자 (==)의 차이가 무엇인가요?

조회수 4773회

아래는 문자열을 토큰으로 분리하고 해당 문자열을 배열에 저장한 뒤, 문자열 비교를 하는 소스코드입니다. 왜 동작하지 않을까요?

public static void main(String...aArguments) throws IOException {

    String usuario = "Jorman";
    String password = "14988611";

    String strDatos = "Jorman 14988611";
    StringTokenizer tokens = new StringTokenizer(strDatos, " ");
    int nDatos = tokens.countTokens();
    String[] datos = new String[nDatos];
    int i = 0;

    while (tokens.hasMoreTokens()) {
        String str = tokens.nextToken();
        datos[i] = str;
        i++;
    }

    //System.out.println (usuario);

    if ((datos[0] == usuario)) {
        System.out.println("WORKING");
    }
}

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    string.equals(Object other) 메소드를 사용하면 string 객체의 문자열을 비교할 수 있습니다. 그러나 == 연산자를 사용하면 문자열 데이터를 비교할 수 없습니다.

    equals() 메소드는 string 객체의 문자열을 비교 체크하는 반면, == 연산자는 객체의 참조값이 같은지를 체크합니다.

    문자열 객체를 만드는 방법이 두 가지가 있는데, 첫째는 문자열 리터럴을 사용하는 방법이고, 둘째는 String 클래스의 생성자를 사용하는 방법입니다. 이 때, 문자열 리터럴을 사용해서 문자열을 만들면 해당 문자열과 동일한 문자열의 객체가 존재하면 기존 객체의 참조값을 공유하는 형태로 문자열 객체가 생성됩니다. 이러한 경우에는 '==` 연산자를 사용해서 "두 문자열이 같다"라는 결과를 얻을 수 있지요. 그러나 이것은 좋은 방법은 아닙니다. 그래서 아래와 같이 항상 equals() 메소드를 사용해서 문자열을 비교하시는 것이 좋습니다.

    if (usuario.equals(datos[0])) {
        ...
    }
    

    주의: 위의 예제는 usuario객체와 datos[0] 객체의 데이터를 비교합니다. 이것을 응용하면 반복하면서 datos 배열의 모든 문자열과 usuario 문자열을 비교할 수 있겠지요. 이 때, usuario는 반드시 null이 아닌 참조값을 갖는 String 클래스 변수여야 하고, 배열의 문자열에 접근할 때는 인덱스의 범위도 조심해야 합니다. 그렇지 않으면 NullPointerException 혹은 ArrayOutOfBoundsException이 발생할 수 있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)