String을 사용하는 방법은 두가지가 있다.
첫 번째, String이 클래스이니 String =new String()의 형태로 정의하는 방법.
두 번째, String = " "로 정의하는 방법.
이 두 방법은 데이터를 저장하는 방식이 본질적으로 다르다.
String= " "의 경우 heap에 문자열이 저장될 때 "String Constant Pool"에 저장된다. 이 방법은 같은 문자열을 가지면 같은 데이터 공간에 포인터를 두게 된다.
다만, 문자열이 달라지게 되면 새로운 공간에 계속해서 저장하게 되면서, 데이터의 손실이 생길수도 있다. 따라서, 변하는 문자열의 히스토리를 볼 때 유용하다.
String =new String()의 경우 문자열이 저장될 때 각각의 공간에 저장된다. 즉, 같은 문자열을 가져도 다른 데이터 주소를 가진다. 그러나. 문자열이 변화하면, 데이터 주소 내의 문자열이 변하기 때문에 문자열의 공간을 덜 차지하게 된다.
예시를 보자.
public static void main(String[] args) {
String s1=new String("나무");
String s2=new String("나무");
System.out.println(s1==s2);
String s3="나무";
String s4="나무";
System.out.println(s3==s4);
보다시피, new로 지정한 문자열은 같은 문자열임에도 불구하고 대입연산자를 두었을 때 거짓이 나타나고, string=의 경우 같은 포인터를 사용하다보니 대입 연산자에서 참이라고 결과가 도출되었다.
이것을 방지하기 위해 문자열을 비교할 때는 대입 연산자를 이용하는 것 보다 eqaul 을 이용하는 것이 훨씬 안전하다.
System.out.println(s1==s4);
System.out.println(s1.equals(s4));
다음의 예시를 보자.
s1은 new String으로, s2는 string으로 지정했으니 서로 다른 공간에 지정되있을 것이다.
이를 equals 로 비교하면, 우선적으로 대입 연산자로 비교해보고, false면 문자열의 실제 값을 비교하여 둘 중 하나라도 참이라면 참의 값을 반환한다. 따라서, 문자열을 비교할 때는 equals를 쓰는 것이 좋다.
'JAVA' 카테고리의 다른 글
JAVA 실습 2. for문에 배열문을 합해 동전의 갯수를 구하는 프로그램 (0) | 2020.03.23 |
---|---|
JAVA 실습 1. 사용자로부터 입력 받은 구구단 프로그램 완성하기. (0) | 2020.03.23 |
5. 반복문 (0) | 2020.03.23 |
call by value passing? call by reference passing? (0) | 2020.03.23 |
static, heap, stack? (0) | 2020.03.20 |