# 질의 응답 상황
[면접관]
| 지원자님 Javafmf 주로 사용하셨는데 String / Stringbuffer / StringBuilder에 대해서 간략하게 설명해주세요. |
[막개발자]
| 먼저 String은 불변의 속성이라 값이 변경되면, String 변수가 바라보던 메모리 영역의 정보가 변경이 되는게 아니라 새롭게 만들어지고 기존의 메모리는 나중에 GC의 대상이 됩니다. 그래서 성능상 좋지 않습니다. 그래서 StringBuffer나 StringBuilder라는 개념이 생겨나게 되었습니다. 이것들은 가변의 속성을 가지고 있습니다. 그래서 .append .delete 같은 API를 사용하여 값을 변경하게 됩니다. 가변의 속성을 가지고 있기 때문에 String과 달리 메모리 영역의 데이터 자체가 변경되고 새롭게 만들어지지 않습니다. 좀 더 자세히 설명 드리면,
|
# 상세 설명

자바에서 String, StringBuffer, StringBuilder는 모두 문자열을 다루는 클래스입니다. 이들 각각은 문자열을 처리하는 방식에서 큰 차이가 있으며, 성능, 사용 용도 등이 다릅니다. 각 클래스에 대해 자세히 설명하겠습니다.
1. String 클래스
String 클래스는 불변(immutable) 문자열 클래스입니다. 즉, 한 번 생성된 String 객체는 변경할 수 없습니다. String 객체의 내용을 변경하려면, 새로운 String 객체를 생성해야 합니다. String은 자주 사용되며, 자바에서 문자열을 다룰 때 기본적으로 사용되는 클래스입니다.
특징
- 불변(immutable): String 객체의 내용을 변경할 수 없으며, 수정할 때마다 새로운 String 객체를 생성합니다.
- 문자열 리터럴: 문자열을 String 리터럴로 사용할 수 있습니다. 자바는 문자열 리터럴을 자동으로 관리하며, 동일한 리터럴이 있을 경우 같은 객체를 참조하도록 합니다.
- 성능: 불변성 때문에 문자열이 자주 변경되는 경우 성능이 저하될 수 있습니다.
예시
public class StringExample {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
// 문자열 연결
String str3 = str1 + " " + str2; // 새로운 String 객체 생성
System.out.println(str3); // "Hello World"
}
}
String 클래스의 주요 메서드
- length(): 문자열의 길이를 반환
- charAt(int index): 주어진 인덱스에 있는 문자를 반환
- substring(int start, int end): 문자열의 일부를 반환
- concat(String str): 문자열을 이어서 새로운 문자열을 반환
- equals(String anotherString): 두 문자열이 같은지 비교
2. StringBuffer 클래스
StringBuffer 클래스는 가변(mutable) 문자열 클래스입니다. 즉, StringBuffer 객체의 내용은 변경 가능합니다. 주로 문자열을 자주 변경하는 작업에서 성능이 중요한 경우 사용됩니다. StringBuffer는 스레드 안전(thread-safe)한 클래스입니다. 즉, 멀티스레드 환경에서 동기화가 자동으로 처리됩니다.
특징
- 가변(mutable): StringBuffer 객체는 생성 후 수정이 가능합니다. 문자열을 추가, 삭제, 삽입, 변경할 수 있습니다.
- 스레드 안전(thread-safe): StringBuffer는 멀티스레드 환경에서 안전하게 사용될 수 있도록 설계되었습니다. 내부적으로 동기화(synchronization)가 처리됩니다.
- 성능: 문자열을 자주 변경하는 경우 String보다 성능이 우수합니다. 그러나 멀티스레드 환경에서 동기화가 필요 없다면 StringBuilder가 더 나은 성능을 제공합니다.
예시
public class StringBufferExample {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 문자열 추가
sb.insert(5, ","); // 특정 위치에 문자열 삽입
sb.delete(5, 6); // 특정 위치에서 문자열 삭제
System.out.println(sb); // "Hello World"
}
}
StringBuffer 클래스의 주요 메서드
- append(String str): 문자열을 끝에 추가
- insert(int offset, String str): 지정한 위치에 문자열을 삽입
- delete(int start, int end): 지정한 범위의 문자열을 삭제
- reverse(): 문자열을 반대로 뒤집기
- toString(): StringBuffer를 String으로 변환
3. StringBuilder 클래스
StringBuilder 클래스는 StringBuffer와 매우 유사하지만, 스레드 안전성이 보장되지 않는 가변 문자열 클래스입니다. 즉, StringBuilder는 멀티스레드 환경에서 사용할 경우 주의가 필요하지만, 싱글스레드 환경에서는 StringBuffer보다 빠릅니다. 멀티스레드 환경에서 동기화가 필요 없다면 성능이 중요한 상황에서 StringBuilder를 사용하는 것이 좋습니다.
특징
- 가변(mutable): StringBuilder는 StringBuffer와 마찬가지로 문자열을 변경할 수 있습니다.
- 스레드 안전성 없음: StringBuilder는 동기화를 제공하지 않으므로 멀티스레드 환경에서 사용할 경우 주의가 필요합니다.
- 성능: 멀티스레드 환경을 고려하지 않으면 StringBuilder는 StringBuffer보다 빠릅니다. 동기화가 없기 때문에 성능이 더 우수합니다.
예시
public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World"); // 문자열 추가
sb.insert(5, ","); // 특정 위치에 문자열 삽입
sb.delete(5, 6); // 특정 위치에서 문자열 삭제
System.out.println(sb); // "Hello World"
}
}
StringBuilder 클래스의 주요 메서드
- append(String str): 문자열을 끝에 추가
- insert(int offset, String str): 지정한 위치에 문자열을 삽입
- delete(int start, int end): 지정한 범위의 문자열을 삭제
- reverse(): 문자열을 반대로 뒤집기
- toString(): StringBuilder를 String으로 변환
비교 요약
| 특성 | String | StringBuffer | StringBuilder |
| 불변성 | 불변 (변경 불가능) | 가변 (수정 가능) | 가변 (수정 가능) |
| 스레드 안전성 | 없음 | 있음 (자동 동기화) | 없음 (동기화 없음) |
| 성능 | 자주 변경되면 성능 저하 | 멀티스레드 환경에서 성능 좋음 | 싱글스레드 환경에서 성능 가장 좋음 |
| 주용도 | 문자열이 변하지 않는 경우 | 멀티스레드 환경에서 문자열 변경이 필요한 경우 | 싱글스레드 환경에서 성능이 중요한 경우 |
결론
- String은 불변 객체로, 값이 변하지 않거나 변경이 거의 없는 문자열을 처리할 때 사용합니다.
- StringBuffer는 문자열을 자주 수정해야 하며, 멀티스레드 환경에서도 안전하게 사용할 수 있어야 할 때 적합합니다.
- StringBuilder는 StringBuffer와 비슷하지만, 멀티스레드 환경에서의 동기화가 필요 없는 경우, 성능이 중요한 상황에서 적합합니다.
'[이직 면접] 질의 응답' 카테고리의 다른 글
| [Web 개발 기본] Proxy Pattern에 대해서 설명 하세요. (0) | 2020.12.06 |
|---|---|
| [Java] 객체와 class에 대해서 설명하세요. (0) | 2020.12.06 |
| [자료구조] 페이지교체 알고리즘에 대해서 설명하세요. (0) | 2020.12.06 |
| [Java] 탐색 알고리즘에 대해서 설명하세요. (0) | 2020.12.06 |
| [Java] primitive type, reference type에 대해서 설명하세요 (0) | 2020.12.04 |