티스토리 뷰
이번 포스팅에서는 new String()과 “”의 차이를 살펴봅시다.
new String()과 ""의 차이점
둘의 차이는 새로운 인스턴스를 만들어내느냐에 있습니다.
String string = new String("eric");
이 코드는 실행될 때마다 String 인스턴스를 새로 만듭니다.
반복문이나 빈번히 호출되는 메서드 안에 있다면 쓸데없는 String 인스턴스가 수천 개 이상 만들어질 수 있습니다.
이에 개선된 버전의 코드가 바로 “”로 선언하는 코드입니다.
String string = "eric";
이 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용합니다.
나아가 이 방식을 사용한다면 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장됩니다.
이펙티브 자바에서는 불필요한 객체 생성을 피하라고 나와 있습니다.
위처럼 문자열을 new String으로 문자열을 만들어내는 방법은 IDLE에서도 권고하고 있지 않습니다.
String docs를 들어가보면 해당 String 생성자에는 다음과 같은 글이 적혀있습니다.
Note that use of this constructor is unnecessary since Strings are immutable.
해석해보면 “문자열은 불변이므로 이 생성자를 사용할 필요가 없습니다.” 입니다.
String은 불변 클래스라는 의미인데, 과연 불변 클래스가 대체 무엇일까요?
불변 클래스(final class)
불변 클래스란 간단하게 말하면 그 인스턴스의 내부 값을 수정할 수 없는 클래스입니다.
불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는 셈이죠.
그렇다면 String 클래스를 불변으로 선언한 이유는 무엇일까요?
불변 클래스는 가변 클래스보다 설계, 구현 및 사용하기 쉬우며 오류가 생길 여지도 적고 훨씬 안전합니다.
불변 클래스의 장점은 다음과 같습니다.
불변 객체는 단순합니다.
[장점] 1.불변 객체는 생성된 시점의 상태를 파괴될 때까지 그대로 간직합니다.
모든 생성자가 클래스 불변식(class invariant)을 보장한다면 그 클래스를 사용하는 프로그래머가 다른 노력을 들이지 않더라도 영원히 불변으로 남습니다.
불변 객체는 근본적으로 스레드가 안전하여 따로 동기화할 필요가 없다.
[장점] 2.여러 스레드가 동시에 사용해도 절대 훼손되지 않습니다.
사실 클래스를 스레드가 안전하게 만드는 가장 쉬운 방법이기도 하죠.
불변 객체에 대해 그 어떤 스레드도 다른 스레드에 영향을 줄 수 없으니 불변 객체는 안심하고 공유할 수 있습니다.
따라서 불변 클래스라면 한 번 만든 인스턴스를 최대한 재활용하기를 권합니다.
가장 쉬운 재활용 방법은 자주 쓰이는 값들을 상수(public static final)로 제공하는 것입니다.
[사견] String의 값은 char[]로 관리하고 있어서 상수나 정적 팩터리로 제공하지 않는 것 같습니다.
이팩티브 자바 책에서는 자바 초창기 때 만들어진 것이므로, 어쩔 수 없으니 되도록 사용하지 말아야 한다고 적혀 있습니다.
장점은 위말고도 더 있는데 String보다는 다른 불변 클래스에 더 가까운거 같아서 생략하겠습니다.
다음은 불변 클래스의 단점을 알아봅시다.
[단점] 1. 값이 다르면 반드시 독립된 객체로 만들어야 한다.
“eric”, “bobo”, “son”, “dennis” 처럼 값이 다르면 객체가 4개가 생기게 되는 원리입니다.
위같은 성능 문제를 대처하기 위해서는 다단계 연산을 기본적으로 제공하면 객체를 생성하지 않아도 됩니다.
String을 예로 들면 StringBuilder와 StringBuffer가 있습니다.
결론
String과 관련된 내용만 가볍게 다뤄봤는데 결론은 다음과 같습니다.
- new String()은 자바 초창기 때 잘못 설계된 실수이므로 되도록 사용하지 말아야합니다.
- String 관련 연산은 되도록 성능 개선을 위해 StringBuilder나 StringBuffer를 사용해야 합니다.
'JAVA' 카테고리의 다른 글
JVM의 구조와 Java의 실행방식 (0) | 2022.07.24 |
---|---|
오브젝트의 동일성과 동등성 (0) | 2022.07.10 |
방어적 복사 (0) | 2022.05.01 |
java에서 멀티쓰레드 [3] Callable과 Future (0) | 2022.02.07 |
java에서 멀티쓰레드 [2] Executors와 ExecutorService (0) | 2022.02.07 |
- Total
- Today
- Yesterday
- BOJ
- MSA
- 객체지향
- 프로그래머스
- kotest
- 이펙티브 자바
- kkoon9
- 백준
- Spring Boot
- AWS
- 이팩티브 자바
- Java
- programmers
- JPA
- BAEKJOON
- 정규표현식
- 클린 아키텍처
- 디자인패턴
- 디자인 패턴
- 알고리즘
- 클린 코드
- node.js
- Kotlin
- 코테
- 테라폼
- Olympiad
- Effective Java
- Spring
- Algorithm
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |