[Java] 문자열(String) : 메서드, 형변환 및 StringBuilder & StringBuffer
2024. 3. 5. 17:52
반응형
Java에서는 문자열을 다룰 수 있는 다양한 메서드 및 기능들을 제공한다.
해당 기능들은 프로그래밍에서도 유용하게 사용할 수 있으며, 문자열을 다루는 것은 코딩 테스트를 비롯한 PS에서 빈출 문제이다.
문자열의 다양한 메서드들
1. 문자열 탐색 및 추출
String str = "Hello, world!";
char ch = str.charAt(1); // 'e'
int length = str.length(); // 13
String substr1 = str.substring(7); // "world!"
String substr2 = str.substring(7, 12); // "world"
int index1 = str.indexOf(","); // 5
int index2 = str.lastIndexOf("o"); // 8
boolean startsWith = str.startsWith("Hello"); // true
boolean endsWith = str.endsWith("world!"); // true
boolean contains = str.contains("world"); // true
boolean isEmpty = str.isEmpty(); // false
- charAt(int index): 해당 인덱스 위치의 문자를 반환
- length(): 문자열의 길이 반환
- substring(int beginIndex): 주어진 인덱스부터 끝까지의 부분 문자열을 반환
- substring(int beginIndex, int endIndex): 주어진 인덱스 범위의 부분 문자열을 반환
- indexOf(String str): 주어진 문자열이 처음으로 등장하는 위치의 인덱스를 반환
- lastIndexOf(String str): 주어진 문자열이 마지막으로 등장하는 위치의 인덱스를 반환
- startsWith(String prefix): 해당 접두사로 시작하는지 여부 반환
- endsWith(String suffix): 해당 접미사로 끝나는지 여부 반환
- contains(CharSequence s): 해당 문자열이 포함되어 있는지 여부 반환
- isEmpty(): 문자열이 비어 있는지 여부를 반환
2. 문자열 비교
String str1 = "hello";
String str2 = "HELLO";
boolean equals = str1.equals(str2); // false
boolean equalsIgnoreCase = str1.equalsIgnoreCase(str2); // true
int compare = str1.compareTo(str2); // 32 (대소문자 구분하여 비교)
int compareIgnoreCase = str1.compareToIgnoreCase(str2); // 0 (대소문자 구분 없이 비교)
- equals(Object obj): 주어진 문자열과 동일한지 여부를 반환
- equalsIgnoreCase(String anotherString): 대소문자를 무시하고 동일한지 여부를 반환
- compareTo(String anotherString): 현재 문자열과 주어진 문자열을 사전순으로 비교. 대소문자를 구분하여 비교하며, 같은 문자열이면 0을 반환. 정렬 기준으로 사용된다.
- compareToIgnoreCase(String str): 대소문자를 구분하지 않고 사전순으로 비교, 같은 문자열이면 0을 반환.
3. 문자열 변환
String str = "Hello, world!";
String lowerCase = str.toLowerCase(); // "hello, world!"
String upperCase = str.toUpperCase(); // "HELLO, WORLD!"
String trimmed = str.trim(); // "Hello, world!"
- toLowerCase(): 모든 문자를 소문자로 변환한 새로운 문자열을 반환
- toUpperCase(): 모든 문자를 대문자로 변환한 새로운 문자열을 반환
- trim(): 시작과 끝에서 공백을 제거한 새로운 문자열을 반환
4. 문자열 분할 (String -> String[])
String str = "Hello, world!";
String[] parts1 = str.split(", "); // ["Hello", "world!"]
String[] parts2 = str.split(" "); // ["Hello,", "world!"]
- split(String regex): 주어진 정규 표현식에 따라 문자열을 분할하고, 분할된 부분 문자열을 포함하는 배열 반환.
5. 문자열 조인 (String[] -> String)
String[] array = {"apple", "banana", "cherry"};
String join = String.join(", ", array); // "apple, banana, cherry"
String joinedString = String.join("-", "Java", "is", "fun"); // "Java-is-fun"
- join(CharSequence delimiter, CharSequence... elements): 주어진 구분자(delimiter)와 요소(elements)들로 구성된 문자열을 생성. 요소들은 구분자로 구분되어 결합된다.
6. 문자열 대체
String str = "Hello, world!";
String replacedPart = str.replaceFirst("l", "*"); // "He*lo, world!"
String replaced = str.replace("o", "0"); // "Hell0, w0rld!"
String replacedAll = str.replaceAll("[aeiou]", "*"); // "H*ll*, w*rld!"
- replaceFirst(String regex, String replacement): 정규 표현식과 일치하는 첫 번째 문자열을 주어진 문자열로 대체
- replace(CharSequence target, CharSequence replacement): 주어진 문자열과 일치하는 모든 문자열을 대체
- replaceAll(String regex, String replacement): 정규 표현식과 일치하는 모든 문자열을 주어진 문자열로 대체
String 형변환 방법들
char[] -> String
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
String str3 = new String(charArray); // "Hello"
String str4 = String.valueOf(charArray); // "Hello"
- String.valueOf(char[] array) : char[] -> String
- new String(char[] array)) : char[] -> String
String -> char[]
String str = "Hello";
char[] strTocharArray = str.toCharArray(); // ['H','e','l','l','o']
- toCharArray() : String -> char[]
String -> Int
String stringValue = "123";
int intValue = Integer.parseInt(stringValue);
String stringValue = "123";
int intValue = Integer.valueOf(stringValue);
- Integer.parseInt(stringValue) : int
- Integer.valueOf(stringValue) : int
Int -> String
int intValue = 123;
String stringValue = Integer.toString(intValue);
int intValue = 123;
String stringValue = String.valueOf(intValue);
- Integer.toString(intValue) : String
- String.valueOf(intValue) : String
String -> String[]
String str = "Hello, world!";
String[] parts1 = str.split(", "); // ["Hello", "world!"]
String[] -> String
String[] array = {"apple", "banana", "cherry"};
String join = String.join(", ", array); // "apple, banana, cherry"
StringBuilder와 StringBuffer
문자열을 동적으로 조작할 수 있는 클래스. String과 달리 가변적(mutable)이며, 문자열의 추가, 수정, 삭제 등의 작업을 효율적으로 처리할 수 있다.
- StringBuffer: Thread-Safe. 즉, 여러 스레드에서 동시에 접근하여 수정해도 안전하다. 메서드에 synchronized 키워드가 지정되어 있어, 동기화된 메서드 호출로 인해 성능이 조금 떨어질 수 있다. 멀티 스레드 환경에서의 안전한 문자열 조작 시 사용된다.
- StringBuilder: 스레드에 안전하지 않은 대신 StringBuffer보다 더 빠르게 동작한다. 단일 스레드 환경에서만 사용해야 한다.
StringBuilder는 코딩 테스트(PS)에서 String 대신 사용하기 유리하다.
- String은 Immutable 클래스이므로 문자열을 수정하면 새로운 String 객체가 생성된다. 하지만 StringBuilder는 가변적이므로 문자열을 직접 수정할 수 있다.
- String의 불변성은 메모리 사용량을 높일 수 있다. 반복적인 문자열 조작 작업을 한다면 매번 새로운 String 객체를 생성해야 한다. 반면 StringBuilder는 내부 버퍼를 사용하여 문자열을 동적으로 조작하므로 메모리 사용량을 최적화할 수 있다.
- 코딩 테스트 환경은 일반적으로 싱글 스레드 환경이므로 StringBuffer보다 StringBuilder 사용이 성능 면에서 유리하다.
사용법
// StringBuilder 객체 생성
StringBuilder sbu = new StringBuilder();
sbu.append("Hello"); // 문자열 추가 -> "Hello"
sbu.insert(5, ", world!"); // 문자열 삽입 -> "Hello, world!"
sbu.delete(0, 7); // 문자열 삭제 -> "world!"
sbu.replace(0, 3, "co"); // 문자열 대체 -> "cold!"
String sbuString = sbu.toString(); // StringBuilder의 문자열 -> "cold!"
// StringBuffer 객체 생성
StringBuffer sbf = new StringBuffer();
sbf.append("Hello"); // 문자열 추가 -> "Hello"
sbf.insert(5, ", world!"); // 문자열 삽입 -> "Hello, world!"
sbf.delete(0, 7); // 문자열 삭제 -> "world!"
sbf.replace(0, 3, "co"); // 문자열 대체 -> "cold!"
String sbfString = sbu.toString(); // StringBuffer 문자열 -> "cold!"
append(), insert(), delete(), replace() : 문자열 추가, 삽입, 삭제, 대체
반응형
'Backend > Java' 카테고리의 다른 글
[Java] 정렬(Sorting) : Comparator과 Comparable (0) | 2024.03.07 |
---|---|
[Java] Collection(컬렉션) : 자료구조 및 시간복잡도 관점으로 보기 (1) | 2024.03.07 |
[Java] Stream API 사용하기 (1) | 2024.02.25 |
[Java] 람다식(Lambda Expression)과 함수형 프로그래밍 (1) | 2024.02.25 |
[Java] 내부 클래스(Inner Class) (멤버, 정적, 지역, 익명 내부 클래스) (0) | 2024.02.25 |