[JAVA] 12-5. String 클래스의 특징 및 메서드 종류

Re_Go·2024년 6월 3일
1

JAVA

목록 보기
21/37
post-thumbnail

1. 기본 타입인 문자와 다른 String 클래스

이전에는 기본 데이터 섹션에서와 참조 데이터 섹션을 이 둘의 차이점을 설명해 보았는데요.

그리고 이를 잘 설명할 수 있는 타입들은 char(기본 데이터 타입)와 String(참조 데이터 타입)인데, 이 섹션에서는 그 중 참조 데이터 타입인 String 클래스에 대해서 알아보도록 하겠습니다.

String 클래스는 말 그대로 '문자열'의 처리와 관련된 클래스인데요. 이는 자바에서는 String 클래스의 데이터 보관 방식을 문자 배열의 집합(char[]) 형식으로 보관을 하기 때문에 가능한 것입니다.

그래서 String 클래스의 메서드인 chatAt(), toLowerCase(), toUpperCase(), trim() 뿐만 아니라 배열 메서드에서도 사용되는 length(), substring(), sort() 등과 같은 배열 메서드도 사용이 가능한 것이죠.

2. 기본 사용 메서드들

다음은 자바에서 String 클래스에 사용 가능한 메서드들 입니다.

length()

문자열의 길이를 출력할 때 사용합니다.

String words = "Hello World";
int len = words.length();  // 결과: 11 출력

charAt(int index)

문자열의 특정 문자에 대한 인덱스를 출력할 때 사용합니다.

char ch = words.charAt(0);  // 결과: 'H'

substring(int beginIndex, int endIndex)

문자열의 특정 인덱스 범위를 지정하여 추출합니다. 이때 원본 문자열은 변경되지 않습니다. 또한 endIndex를 지정하지 않을 경우 시작 인덱스부터 인덱스의 끝까지의 문자를 추출합니다.

String subStr = words.substring(0, 5);  // 결과: "Hello"

contains(CharSequence s)

문자열에서 특정 문자의 존재 여부를 검색할 때 사용되며, 그 결과값을 boolean 형태로 반환합니다. 대소문자를 가리지 않고 검색하므로 검새에 주의해야 합니다.

boolean contains = words.contains("World");  // 결과: true

equalsIgnoreCase(String anotherString)

equals 메서드의 검색 방법을 탈피한 클래스로 대소문자 구분 없이 매개변수의 문자와 대상 간의 문자값이 같은지 다른지에 대한 여부를 boolean 값으로 반환합니다.

String words = "Hello World";
boolean isEqual = words.equalsIgnoreCase("hello world");  // 결과: true

compareTo(String anotherString)

대소문자를 구별하여 문자열을 비교하는데, 첫번째 다른 부분에서 유니코드의 차이만큼을 정수형 타입으로 반환합니다.

String words = "Hello World";
int result1 = words.compareTo("Hello World");  // 결과: 0 (같음)
int result2 = words.compareTo("Hello Yprld");  // 결과: 양수 (words가 더 큼)
System.out.println(result1 + ", " + result2); // W는 Y보다 앞서있으므로 유니코드의 값의 차이만큼인 -2를 반환합니다.

compareToIgnoreCase(String str)

대소문자 여부를 무시하고 문자열을 비교하여 다른 부분이 등장할 때 그 결과값을 boolean 값으로 반환합니다.

String words = "Hello World";
boolean result1 = words.equalsIgnoreCase("Hello World");  // 결과: true (같음)
boolean result2 = words.equalsIgnoreCase("Hello Yprld");  // 결과: false (words가 더 큼)
System.out.println(result1 + ", " + result2); // 다른 문자열이 존재하므로 result2의 값은 false를 반환합니다.

startsWith(String prefix), endsWith(String suffix)

문자열의 접두사와 접미사가 해당 매개 변수로 시작하는지의 여부를 검색할 때 사용되는 메서드 입니다. 이때 검색 조건은 대소문자를 구분하며, 공백을 포함하여 검색되며 그 결과값을 boolean 값으로 반환합니다.

String words = "Hello World";
boolean startsWithHello1 = words.startsWith("Hello");
boolean startsWithHello2 = words.startsWith("hello");
boolean startsWithHello3 = words.startsWith(" hello");
System.out.println(startsWithHello1); // 출력: true
System.out.println(startsWithHello2); // 출력: 대소문자를 구별함 false
System.out.println(startsWithHello3); // 출력: 공백 여부까지 판단함 false

trim()

문자열의 앞뒤 공백을 제거합니다. 앞서 소개한 startsWith와 endsWith 메서드를 사용하기 전에 대상 문자의 앞뒤 공백을 trim 메서드로 제거한 후 비교할 수 있습니다. 단 원본 문자열 값은 달라지지 않기 때문에 반환 된 결과를 담고 있는 새로운 변수를 사용해야 합니다.

String words = " Hello World ";
String anotherWorlds = words.trim(); // 양쪽 공백이 모두 제거된 "Hello World"가 anotherWorlds 변수에 담깁니다.
boolean startsWithHello1 = anotherWorlds.startsWith("Hello"); true값 반환

split(String regex)

문자열을 매개 변수를 기준으로 분리하여 그 결과값을 배열 집합의 값으로 반환하는 메서드 입니다. 이때 매개 변수는 여러개의 값을 넣을 수 있습니다.

String words = "Hello, World! Java?";
String[] parts = words.split("[,.!?]"); // 콤마, 닷, 느낌표, 물음표를 기준으로 각각 분리하므로 ["Hello", "World", "Java"] 형태로 반환됩니다.

toUpperCase(), toLowerCase()

문자열의 값들 중 소문자를 대문자로, 대문자를 소문자로 각각 변환하여 새로운 값으로 반환하는 메서드 입니다.

String words = "Hello World"
String upperWord = words.toUpperCase(); // "HELLO WORLD" 반환
String lowerWord = words.toLowerCase(); // "hello world" 반환

join(delimiter, String[])

배열의 요소들을 공백과 이스케이프 시퀸스를 포함한 구분자를 기준으로 문자들을 조합하며, 구분자가 없을 경우 각 요소들을 연속해서 저장합니다.

String[] words = {"Java", "Python", "C++", "JavaScript"};
String result = String.join("-", words);
System.out.println(result); // "Java-Python-C++-JavaScript" 출력

3. StringBuilder

위에서 기본적인 String 클래스의 메서드들의 사용법을 알아보았을 때 눈치 채셨겠지만, 자바에서는 String 클래스로 생성된 값들은 변경할 수 없습니다.그래서 String은 참조 타입임에도 불구하고 래퍼 클래스들과 같이 불변한 값을 내포하고 있음을 의미하기도 하는데요. 그 말인 즉 일일이 새로운 값을 반환 받아야 한다는 뜻이기도 하죠. 새로운 String 객체가 생성되고 이전 객체는 버려지는 작업인 만큼 비효율적이겠죠?

그래서 자바에서는 StringBuilder라는 클래스로 원본 값을 변경할 수 있는 문자열 값을 생성할 수 있는데요. 실제로 문자열 변경 작업이 잦은 코드 구간에는 String 클래스보다 StringBuilder 클래스를 사용합니다.

원리는 불변한 객체를 생성하는 String 클래스와는 다르게 가변이 가능한 내부 버퍼 형식의 StringBuilder 객체를 생성하여 해당 객체 내부에 문자열을 저장해 둔 뒤 그 안에서 값을 조작할 수 있는 것이죠.

public class StringBuilderExample {
    public static void main(String[] args) {
        // StringBuilder 생성
        StringBuilder sb = new StringBuilder();

        // append 메서드: 문자열 추가
        sb.append("Hello");

        // insert 메서드: 지정된 위치에 문자열 삽입
        sb.insert(5, " World");

        // delete 메서드: 지정된 범위의 문자열 삭제
        sb.delete(5, 11);

        // replace 메서드: 지정된 범위의 문자열을 새로운 문자열로 대체
        sb.replace(0, 5, "Hi");

        // toString 메서드: StringBuilder를 String으로 변환
        String result = sb.toString();

        // 결과 출력
        System.out.println(result);  // 출력: "Hi World"
    }
}

4. StringBuffer

StringBuffer는 앞서 소개한 StringBuilder와 같이 문자열을 수정할 수 있다는 특징은 동일한데요. 다만 StringBuilder는 단일 스레드 환경에서 StringBuffer보다 높은 안전성과 효율성을 가지는 반면,StringBuffer는 멀티 스레드 환경에서 StringBuilder보다 안전성과 효율이 좋다는 점만 기억해 주시면 됩니다.

그 외 메서드는 거의 동일하고요.

public class StringBufferExample  {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();
	
		sb.append("Hello");
		sb.append("Java").append("World");
		
		sb.delete(0, 3); // 시작 인덱스부터 끝 인덱스 까지 삭제
		sb.deleteCharAt(5); // 특정 문자열을 삭제
		
		System.out.println(sb);
	}
}

5. StringTokenizer

또한 자바에서는 복잡한 정규식의 결과를 도출하기보다, 단순하게 한 종류의 구분자로 각각의 값들을 분리해야 하는 작업에는 StringTokenizer 클래스를 사용하는 것이 효율적인데요.

특정 부분의 문자열 추출이 요구되는 작업을 수행하는 자바 특성상 StringTokenizer 클래스 또한 자주 사용되는 클래스 중 하나입니다.

String str = "apple,banana,grape,orange";

// 쉼표(,)를 구분자로 사용하여 StringTokenizer 객체 생성
StringTokenizer tokenizer = new StringTokenizer(str, ",");

// 토큰 개수 확인
int tokenCount = tokenizer.countTokens();
System.out.println("Total tokens: " + tokenCount);

// hasMoreTokens 메서드를 사용하여 토큰이 있는지 확인하고, 있을 때만 반복문 실행
while (tokenizer.hasMoreTokens()) {
    // 다음 토큰을 가져와서 출력
    String token = tokenizer.nextToken();
    System.out.println(token);
}
profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글