Skip to main content

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 (내용 비교)

비교 방식

설명

==

객체의 주소값 비교 (레퍼런스)

.equals()

객체가 가진 내용값 비교


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

불변성

✅ 한 번 생성된 값은 변경 불가

생성 방식

리터럴(권장), 생성자(비권장)

비교 방식

== 주소 비교 / .equals() 값 비교

내부 구조

Java 9 이전: char[]

연결 방식

+, concat(), StringBuilder 사용

사용 시기

고정된 문자열, 메시지, 상수 등