작성
·
108
·
수정됨
답변 3
0
==
연산자는 기본적으로 identity(동일) 비교를 수행합니다.
자바에서 기본형(int, float, ...)을 제외한 모든 것은 객체입니다.
따라서 String str
과 String str1
은 (서로 다른) 객체입니다.
다만 그 객체가 담고 있는 값이 object.toString()
으로 동등할 뿐입니다.
즉 서로 다른 객체이기에 그 참조가 다릅니다(물리적으로 다른 위치). => 동일하지는 않다.
println()
에서 str
과 str1
의 값이 같게 출력되는 이유는 해당 메서드는 println(str)
과 같이 객체(str)가 argument로 전달된다면 (컴파일러에 의해) 자동적으로 println(str.toString())
과 같이 동작하게 됩니다.
이때 String 객체(str)에 대한 toString()
메서드는 참조값이 아닌 문자열 값을 리턴하도록 오버라이드되어 있습니다.
따라서 println(str)
과 println(str1)
은 둘 다 object.toString()
의 리턴값인 문자열 값을 리턴하기 때문에 같은 결과인 것입니다.
또한 문자열 객체에 대한 equals()
메서드는 toString()
메서드의 리턴 값을 비교하여 그 값이 같으면 true
를 리턴합니다(equality,동등성 비교). 따라서 위 6번에 따라 true
를 리턴합니다.
하지만 ==
을 통한 비교는 identity, 동일성을 비교합니다. 이때 비교에 사용하는 것은 객체에 대한 toString()
값이 아니라, 객체의 참조값을 비교합니다. 따라서 위 3번에 의해 false
를 리턴합니다.
0
str = object.toString();
str1 = object.toString();
을 했을때 object 객체의 참조값이 문자열로 들어가고
str, str1의 참조값 변하지 않고 예시로 써놓은 x001과 x002 처럼 다르기 때문에 false가 나온 것 같네요
0
안녕하세요, 인프런 AI 인턴입니다. 진우님.
질문하신 내용은 Java에서 String
객체들 간의 equals()
메소드와 ==
연산자의 차이에 관련된 부분입니다.
equals()
메소드: 이 메소드는 두 String
객체의 내용(value)이 같은지를 검사합니다. 코드에서 str1.equals(str)
는 두 문자열의 실제 내용이 같은지 비교하므로, 같은 내용을 가진다면 true
를 반환합니다.
==
연산자: 이 연산자는 두 객체의 참조(reference)가 같은지를 검사합니다. 이는 두 객체가 같은 메모리 위치를 참조하는지를 뜻합니다. str1 == str
은 내용이 아닌 참조를 비교하기 때문에, 만약 str1
과 str
이 다른 인스턴스라면 false
를 반환하게 됩니다.
String str1 = str.concat("!!!");
는 str
문자열의 끝에 “!!!“를 붙인 새로운 문자열을 반환합니다. 이로 인해 str1
과 str
은 다른 인스턴스를 가지게 됩니다.str
과 str1
모두 object.toString()
값을 받으면 같은 메모리 참조를 가지게 되어 ==
와 equals()
모두 true
를 반환하게 됩니다. 이는 해당 객체의 메소드 호출 이후 동일한 참조를 가지기 때문입니다.질문하신 내용과 관련된 유사한 답변으로 String str = “Hello, Java! Welcome to Java”;과 String str1 = str.concat(“!!!”);의 객체값 비교 를 참고해보시면 도움이 될 것입니다. 특정 상황에서 ==
와 equals()
의 차이점을 비교하는 더 구체적인 설명을 볼 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.