자바에서 String 클래스의 equals() 메소드와 동등비교연산자 (==)의 차이가 무엇인가요?
조회수 4880회
아래는 문자열을 토큰으로 분리하고 해당 문자열을 배열에 저장한 뒤, 문자열 비교를 하는 소스코드입니다. 왜 동작하지 않을까요?
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 답변
-
string.equals(Object other)
메소드를 사용하면 string 객체의 문자열을 비교할 수 있습니다. 그러나==
연산자를 사용하면 문자열 데이터를 비교할 수 없습니다.equals()
메소드는 string 객체의 문자열을 비교 체크하는 반면,==
연산자는 객체의 참조값이 같은지를 체크합니다.문자열 객체를 만드는 방법이 두 가지가 있는데, 첫째는 문자열 리터럴을 사용하는 방법이고, 둘째는 String 클래스의 생성자를 사용하는 방법입니다. 이 때, 문자열 리터럴을 사용해서 문자열을 만들면 해당 문자열과 동일한 문자열의 객체가 존재하면 기존 객체의 참조값을 공유하는 형태로 문자열 객체가 생성됩니다. 이러한 경우에는 '==` 연산자를 사용해서 "두 문자열이 같다"라는 결과를 얻을 수 있지요. 그러나 이것은 좋은 방법은 아닙니다. 그래서 아래와 같이 항상 equals() 메소드를 사용해서 문자열을 비교하시는 것이 좋습니다.
if (usuario.equals(datos[0])) { ... }
주의: 위의 예제는 usuario객체와 datos[0] 객체의 데이터를 비교합니다. 이것을 응용하면 반복하면서
datos
배열의 모든 문자열과 usuario 문자열을 비교할 수 있겠지요. 이 때, usuario는 반드시 null이 아닌 참조값을 갖는 String 클래스 변수여야 하고, 배열의 문자열에 접근할 때는 인덱스의 범위도 조심해야 합니다. 그렇지 않으면 NullPointerException 혹은 ArrayOutOfBoundsException이 발생할 수 있습니다.
댓글 입력