내 Java 노트: String 이해하기
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(" ");