프로그래밍/JAVA

[JAVA] String과 StringBuilder 클래스에 적용 가능한 메서드

연유뿌린빙수 2024. 9. 15. 18:25

Java의 String 클래스

 

String 클래스는 문자열을 다루기 위한 다양한 메서드들을 제공해준다.

 

String 객체는 불변 객체이기 때문에, 문자열을 변경하는 메서드를 호출하더라도 실제로는 새로운 String 객체가 생성되어 반환된다.

 

기본 메서드(길이 관련)

- length() : 문자열의 길이 (문자 개수)를 반환

 

배열에서도 length가 쓰여서 헷갈릴 수도 있다.

배열의 legnth는 속성(property)이지만, 문자열의 length는 메서드라는 점을 기억해두자.

 

- charAt(int index) : 지정한 인덱스에 해당하는 문자를 반환

 

 

문자열 자리 찾기

- indexOf(String str) : 문자열 내에서 지정한 문자열이 처음 등장하는 위치의 인덱스를 반환, 존재하지 않으면 -1을 반환

 

- lastIndexOf(String str) : 문자열 내에서 지정한 문자열이 마지막으로 등장하는 위치의 인덱스를 반환한다.

 

 

문자열 객체 비교

- equals(Object anObject) : 두 문자열의 내용이 같은지 비교를 하는 String의 비교 메서드이다. (== 은 주소 비교이므로 원시 타입 객체) ( 문자에 대한 내용만 같으면 됨!)

 

- equalsIgnoreCase(String anotherString) : 대소문자를 구분하지 않고 문자열을 비교

 

- contains(CharSequence s) : 특정 문자열을 포함하고 있는지에 대한 여부를 boolean 값으로 반환

 

- startsWith(String prefix) : 지정한 접두사로 시작하는지를 확인

 

- endsWith(String suffix) : 지정한 접미사로 끝나는지에 대한 비교

 

- isEmpty() : 문자열의 길이가 0인지 아닌지를 확인 및 반환

 

- compareTo(String anotherString) : 두 문자열을 사전 순으로 비교

-> 같으면 0, 적용한 String이 비교 String보다도 앞선다면(작음) 음수 반환 , 적용한 String이 비교 String보다도 뒤에 온다면(더 크다면) 양수 반환

public class CompareToExample {
    public static void main(String[] args) {
        String a = "apple";
        String b = "banana";
        String c = "apple";
        String d = "App";

        System.out.println(a.compareTo(b)); // 음수 (a < b)
        System.out.println(b.compareTo(a)); // 양수 (b > a)
        System.out.println(a.compareTo(c)); // 0 (동일)
        System.out.println(a.compareTo(d)); // 양수 (소문자 a > 대문자 A)
    }
}

 

 

문자열 자르기

- substring(int beginIndex) : 시작하는 인덱스 입력

해당 인덱스부터 String을 자른다.

이 때 인자를 하나만 작성한다면, String을 끝까지 반환하는 것을 알 수 있다.

 

 

- substring(int beginIndex, int endIndex) : 시작하는 인덱스 입력 및 종료 인덱스 입력

해당 String에 대하여 시작부터 종료 인덱스를 작성한다

int endIndex면 해당 인덱스보다 -1까지의 부분 문자열을 반환해준다.

 

 

COS Pro Java 1급 구름 EDU 3차 기출 2번. 팰린드롬 문제

public boolean func_a(ArrayList<String> list, String s) {
	for (int i = 0; i < list.size(); i++)
		if (s.equals(list.get(i)))
			return true;
	return false;
}

public boolean func_b(String s) {
	int length = s.length();
	for (int i = 0; i < length / 2; i++)
		if (s.charAt(i) != s.charAt(length - i - 1))
			return false;
	return true;
}

public String func_c(ArrayList<String> palindromes, int k) {
    Collections.sort(palindromes);
    if (palindromes.size() < k)
    	return "\"NULL\"";
    else
    	return palindromes.get(k-1);
}

public String solution(String s, int k) {
    ArrayList<String> palindromes = new ArrayList<String>();
    int length = s.length();
    for (int startIdx = 0; startIdx < length; startIdx++) {
        for (int cnt = 1; cnt < length - startIdx + 1; cnt++) {
            String subStr = s.substring(startIdx, startIdx + cnt);
            if (func_b(subStr)) {
            	if (func_a(palindromes, subStr) == false)
            		palindromes.add(subStr);
            }
        }
    }

    String answer = func_c(palindromes, k);
    return answer;
}

 

COS Pro Java 1급 구름 EDU 3차 기출 4번. 중복 문자열 이어붙이기

public static int solution(String s1, String s2) {
	return Math.min(merge(s1, s2), merge(s2, s1));
}

public static int merge(String s1, String s2) {
	
    int overlaps = 0; // 일단 중복 겹침 없음부터 시작
	int maxLen = Math.min(s1.length(), s2.length());
		
	while (true) {
		String subS1 = s1.substring(s1.length() - maxLen, s1.length());
		String subS2 = s2.substring(0, maxLen);
			
		if (subS1.equals(subS2)) {
			overlaps = subS1.length();
			break;
		} else {
			maxLen--;
			if (maxLen == 0) {
				break;
			}
		}
	}
	return (s1.length() + s2.substring(maxLen, s2.length()).length());
}

 

 

 

 

 

 

 

문자열 연결

- concat(String str) : 두 문자열을 이어 붙임

a.concat("b");

 

 

문자열 대체및 변환

- replace(char oldChar, char newChar), replace(String oldString, String newString) : 모든 oldChar를 newChar로 대체한 새 문자열을 반환

 

- replaceAll(String regex, String replacement) : 정규 표현식(regex)과 일치하는 모든 부분을 대체

 

- trim() : 문자열의 앞뒤 공백을 제거

 

- toLowerCase() : 문자열의 모든 문자를 소문자로 변환

 

- toUpperCase() : 문자열의 모든 문자를 대문자로 변환

 

- split(String regex) : 정규 표현식을 기준으로 문자열을 분리해 문자열 배열을 반환

String[] parts = "a,b,c".split(",");

 

형 변환

- toCharArray() : 문자열을 문자 배열(char[])로 변환

char[] arr = str.toCharArray();

 

- getBytes() : 문자열을 바이트(byte[]) 로 변환 (인코딩에 자주 사용함.)

 

- String.valueOf(data) : 기본 자료 형이나 객체를 문자열로 변환

 

 

 

 

 

StringBuilder

String 객체가 불변인 것과 달리, StringBuilder는 가변의 특성을 가지는 클래스다. 문자열을 자주 수정하거나 변경해야하는 작업이 있을 때 성능적 큰 이점을 제공한다.

내부 버퍼를 사용하여 문자열을 직접 수정하기 때문에 메모리 효율이 좋다.

 

 

 

- append(String str) : 문자열 끝에 추가

 

COS Pro Java 1급 구름 EDU 3차 기출 5번. 전광판 문구 출

public String solution(String phrases, int second) {
	
	StringBuilder sb = new StringBuilder();
	
	if (second <= 14) {
		String sub = phrases.substring(0, second);
		
		for (int i =0; i < 14-second; i++) {
			sb.append("_");
		}
		sb.append(sub);
	}
	else {
		int interval = second - 14;
		String sub = phrases.substring(interval, phrases.length());
		sb.append(sub);
		
		for (int i =0; i < 14 - interval; i++) {
			sb.append("_");
		}
	}	
	String answer = sb.toString();
    return answer;
}

 

특정 길이의 조건에 따라서 출력을 다르게 하는 문제

 

 

 

- insert(int offset, String str) : 지정 위치에 문자열을 삽입

 

- delete(int start, int end) : 지정 구간의 문자열을 삭제

 

- replace(int start, int end, String str) : 지정 구간을 새 문자열로 교체

 

- reverse() : 문자열 뒤집기

 

- toString() : StringBuilder를 String으로 변환

 

 

 

 

 

언제 뭘 쓰지?

String은 불변 객체이기 때문에 멀티 스레드 한경에서 스레드 안정성을 보장한다는 장점이 존재한다.

하지만, 단일 스레드 환경에서 문자열을 빈번하게 추가, 수정, 삭제 해야하는 경우에는 StringBuilder가 더 효율적이다. StringBuilder에는 내부 버퍼를 직접 변경하기 때문에 매번 새로운 객체를 생성하지 않아 메모리 사용량이 적고 연산 속도가 빠르다.

 

항상 프로젝트를 살펴보면 흔히 Entity, DTO 등의 모델 클래스들은 웬만해선 String이 사용되는 것이 이런 불변성과 데이터 무결성 보장의 원칙을 준수하기 위해서라는 것을 알 수 있다!

( -> 데이터의 무결성 보장과 동시성 안전성을 보장해주는 강점을 살림)

 

그래서 String이라면 다른 코드에서 참조 중인 문자열 값이 의도치 않게 변경될 위험도 없고,

이건 엔티티의 영속성 컨텍스트 관리에도 중요한 요소이기도 하다.