코드 제출 중 계속 틀렸다는 결과를 받아, == 를 equals로 변경 후 제출했더니 통과되었다. ==와 equals의 차이는 무엇인지, 언제 사용해야하는지 정리해본다.
여기서 문자열 리터럴을 사용하는 경우, 문자열 상수 풀(String Pool)이라는 메모리 영역에 해당 문자열을 저장하고, 동일한 문자열 리터럴을 사용하는 경우에는 새로운 객체를 사용하지 않고 이미 존재하는 객체를 재사용하게 된다. new String()을 사용하는 경우 매번 새로운 문자열 객체가 생성되므로, 항상 새로운 메모리 주소를 가지게 된다.
: == 연산자와 equals() 메소드의 가정 큰 차이점은 다음과 같다.
String은 int, char 와 같은 일반적인 타입이 아닌 클래스로 Call by Reference 형태이다. 그러므로 생성 시 주소값이 부여되기에, 같은 값을 부여하더라도 서로간의 주소값이 다르게 된다.
<예시>
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
boolean isEqual1 = (str1 == str2); // true, str1과 str2는 동일한 문자열 리터럴을 참조
boolean isEqual2 = (str1 == str3); // false, str1과 str3는 다른 객체를 참조
boolean isEqual3 = str1.equals(str3); // true, 두 문자열의 내용은 동일
그러므로, 문자열이 서로 같은 문자열인지 다른 문자열인지 비교할 때는 equals를 사용하는 것이 일반적으로 안전하다.
해당 문제에 제출한 코드는 아래와 같다
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine(); //한줄로 입력 받기
//앞뒤 공백 제거
str = str.trim();
String[] arr = str.split(" ");
if(arr.length == 1 && arr[0].equals("")){
System.out.print(0);
}else{
System.out.print(arr.length);
}
sc.close();
}
}