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


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

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");
    }
}
  • 2016년 05월 14일에 작성됨

조회수 100


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이 발생할 수 있습니다.

  • 2016년 05월 15일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close