반응형

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)이며, 문자열의 추가, 수정, 삭제 등의 작업을 효율적으로 처리할 수 있다.

  1. StringBuffer: Thread-Safe. 즉, 여러 스레드에서 동시에 접근하여 수정해도 안전하다. 메서드에 synchronized 키워드가 지정되어 있어, 동기화된 메서드 호출로 인해 성능이 조금 떨어질 수 있다. 멀티 스레드 환경에서의 안전한 문자열 조작 시 사용된다.
  2. StringBuilder: 스레드에 안전하지 않은 대신  StringBuffer보다 더 빠르게 동작한다. 단일 스레드 환경에서만 사용해야 한다.

 

StringBuilder는 코딩 테스트(PS)에서 String 대신 사용하기 유리하다.

  1. String은 Immutable 클래스이므로 문자열을 수정하면 새로운 String 객체가 생성된다. 하지만 StringBuilder는 가변적이므로 문자열을 직접 수정할 수 있다.
  2. String의 불변성은 메모리 사용량을 높일 수 있다. 반복적인 문자열 조작 작업을 한다면 매번 새로운 String 객체를 생성해야 한다. 반면 StringBuilder는 내부 버퍼를 사용하여 문자열을 동적으로 조작하므로 메모리 사용량을 최적화할 수 있다.
  3. 코딩 테스트 환경은 일반적으로 싱글 스레드 환경이므로 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() : 문자열 추가, 삽입, 삭제, 대체

 

 

 

 

반응형

BELATED ARTICLES

more