티스토리 뷰
String 객체 비교
Java에서 객체의 동등성을 비교하는 방법은 두 가지가 있습니다. 하나는 Object.equals 함수를 이용하는 것이고, 다른 하나는 == 연산자를 이용하는 방법입니다. == 연산자를 이용해서 두 개의 객체를 비교할 때에는 두 변수가 힙 메모리 상에 동일한 주소를 가르키고 있는지를 확인합니다. 그래서 같은 내용을 가진 객체라도 힙 메모리 상에 각자 올라가 있는 상태라면 == 연산자 비교시 false 값을 가지게 됩니다.
String a = new String("hello");
String b = new String("hello");
a == b; //false
new 키워드를 사용해서 객체의 인스턴스를 생성할 경우 힙 메모리 상에 해당 객체정보가 올라가고, 할당하고자 하는 변수에 그 메모리 주소를 할당하게 됩니다. a와 b 변수는 같은 "hello" 값을 가지고 있지만, 힙 메모리 상에 별도의 객체로 존재하기 때문에 == 연산자 비교시 false 값을 나타내게 됩니다. a 객체와 b 객체의 값을 비교하기 위해서는 a.equals(b) 같은 방식으로 처리해야 합니다. String 객체는 문자열 정보를 내부적으로 char[]로 저장하고 있고, Object.equals 메소드를 오버라이딩하여 두 String 객체의 내부 char[] 값을 하나하나 루프를 돌며 비교하도록 처리해 놓았습니다.
String a = "hello";
String b = "hello";
a == b; //true
new 키워드를 사용하지 않고, 문자열을 바로 정의하였을 경우에는 두 String 객체 비교시 == 연산자를 사용할 수 있습니다. 그 이유는 jvm 자체적으로 중복된 String 정보들을 하나의 객체로 관리해 주기 때문입니다. a 변수와 b 변수는 실제로 메모리 상에서도 동일한 위치를 가르키고 있기 때문에 == 연산자를 이용해서 비교하는게 가능합니다.
StringBuilder a = new StringBuilder("hello");
System.out.println(a.toString() == a.toString()); //true or false?
하나의 StringBuilder 객체 변수를 가지고 두 번 toString을 호출한 후 비교하였습니다. 결과값은 어떻게 나올까요? 이는 StringBuilder 객체가 toString 메소드를 어떻게 오버라이딩 하였는가에 따라 결정되는데, StringBuilder 객체는 새로운 String 객체를 생성하여 반환해 주도록 설계되어 있습니다. 내부적으로 가지고 있는 char[] 정보를 여러 변수가 공유하면 안되기 때문입니다.
StringBuilder는 toString 호출 시마다 새로운 객체를 생성해서 돌려주게 되고, 매번 돌려주는 객체는 모두 별도로 메모리 상에 존재하게 됩니다.
StringBuilder a = new StringBuilder("hello");
StringBuilder b = new StringBuilder("hello");
System.out.println(a.equals(b)); //true or false?
두개의 StringBuilder 객체를 equals로 비교했을 경우에는 어떻게 될까요? 둘 다 동일한 "hello" 값을 가지고 있는 것으로 보아 true를 리턴해 줄 것 같지만, 실제로는 false가 리턴됩니다. 그 이유는 StringBuilder는 equals 메소드를 오버라이딩 하지 않았기 때문입니다. a와 b는 메모리상에 엄연히 다른 객체이기 때문에 false 값을 돌려주게 됩니다.
'개발 > Java' 카테고리의 다른 글
Restful API 개발 참고 사항 요약 (0) | 2016.11.08 |
---|---|
Java Method Overriding (0) | 2016.06.17 |
Java String #1 (0) | 2016.05.30 |
Builder Pattern (0) | 2016.05.06 |
Static factory method (0) | 2016.05.01 |