String studentName1 = "abcd";
String studentName2 = "abcd";
boolean isTrue = studentName1.equals(studentName2); // true? false?
문자열을 비교할 때, equals() 메서드와 == 의 차이에 대해 궁금한 적이 있다.
일단 정리하자면
== 연산자
비교하고자 하는 두개의 대상의 주소값을 비교
String 클래스의 equals() 메서드
비교하고자 하는 두개의 대상의 값 자체를 비교
기본 타입으로 int, double, char 형등은 그 자체의 값, Call by Value 형태로 가지고 있기 때문에 주소값이 없다.
하지만 String은 클래스 타입이므로 주소값이 부여되는, Call by Reference 형태를 가지고 있다.
String name1 = new String("abcd");
String name2 = new String("abcd");
그렇기 때문에 현재 name1와 name2의 주소값이 서로 다르게 된다.
이럴 경우 값 자체를 비교하는 메서드인 String.eqauls() 메서드를 사용하여 비교하면 된다.
String name1 = new String("abcd");
String name2 = new String("abcd");
boolean isTrue = name1.equals(name2); // true
하지만 또 다른 중요한 것은 String 변수 생성 시 주소 할당에 대한 것이다.
위에서는 new 연산자를 이용한 방식이고, 또 다른 방법은 리터럴을 이용한 방식 이다.
리터럴을 사용하게 되면 heap 영역 안의 String pool이라는 영역에 생성하게 된다.
그래서 리터럴로 선언할 경우 내부적으로 String의 intern() 메서드가 호출된다.
intern() 메서드는 주어진 문자열이 string constant pool 에 존재하는지 검색하고 있다면 그 주소값을 반환, 없다면 해당 풀에 넣고 새로운 주소값을 반환한다.
String name1 = "abcd";
String name2 = new String("abcd");
boolean isTrue = (name1==name2) ? true : false; // false
그렇기 때문에 이때는 false값을 반환한다.