내 Java 노트: String 이해하기

발행: (2026년 2월 5일 오후 02:19 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

번역을 진행하려면 실제 텍스트 내용이 필요합니다. 위에 제공된 링크만으로는 본문을 확인할 수 없으니, 번역하고자 하는 전체 텍스트를 복사해서 알려주시면 한국어로 번역해 드리겠습니다.

Java에서 문자열이란?

Java에서 String은 문자들의 시퀀스로, java.lang.String 클래스의 객체입니다.

예시

String name = "Java";

여기서 "Java"는 문자열 리터럴입니다.

문자열을 만드는 방법

문자열 리터럴 사용

String s1 = "Hello";
  • String Constant Pool(SCP)에 저장됨
  • 메모리 효율적

new 키워드 사용

String s2 = new String("Hello");
  • 힙에 새로운 객체를 생성하며, SCP와 독립적임

문자열이 불변인 이유는?

Java에서 String 객체는 생성된 후에 변경할 수 없습니다. 문자열을 수정하는 것처럼 보이는 모든 연산은 실제로 새로운 String 객체를 생성합니다.

예시

String s = "Java";
s = s.concat(" Programming"); // a new String is created

String Constant Pool (SCP)

SCP는 문자열 리터럴을 저장하는 힙의 특수 영역입니다. 리터럴이 생성될 때 JVM은 다음을 확인합니다:

  • SCP에 동일한 문자열이 이미 존재하면 → 재사용
  • 그렇지 않으면 → SCP에 새로운 객체를 생성

Example

String s1 = "Java";
String s2 = "Java"; // s1과 s2는 같은 객체를 참조합니다
String s3 = new String("Java"); // 힙에 별도의 객체가 생성됩니다

왜 SCP가 중요한가?

  • 중복 객체를 피함으로써 메모리를 절약합니다
  • 기존 문자열을 재사용하여 성능을 향상시킵니다

Advantages of the String Constant Pool

  • 동일한 리터럴을 하나만 저장
  • 메모리 사용량 감소
  • 문자열 리터럴(==) 비교가 더 빠름
  • 불변성으로 인한 보안 향상
  • JVM에 의해 자동 관리

문자열 상수 풀의 단점

  • 문자열은 불변이므로 빈번한 수정이 비용이 많이 듭니다
  • 과도한 리터럴은 힙 사용량을 증가시킬 수 있습니다
  • 문자열을 생성할 때 JVM 검사의 약간의 오버헤드가 있습니다
  • StringBuilder 또는 StringBuffer에 비해 가변 연산에서 유연성이 떨어집니다

Java에서 흔히 사용되는 문자열 메서드

length()

문자열의 길이를 반환합니다.

String s = "Java";
System.out.println(s.length()); // 4

charAt(int index)

지정된 인덱스에 있는 문자를 반환합니다.

System.out.println(s.charAt(1)); // a

equals(String another)

두 문자열의 내용을 비교합니다.

String a = "Java";
String b = "Java";
System.out.println(a.equals(b)); // true

equalsIgnoreCase(String another)

대소문자를 무시하고 문자열을 비교합니다.

System.out.println(a.equalsIgnoreCase("java")); // true

compareTo(String another)

문자열을 사전식으로 비교합니다.

System.out.println("Java".compareTo("Java")); // 0

toUpperCase()

문자열을 대문자로 변환합니다.

System.out.println("java".toUpperCase()); // JAVA

toLowerCase()

문자열을 소문자로 변환합니다.

System.out.println("JAVA".toLowerCase()); // java

trim()

앞뒤 공백을 제거합니다.

String s = "  Java  ";
System.out.println(s.trim()); // "Java"

contains(CharSequence s)

문자열에 주어진 시퀀스가 포함되어 있는지 확인합니다.

System.out.println("Java Programming".contains("Java")); // true

startsWith(String prefix)

문자열이 지정된 접두사로 시작하는지 확인합니다.

System.out.println("Java".startsWith("Ja")); // true

endsWith(String suffix)

문자열이 지정된 접미사로 끝나는지 확인합니다.

System.out.println("Java".endsWith("va")); // true

substring(int beginIndex)

beginIndex부터 시작하는 부분 문자열을 반환합니다.

System.out.println("Java".substring(1)); // "ava"

substring(int beginIndex, int endIndex)

지정된 인덱스 사이의 부분 문자열을 반환합니다.

System.out.println("Java".substring(1, 3)); // "av"

replace(char oldChar, char newChar)

문자를 교체합니다.

System.out.println("Java".replace('a', 'o')); // "Jovo"

split(String regex)

주어진 정규 표현식을 기준으로 문자열을 배열로 분할합니다.

String[] words = "Java is easy".split(" ");
Back to Blog

관련 글

더 보기 »

Java 노트

터미널에서 Java 실행하기 ```bash javac App.java && java App ``` `javac`는 Java 소스 파일 `App.java`를 바이트코드 `App.class`로 컴파일합니다. `&&` 연산자는 첫 번째 명령이 성공적으로 실행된 경우에만 두 번째 명령을 실행합니다.

SPRING BOOT 예외 처리

Java & Spring Boot 예외 처리 노트 1. Exception이란? Exception = 프로그램의 정상 흐름을 방해하는 원하지 않는 상황. 예외 처리의 목표...

Day-3 클래스와 객체 상세

Class - Class는 Java 키워드입니다 - Class는 템플릿입니다 - Class는 논리적 엔티티입니다 - 클래스 이름의 첫 글자는 대문자 CamelCase이어야 합니다, 예: SalaryAcc...