Java에서 문자열을 비교하는 방법을 알아보자.
보통 자바에서 equals를 사용하여 문자열이 동일한지 확인한다.
다른 언어와 다르게 ==로 문자열이 같은지 확인하지 않는다. (그 이유는 밑에)
String a = "Hello";
String b = "Java";
String c = "Hello";
System.out.println(a.equals(c)); // 결과값: true
System.out.println(a.equals(b)); // 결과값: false
a와 c를 비교했을 때, 둘다 같은 문자열의 형태를 가지고 있으므로 true값이 나온다.
반면, a와 b를 비교했을 때, 다른 문자열의 형태를 가지고 있으므로 false값이 나온다.
if(!str1.equals("a")){
System.out.println("a가 아닙니다");
}
그럼 equals와 == 은 어떤 차이점이 있을까?
기본적으로 이 둘은 모두 양 쪽에 있는 내용을 비교한 값을 boolean type으로 반환한다는 공통점을 가진다. 하지만 차이점이 있다.
equals 메소드는 비교하고자 하는 대상의 내용 자체를 비교하지만,
== 연산자는 비교하고자 하는 대상의 주소값을 비교한다.✔️ 주소값: 대상을 구별할 수 있게하는 값
int, float, double, char, byte 등 primitive type은 Call By Value로 기본적으로 대상에 주소값을 가지지 않는 것으로 값을 할당받는 형태로 사용된다.
Class, Object(객체)같은 Call By Reference는 대상을 선언했을 때, 주소값이 부여된다.
그래서 어떠한 객체를 불러왔을 때는 그 주소값을 불러온다.
String은 일반적인 type이 아닌 class로 주소값이 부여된다.
String은 같은 문자를 정의했음에도 불구하고, 서로다른 주소값이 나올 수 있다.
String a = "Hello"; String b = a; String c = new String ("Hello"); // c만 주소값이 다름.
a, b, c 모두 "Hello" 라는 내용을 가지고 있지만, c의 주소값은 a,b와 다르게 다른 주소값을 가진다.
내용은 같지만 c가 다른 주소값을 할당받은 이유는 "Hello" 라는 문자열을 대입한 것이 아니라 new String ("Hello") 를 통해 새로운 문자열을 선언하였기 때문이다.
📌 String 클래스안에 있는 equals라는 메서드를 사용하면 두 비교대상의 주소 값이 아닌 데이터값을 비교하기 때문에 어떻게 String을 생성하느냐에 따라 결과가 달라지지 않고 정확한 비교를 할 수 있다.
추가확인 Object.equals()