|
| 1 | +--- |
| 2 | +title: 'String 클래스' |
| 3 | +date: '2026-03-17T19:35:33+09:00' |
| 4 | +categories: ["Java"] |
| 5 | +tags: ["Sring Class", "StringBuilder", "Method Chaining"] |
| 6 | +draft: true |
| 7 | +--- |
| 8 | + |
| 9 | +- 기본 |
| 10 | +- 비교 |
| 11 | +- 불변 객체 |
| 12 | +- 주요 메서드1 |
| 13 | +- 주요 메서드2 |
| 14 | +- 가변 String(StringBuilder) |
| 15 | +- String 최적화 |
| 16 | +- 메서드 체이닝(Method Chaining) |
| 17 | + |
| 18 | +## String |
| 19 | + |
| 20 | +- String은 매우 자주 사용하는 자료형이다. 원칙적으로 참조형은 참조값을 보관하고 있기 때문에 문자열을 연결하려면 `concat()` 메서드를 사용해야 한다. 하지만 Java는 개발자의 편의를 위해 `+` 연산을 지원한다. |
| 21 | + |
| 22 | +### 비교 |
| 23 | + |
| 24 | +- 리터럴의 동일성(Identity)을 비교할 때 보통 결과를 `false`로 생각한다. 하지만 실제 결과는 `true`다. Java는 문자열 리터럴을 사용할 때 메모리 효율성, 성능 최적화를 위해 문자열 풀을 사용한다. 실행 시점에 문자열 풀에 `String` 인스턴스를 미리 생성해 두기 때문에 결과는 `true`를 반환한다. |
| 25 | +- 문자열 비교는 항상 `equals()`를 사용하여 동등성(Equality) 비교를 해야 한다. |
| 26 | + |
| 27 | +### 불변 객체 |
| 28 | + |
| 29 | +- `String`은 불변 객체다. 따라서 생성 이후에 절대로 내부 문자열 값을 변경할 수 없다. 따라서 변경이 필요할 때 기존 값을 변경하지 않고, 새로운 결과를 만들어서 반환한다. |
| 30 | +- `String`은 문자열 풀을 사용하여 내부 최적화를 진행한다. 만약 불변 객체가 아니라면 내부 값을 변경할 때 동일한 문자를 참조하는 변수의 모든 값도 함께 변경된다. 의도하지 않은 Side Effect가 발생한다. 따라서 Java는 자주 사용하는 `String`을 불변 객체로 제공하여 Side Effect를 방지한다. |
| 31 | + |
| 32 | +### 주요 메서드 |
| 33 | + |
| 34 | +- `String.format()` vs. `printf()` |
| 35 | + |
| 36 | +## 가변 String(StringBuilder) |
| 37 | + |
| 38 | +- 불변 `String` 클래스는 문자를 변경할 때마다 새로운 객체를 생성해야 한다. 문자를 자주 변경하는 상황에는 CPU, 메모리 자원을 많이 소모한다. |
| 39 | +- 문제를 해결하기 위해 `StringBuilder`, 가변 `String`을 제공한다. 가변은 내부의 값을 바로 변경하기 때문에 새로운 객체를 생성할 필요가 없다. 따라서 성능과 메모리 사용면에서 불변보다 효율적이다. |
| 40 | +- 하지만 Side Effect가 발생할 수 있기 때문에 주의해서 사용해야 한다. |
| 41 | + |
| 42 | +### 가변(Mutable) vs. 불변(Immutable) |
| 43 | + |
| 44 | +- 기본으로 제공하는 `String`은 불변하다. 생성 후 값을 변경할 수 없다. 값을 변경하려면 새로운 `String` 객체를 사용하여 메모리와 처리 시간을 더 많이 소모한다. |
| 45 | +- `StringBuilder`는 가변하다. 객체 안에서 문자열을 추가, 삭제, 수정할 수 있고 새로운 객체를 생성하지도 않는다. 덕분에 메모리 사용을 줄이고 성능을 향상시킬 수 있다. 하지만 Side Effect를 주의해야 한다. |
| 46 | +- 따라서 작업 중에는 `StringBuilder`를 사용할 수 있지만 작업을 마치면 불변한 기본 `String`으로 변환하는 것을 권장한다. |
| 47 | + |
| 48 | +## String 최적화 |
| 49 | + |
| 50 | +- Java는 컴파일 시점에 결과를 예측할 수 있으면 최적화를 진행한다. 하지만 런타임에 알 수 있는 결과는 최적화가 이뤄지지 않는다. |
| 51 | +- `StringBuilder` vs. `StringBuffer` |
| 52 | + |
| 53 | +## 메서드 체이닝(Method Chaining) |
| 54 | + |
| 55 | +- 메서드 체이닝은 Java 라이브러리와 같은 오픈 소스들에서 자주 사용하는 방법이다. (예시) |
| 56 | + |
| 57 | +## 질문 |
| 58 | + |
| 59 | +- 문자열 풀, 쓰레드 풀 |
| 60 | + |
| 61 | +## 마치며 |
0 commit comments