728x90
문자열의 생성
Java에서는 두가지 방식으로 문자열을 선언할 수 있다.
String str1 = new String("madplay");
String str2 = "madplay";
new 연산자를 사용하면 heap 메모리에 적재가 되고 리터럴의 경우에는 heap안의 상수풀에 적재가 된다. 이것을 그림으로 표현하자면 다음과 같이 된다.
비교 equals, ==
간단히 equals는 객체의 값으로 비교하고 ==는 객체의 주소값으로 비교하게 된다.
String str1 = new String("aaa");
String str2 = new String("aaa");
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true
위와 같은 경우 ==는 값은 같지만 주소값이 다르므로 false가 출력되고 equals는 값이 같으므로 true를 반환하게 된다.
리터럴의 사용?
불변성(Immutable)이 가장 큰 장점이라고 생각한다.
String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
위와 같은 경우에 str2같은 경우에는 같은 str1과 값이 같지만 새로운 객체를 생성하여 새로 값을 주입하게된다. 하지만 str3는 상수풀에 등록된 str1와 값이 같기때문에 새로운 객체를 생성하는 것이 아닌 str1을 참조하게 된다. 이렇게 되면 thread-safe하고 컴파일러에 최적화하게 된다.
불변의 String 연산
불변인 String을 + 연산자를 사용하여 값을 추가할 때 이미 있는 객체에 그 값이 더해지는게 아니라 새로운 객체를 생성하여 (원래의 값 + 추가할 값)을 넣는다. 이러한 비효율적인 점때문에 StringBuilder나 StringBuffer를 이용하면 String의 연산이 더 효율적으로 이루어지게 된다.
'Java' 카테고리의 다른 글
Static (정적) (0) | 2022.04.02 |
---|---|
대용량 요청 시 API limit (0) | 2022.03.15 |
제네릭 타입소거 (Generic type Erasure) (0) | 2021.11.07 |
자바의 컴파일 과정 (0) | 2021.10.31 |
[JAVA] Wrapper Class와 일급 컬렉션 (0) | 2021.10.17 |