티스토리 뷰

개발/Java

String #2 객체 비교

haloper 2016. 6. 3. 12:42

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함