String 클래스란? 자바에서 String 클래스는 가장 널리 사용되는 클래스 중 하나입니다. 문자열 시퀀스를 나타내며, 문자열을 조작하고, 비교하고, 변환하는 데 사용되는 다양한 메소드를 제공합니다. 자바의 문자열은 불변(immutable)으로, 한 번 생성된 String 객체의 값은 변경될 수 없습니다. 이러한 불변성은 문자열의 보안성과 효율성을 높이는 데 기여합니다.
String 클래스의 특징 자바의 String 클래스는 문자열을 처리하는데 필수적이며, 자바에서 문자열을 효율적으로 관리하기 위해 여러 특징들을 가지고 있습니다. 다음은 String 클래스의 주요 특징들을 설명한 것입니다.
1. 불변성 (Immutability) 정의: 문자열 객체가 생성된 후에는 그 내용을 변경할 수 없습니다. 이유: 보안: 불변 객체는 외부의 변화에 안전합니다. 성능: 문자열을 공유할 수 있어 메모리 효율성을 높입니다. 동기화: 불변 객체는 본질적으로 스레드 안전(Thread-safe)합니다. Java String str = "Hello" ;
str = str . concat ( " World" ); // 새로운 String 객체가 생성됨
Java 2. 문자열 리터럴 (String Literals) 정의: 문자열 리터럴은 소스 코드에서 직접 문자열 값을 지정하는 방법입니다. 특징: 문자열 리터럴은 자바의 문자열 풀(String Pool)에 저장됩니다. 동일한 리터럴은 동일한 객체를 참조합니다. Java String str1 = "Hello" ;
String str2 = "Hello" ;
System . out . println (str1 == str2); // true, 같은 객체 참조
Java 3. 문자열 풀 (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, 다른 객체
Java 4. 값 비교 (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, 같은 내용
Java 5. 불변성과 성능 (Immutability and Performance) 특징: 문자열 조작 시 새로운 문자열 객체를 생성합니다. 반복적인 문자열 변경 작업에서는 성능 문제가 발생할 수 있습니다. 이러한 문제를 해결하기 위해 StringBuilder 또는 StringBuffer를 사용합니다. Java String str = "Hello" ;
for ( int i = 0 ; i < 1000 ; i ++ ) {
str += " World" ;
}
// 위 코드는 성능이 좋지 않습니다.
Java 6. 문자 배열 (Character Array) 정의: 문자열은 내부적으로 문자 배열(char array)로 관리됩니다. 특징: String 객체의 내용을 변경할 수 없으므로, 내부 배열도 불변으로 유지됩니다. Java char [] chars = { 'H' , 'e' , 'l' , 'l' , 'o' } ;
String str = new String (chars) ;
System . out . println (str); // "Hello"
Java 7. 상속 구조 (Inheritance Structure) 정의: String 클래스는 Object 클래스를 직접 상속 받습니다. 특징: final 클래스로 선언되어 상속할 수 없습니다. 이는 String의 불변성을 보장하기 위함입니다. Java public final class String extends Object {
// 클래스 내용
}
Java 8. 문자열 인터닝 (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는 풀 내 객체
Java 9. 스레드 안전성 (Thread Safety) 특징: 불변성으로 인해 String 객체는 본질적으로 스레드 안전합니다. 여러 스레드에서 동일한 String 객체를 안전하게 공유할 수 있습니다. Java String sharedString = "Shared" ;
Runnable task = () -> {
System . out . println (sharedString);
} ;
new Thread (task) . start ();
new Thread (task) . start ();
Java 10. 유니코드 지원 (Unicode Support) 정의: 자바의 String 클래스는 유니코드를 지원합니다. 특징: 다양한 언어와 문자를 표현할 수 있습니다. UTF-16 인코딩을 사용하여 내부적으로 문자열을 관리합니다. Java String str = "안녕하세요" ;
System . out . println (str); // "안녕하세요"
Java String 클래스의 메소드 자바 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 클래스의 특징과 메소드를 잘 이해하고 활용하는 것은 자바 프로그래밍의 기본이자 필수적인 요소입니다.