String 클래스란?
자바에서 String 클래스는 가장 널리 사용되는 클래스 중 하나입니다. 문자열 시퀀스를 나타내며, 문자열을 조작하고, 비교하고, 변환하는 데 사용되는 다양한 메소드를 제공합니다. 자바의 문자열은 불변(immutable)으로, 한 번 생성된 String 객체의 값은 변경될 수 없습니다. 이러한 불변성은 문자열의 보안성과 효율성을 높이는 데 기여합니다.
String 클래스의 특징
자바의 String 클래스는 문자열을 처리하는데 필수적이며, 자바에서 문자열을 효율적으로 관리하기 위해 여러 특징들을 가지고 있습니다. 다음은 String 클래스의 주요 특징들을 설명한 것입니다.
1. 불변성 (Immutability)
- 정의: 문자열 객체가 생성된 후에는 그 내용을 변경할 수 없습니다.
- 이유:
- 보안: 불변 객체는 외부의 변화에 안전합니다.
- 성능: 문자열을 공유할 수 있어 메모리 효율성을 높입니다.
- 동기화: 불변 객체는 본질적으로 스레드 안전(Thread-safe)합니다.
Java
String str = "Hello";
str = str.concat(" World"); // 새로운 String 객체가 생성됨
Java2. 문자열 리터럴 (String Literals)
- 정의: 문자열 리터럴은 소스 코드에서 직접 문자열 값을 지정하는 방법입니다.
- 특징:
- 문자열 리터럴은 자바의 문자열 풀(String Pool)에 저장됩니다.
- 동일한 리터럴은 동일한 객체를 참조합니다.
Java
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // true, 같은 객체 참조
Java3. 문자열 풀 (String Pool)
- 정의: 문자열 풀은 자바 힙 메모리 내에 있는 특수한 저장소로, 문자열 리터럴을 저장합니다.
- 특징:
- 메모리 절약: 동일한 문자열 리터럴은 하나의 객체로 관리됩니다.
- 성능 향상: 문자열 비교 시 빠른 비교가 가능합니다.
Java
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // true, 같은 풀 내 객체
System.out.println(str1 == str3); // false, 다른 객체
Java4. 값 비교 (Value Comparison)
- 정의: 문자열의 값을 비교할 때는 equals() 메소드를 사용합니다.
- 특징:
==
연산자는 객체의 참조를 비교합니다.- equals() 메소드는 문자열의 내용을 비교합니다.
Java
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println(str1 == str2); // false, 다른 객체
System.out.println(str1.equals(str2)); // true, 같은 내용
Java5. 불변성과 성능 (Immutability and Performance)
- 특징:
- 문자열 조작 시 새로운 문자열 객체를 생성합니다.
- 반복적인 문자열 변경 작업에서는 성능 문제가 발생할 수 있습니다.
- 이러한 문제를 해결하기 위해 StringBuilder 또는 StringBuffer를 사용합니다.
Java
String str = "Hello";
for (int i = 0; i < 1000; i++) {
str += " World";
}
// 위 코드는 성능이 좋지 않습니다.
Java6. 문자 배열 (Character Array)
- 정의: 문자열은 내부적으로 문자 배열(char array)로 관리됩니다.
- 특징:
- String 객체의 내용을 변경할 수 없으므로, 내부 배열도 불변으로 유지됩니다.
Java
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars);
System.out.println(str); // "Hello"
Java7. 상속 구조 (Inheritance Structure)
- 정의: String 클래스는 Object 클래스를 직접 상속 받습니다.
- 특징:
- final 클래스로 선언되어 상속할 수 없습니다.
- 이는 String의 불변성을 보장하기 위함입니다.
Java
public final class String extends Object {
// 클래스 내용
}
Java8. 문자열 인터닝 (String Interning)
- 정의: intern() 메소드를 사용하여 문자열을 풀에 추가할 수 있습니다.
- 특징:
- 이미 풀에 존재하는 문자열과 동일한 내용을 가지는 문자열 객체를 풀 내의 객체로 대체합니다.
- 메모리 효율성을 높입니다.
Java
String str1 = new String("Hello");
String str2 = str1.intern();
System.out.println(str1 == str2); // false, str1은 풀 외부 객체
System.out.println("Hello" == str2); // true, str2는 풀 내 객체
Java9. 스레드 안전성 (Thread Safety)
- 특징:
- 불변성으로 인해 String 객체는 본질적으로 스레드 안전합니다.
- 여러 스레드에서 동일한 String 객체를 안전하게 공유할 수 있습니다.
Java
String sharedString = "Shared";
Runnable task = () -> {
System.out.println(sharedString);
};
new Thread(task).start();
new Thread(task).start();
Java10. 유니코드 지원 (Unicode Support)
- 정의: 자바의 String 클래스는 유니코드를 지원합니다.
- 특징:
- 다양한 언어와 문자를 표현할 수 있습니다.
- UTF-16 인코딩을 사용하여 내부적으로 문자열을 관리합니다.
Java
String str = "안녕하세요";
System.out.println(str); // "안녕하세요"
JavaString 클래스의 메소드
자바 String 클래스는 문자열을 조작하는 데 유용한 다양한 메소드를 제공합니다. 이 섹션에서는 String 클래스의 주요 메소드들을 설명합니다.
length()
- 설명: 문자열의 길이를 반환합니다.
- 반환값: 문자열의 문자 수를 나타내는 정수(int) 값.
- 예시: “Hello World”.length()는 11을 반환합니다.
charAt(int index)
- 설명: 지정된 인덱스의 문자를 반환합니다.
- 매개변수: index – 반환할 문자의 인덱스(0부터 시작).
- 반환값: 지정된 인덱스에 위치한 문자(char).
- 예시: “Hello”.charAt(1)은 ‘e’를 반환합니다.
substring(int beginIndex)
- 설명: 지정된 시작 인덱스부터 문자열의 끝까지 부분 문자열을 반환합니다.
- 매개변수: beginIndex – 시작 인덱스(포함).
- 반환값: 지정된 인덱스부터 끝까지의 부분 문자열.
- 예시: “Hello World”.substring(6)은 “World”를 반환합니다.
substring(int beginIndex, int endIndex)
- 설명: 지정된 범위의 부분 문자열을 반환합니다.
- 매개변수:
- beginIndex – 시작 인덱스(포함).
- endIndex – 끝 인덱스(미포함).
- 반환값: 지정된 시작 인덱스부터 끝 인덱스 전까지의 부분 문자열.
- 예시: “Hello World”.substring(0, 5)는 “Hello”를 반환합니다.
concat(String str)
- 설명: 두 문자열을 결합합니다.
- 매개변수: str – 결합할 문자열.
- 반환값: 원래 문자열에
str
이 결합된 새로운 문자열. - 예시: “Hello”.concat(“World”)는 “HelloWorld”를 반환합니다.
indexOf(String str)
- 설명: 지정된 문자열이 처음으로 등장하는 인덱스를 반환합니다.
- 매개변수: str – 찾고자 하는 문자열.
- 반환값: 지정된 문자열이 처음으로 등장하는 인덱스, 찾을 수 없으면 -1.
- 예시: “Hello World”.indexOf(“World”)는 6을 반환합니다.
indexOf(String str, int fromIndex)
- 설명: 지정된 문자열이 주어진 인덱스 이후로 처음 등장하는 위치를 반환합니다.
- 매개변수:
- str – 찾고자 하는 문자열.
- fromIndex – 검색을 시작할 인덱스.
- 반환값: 지정된 문자열이 fromIndex 이후로 처음 등장하는 인덱스, 찾을 수 없으면 -1.
- 예시: “Hello World Hello”.indexOf(“Hello”, 6)는 12를 반환합니다.
lastIndexOf(String str)
- 설명: 지정된 문자열이 마지막으로 등장하는 인덱스를 반환합니다.
- 매개변수: str – 찾고자 하는 문자열.
- 반환값: 지정된 문자열이 마지막으로 등장하는 인덱스, 찾을 수 없으면 -1.
- 예시: “Hello World Hello”.lastIndexOf(“Hello”)는 12를 반환합니다.
lastIndexOf(String str, int fromIndex)
- 설명: 지정된 문자열이 주어진 인덱스 이전으로 마지막 등장하는 위치를 반환합니다.
- 매개변수:
- str – 찾고자 하는 문자열.
- fromIndex – 검색을 시작할 인덱스.
- 반환값: 지정된 문자열이 fromIndex 이전으로 마지막 등장하는 인덱스, 찾을 수 없으면 -1.
- 예시: “Hello World Hello”.lastIndexOf(“Hello”, 10)는 0을 반환합니다.
equals(Object anObject)
- 설명: 이 문자열과 지정된 객체가 같은지 비교합니다.
- 매개변수: anObject – 비교할 객체.
- 반환값: 문자열이 동일하면 true, 그렇지 않으면 false.
- 예시: “Hello”.equals(new String(“Hello”))는
true
를 반환합니다.
equalsIgnoreCase(String anotherString)
- 설명: 이 문자열과 다른 문자열이 대소문자 구분 없이 같은지 비교합니다.
- 매개변수: anotherString – 비교할 문자열.
- 반환값: 대소문자 구분 없이 문자열이 동일하면 true, 그렇지 않으면 false.
- 예시: “Hello”.equalsIgnoreCase(“hello”)는 true를 반환합니다.
compareTo(String anotherString)
- 설명: 사전순으로 두 문자열을 비교합니다.
- 매개변수: anotherString – 비교할 문자열.
- 반환값: 이 문자열이 anotherString보다 작으면 음수, 같으면 0, 크면 양수.
- 예시: “Hello”.compareTo(“World”)는 음수를 반환합니다.
compareToIgnoreCase(String str)
- 설명: 대소문자를 무시하고 두 문자열을 사전순으로 비교합니다.
- 매개변수: str – 비교할 문자열.
- 반환값: 이 문자열이 str보다 작으면 음수, 같으면 0, 크면 양수.
- 예시: “Hello”.compareToIgnoreCase(“hello”)는 0을 반환합니다.
toLowerCase()
- 설명: 문자열을 소문자로 변환하여 반환합니다.
- 반환값: 소문자로 변환된 새로운 문자열.
- 예시: “Hello World”.toLowerCase()는 “hello world”를 반환합니다.
toUpperCase()
- 설명: 문자열을 대문자로 변환하여 반환합니다.
- 반환값: 대문자로 변환된 새로운 문자열.
- 예시: “Hello World”.toUpperCase()는 “HELLO WORLD”를 반환합니다.
trim()
- 설명: 문자열의 양쪽 끝에 있는 공백을 제거합니다.
- 반환값: 앞뒤 공백이 제거된 새로운 문자열.
- 예시: ” Hello World “.trim()는 “Hello World”를 반환합니다.
replace(char oldChar, char newChar)
- 설명: 문자열 내의 모든 특정 문자를 새로운 문자로 대체합니다.
- 매개변수:
- oldChar – 기존 문자.
- newChar – 대체할 새로운 문자.
- 반환값: 대체된 새로운 문자열.
- 예시: “Hello”.replace(‘l’, ‘p’)는 “Heppo”를 반환합니다.
replace(CharSequence target, CharSequence replacement)
- 설명: 문자열 내의 모든 특정 문자 시퀀스를 새로운 시퀀스로 대체합니다.
- 매개변수:
- target – 기존 시퀀스.
- replacement – 대체할 새로운 시퀀스.
- 반환값: 대체된 새로운 문자열.
- 예시: “Hello World”.replace(“World”, “Java”)는 “Hello Java”를 반환합니다.
split(String regex)
- 설명: 지정된 정규 표현식을 기준으로 문자열을 분할합니다.
- 매개변수: regex – 분할할 기준이 되는 정규 표현식.
- 반환값: 분할된 문자열 배열.
- 예시: “one,two,three”.split(“,”)는 [“one”, “two”, “three”] 배열을 반환합니다.
split(String regex, int limit)
- 설명: 지정된 정규 표현식을 기준으로 문자열을 분할하되, 분할 횟수를 제한합니다.
- 매개변수:
- regex – 분할할 기준이 되는 정규 표현식.
- limit – 분할할 최대 횟수.
- 반환값: 분할된 문자열 배열.
- 예시: “one,two,three”.split(“,”, 2)는 [“one”, “two,three”] 배열을 반환합니다.
join(CharSequence delimiter, CharSequence… elements)
- 설명: 지정된 구분자를 사용하여 문자열 배열을 하나의 문자열로 결합합니다.
- 매개변수:
- delimiter – 요소를 결합할 때 사용할 구분자.
- elements – 결합할 문자열 요소들.
- 반환값: 결합된 새로운 문자열.
- 예시: String.join(“-“, “one”, “two”, “three”)는 “one-two-three”를 반환합니다.
contains(CharSequence s)
- 설명: 문자열이 특정 시퀀스를 포함하는지 확인합니다.
- 매개변수: s – 포함 여부를 확인할 문자 시퀀스.
- 반환값: 포함하면 true, 그렇지 않으면 false.
- 예시: “Hello World”.contains(“World”)는 true를 반환합니다.
startsWith(String prefix)
- 설명: 문자열이 지정된 접두사로 시작하는지 확인합니다.
- 매개변수: prefix – 확인할 접두사.
- 반환값: 접두사로 시작하면 true, 그렇지 않으면 false.
- 예시: “Hello World”.startsWith(“Hello”)는 true를 반환합니다.
startsWith(String prefix, int toffset)
- 설명: 문자열의 지정된 인덱스에서 시작하여, 지정된 접두사로 시작하는지 확인합니다.
- 매개변수:
- prefix – 확인할 접두사.
- toffset – 시작 인덱스.
- 반환값: 접두사로 시작하면 true, 그렇지 않으면 false.
- 예시: “Hello World”.startsWith(“World”, 6)는 true를 반환합니다.
endsWith(String suffix)
- 설명: 문자열이 지정된 접미사로 끝나는지 확인합니다.
- 매개변수: suffix – 확인할 접미사.
- 반환값: 접미사로 끝나면 true, 그렇지 않으면 false.
- 예시: “Hello World”.endsWith(“World”)는 true를 반환합니다.
toCharArray()
- 설명: 문자열을 문자 배열로 변환하여 반환합니다.
- 반환값: 문자열의 문자 배열.
- 예시: “Hello”.toCharArray()는 [‘H’, ‘e’, ‘l’, ‘l’, ‘o’] 배열을 반환합니다.
format(String format, Object… args)
- 설명: 지정된 형식 문자열과 인수를 사용하여 형식화된 문자열을 반환합니다.
- 매개변수:
- format – 형식 문자열.
- args – 형식 문자열에 대한 인수들.
- 반환값: 형식화된 새로운 문자열.
- 예시: String.format(“Hello, %s!”, “World”)는 “Hello, World!”를 반환합니다.
valueOf(Object obj)
- 설명: 지정된 객체의 문자열 표현을 반환합니다.
- 매개변수: obj – 문자열 표현을 반환할 객체.
- 반환값: 객체의 문자열 표현.
- 예시: String.valueOf(123)는 “123”을 반환합니다.
결론
자바의 String 클래스는 프로그래밍에서 매우 중요한 역할을 하며, 문자열 조작을 위한 다양한 메소드를 제공합니다. 문자열의 불변성은 보안성, 성능 및 스레드 안전성을 높이는 데 기여합니다. 문자열 리터럴과 문자열 풀을 활용한 메모리 관리, 문자열 비교 및 조작을 위한 다양한 메소드들은 효율적이고 안전한 문자열 처리를 가능하게 합니다. 따라서, String 클래스의 특징과 메소드를 잘 이해하고 활용하는 것은 자바 프로그래밍의 기본이자 필수적인 요소입니다.