티스토리 뷰
String : .equals()와 ==의 차이, 그리고 StringBuffer
자바에서 String 자료형 비교를 하다 보면, 같은 값임에도 불구하고 .equals()와 ==의 결과값의 차이가 나타날 때가 있다.
이러한 차이는 어떤 이유에서 비롯된 것일까?
- .equals() : 두 문자열의 값이 같은지 비교함.
- == : 두 문자열의 메모리 주소값이 같은지 비교함.
때문에 같은 값이 있더라도 ==로 비교하게 되면 메모리 주소값이 달라 false가 출력될 수 있다.
또한 JAVA의 String 객체는 아래와 같은 특성이 있다.
C와 달리, 자바의 String은 변수 자체에 저장되는 것이 아닌 String Object로 생성이 되며,
Object의 값이 같은 경우 새로운 Object를 생성하는 것이 아닌 주소값을 참조하게 된다.
즉, 이미 같은 값을 가지고 있는 변수가 있다면, 새로 객체를 만드는 것이 아닌 메모리 값에서 참조해 사용하게 된다.
아래는 할당에 관한 예시이다.
예시 1) 서로 같은 값을 가진 객체를 선언할 때
// 예시 1
String a = "abc";
String b = "abc";
System.out.println(a.equals(b)); // 두 객체의 값을 비교
System.out.println(a==b); // 두 객체의 주소값을 비교
// output : true, true
두 주소값을 비교하는 a==b가 true가 나오는 것으로 a와 b가 서로 같은 주소값을 사용함을 알 수 있다.
예시 2) 서로 같은 값을 가지지만, 동적 할당으로 객체를 선언할 때
// 예시 2
String a = "abc";
String b = new String("abc");
System.out.println(a.equals(b));
System.out.println(a==b);
// output : true, false
b 객체를 동적으로 할당해줬기 때문에 서로 다른 메모리 공간을 사용하게 되어 false가 나온다.
할당 이외에 수정의 경우에도 메모리 변동이 일어난다.
C언어 : 처음에 메모리 주소에 할당하면 그 메모리 주소 내에서 저장된 값이 변경된다.
JAVA : String 객체의 경우 수정이 일어날 때 마다 새로이 할당해주게 된다.
String a = "abc";
String b = "efg";
String back_up = a;
System.out.println(a==back_up);
a+=b;
System.out.println(a==back_up);
// output : true, false
처음 a와 back_up의 메모리 주소값은 동일하였으나, a에 b를 더하는 연산을 한 후 a의 주소값이 바뀌었음을 알 수 있다.
이 때문에 String 객체를 수정할 때마다 새로이 객체를 할당해주어 수행시간에 영향을 주는데, 이러한 것을 방지하기 위해 나온자료형이 StringBuffer이다.
'언어 > 자바' 카테고리의 다른 글
[JAVA/기초] HashSet을 이용한 집합연산 (0) | 2022.11.14 |
---|---|
[JAVA/기초] 스트림(Stream) (0) | 2022.11.09 |
[JAVA/기초] 클래스와 다형성(Polymorphism) (0) | 2022.11.07 |