Java: String이란?
1. 개요
String
은 Java에서 문자들의 연속(문자열) 을 표현하는 대표적인 클래스이며, java.lang
패키지에 포함되어 있어 별도의 import
없이 바로 사용할 수 있다.
- 단일 문자는
char
타입으로, 복수 문자의 집합은String
으로 다룬다. String
은 객체이며, 내부적으로char[]
배열을 기반으로 구성된다.- Java의
String
은 불변(immutable) 구조를 갖고 있어, 생성 이후 변경이 불가능하다.
2. 주요 특징
2.1 문자열은 객체다
String str = "hello"; // str은 String 클래스의 인스턴스
- 문자열은 객체이므로, 메서드와 연산을 통해 다양한 처리가 가능하다.
- 내부적으로
char[]
배열을 가지며, 다양한 유틸리티 메서드 (length()
,substring()
,toUpperCase()
등)를 제공한다.
2.2 불변성 (Immutable)
String
은 한 번 생성되면 그 내용을 변경할 수 없다.- 문자열을 수정하는 모든 작업은 새로운 String 객체를 생성한다.
String a = "hi";
a += "!";
System.out.println(a); // hi!
→ "hi"
는 그대로 있고 "hi!"
는 새 객체로 Heap에 생성됨.
2.3 문자열 리터럴은 상수 풀(String Constant Pool)에 저장
String s1 = "java";
String s2 = "java";
System.out.println(s1 == s2); // true → 같은 주소 참조
→ 동일한 리터럴은 JVM 내의 String Constant Pool에서 공유됨
3. 문자열 생성 방법
3.1 리터럴 방식 (권장)
String s = "Hello";
- JVM이 문자열 상수 풀(Constant Pool)에서 공유 → 메모리 효율적
- 가장 일반적이고 직관적인 방식
3.2 생성자 방식 (비권장)
String s2 = new String("Hello");
- 항상 새로운 객체를 Heap에 생성
- 리터럴과는 다른 주소를 갖게 됨 → 메모리 낭비 가능
📌 사용 예시
String a = "abc";
String b = new String("abc");
System.out.println(a == b); // false (주소 비교)
System.out.println(a.equals(b)); // true (내용 비교)
4. 문자열 비교
4.1 ==
vs .equals()
String a = "test";
String b = "test";
String c = new String("test");
System.out.println(a == b); // true (상수 풀에서 공유)
System.out.println(a == c); // false (Heap에 새 객체 생성)
System.out.println(a.equals(c)); // true (내용 비교)
비교 방식 | 설명 |
---|---|
| 객체의 주소값 비교 (레퍼런스) |
| 객체가 가진 내용값 비교 |
5. 문자열 길이와 메서드
String s = "hello world";
System.out.println(s.length()); // 11
System.out.println(s.charAt(0)); // h
System.out.println(s.substring(0, 5)); // hello
System.out.println(s.toUpperCase()); // HELLO WORLD
System.out.println(s.replace(" ", "_")); // hello_world
6. 기타 특징 및 내부 구조
6.1 String 내부 구조
- Java 9 이전:
char[]
로 저장 - Java 9 이후:
byte[]
+coder
(압축을 위해 Compact Strings 적용)
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
private final int offset;
private final int count;
...
}
6.2 문자열 연결 (Concatenation)
String a = "Hello";
String b = "World";
String c = a + " " + b; // Hello World
+
연산자는 내부적으로StringBuilder
로 변환되어 처리됨 (컴파일러 최적화)- 반복적인 연결에는 직접
StringBuilder
사용 권장
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
System.out.println(sb.toString()); // Hello World
7. 정리
항목 | String |
---|---|
불변성 | ✅ 한 번 생성된 값은 변경 불가 |
생성 방식 | 리터럴(권장), 생성자(비권장) |
비교 방식 |
|
내부 구조 | Java 9 이전: |
연결 방식 |
|
사용 시기 | 고정된 문자열, 메시지, 상수 등 |