💡문제 설명
문자열 my_string이 매개변수로 주어집니다. my_string을 거꾸로 뒤집은 문자열을 return하도록 solution 함수를 완성해주세요.
class Solution {
public String solution(String my_string) {
String answer = "";
for(int i=my_string.length()-1; i>=0; i--){ //주어진 문자열을 역순으로 순회
answer += my_string.charAt(i);
}
return answer;
}
}
문자열을 역순으로 출력하기위해 for문으로 주어진 문자열의 마지막 인덱스부터 0번째 인덱스까지 반복문을 돌린다. 인덱스에 해당하는 문자를 charAt()함수로 얻어 answer문자열에 더한 후 return한다.
//기존 코드
for(int i=my_string.length()-1; i>=0; i--){
answer += my_string.charAt(i);
}
//개선한 코드
StringBuffer sb = new StringBuffer(my_string);
answer = sb.reverse().toString();
for문으로 풀었더니 성능이 너무 떨어졌다. 다른 방법을 찾아보다가 String Buffer 클래스에 reverse()함수를 쓸 수 있다는걸 알게되었다.
개선된 코드 첫번째 줄이 주어진 문자열을 새로운 StringBuffer객체로 생성한 코드이다.
두번째 줄은 StringBuffer의 reverse()함수로 문자열을 뒤집은 후 반환하기위해 다시 String형으로 변환한 것이다.
StrinfBuffer란 문자열을 다룰때 String보다 더 효율적으로 다룰 수 있는 클래스이다. StringBuffer 클래스에는 문자열을 다룰때 유용한 메서드들이 많다.
| 메서드 | 설명 |
|---|---|
| append(String s) | 문자열 추가 |
| insert(int offset, String s) | 특정 위치에 문자열 삽입 |
| replace(int start, int end, String s) | 특정 범위 문자열 대체 |
| delete(int start, int end) | 특정 범위 문자열 삭제 |
| reverse() | 문자열 뒤집기 |
| toString() | StringBuffer → String 변환 |
🔻반복문을 사용한 코드와 StringBuffer를 사용한 코드의 결과 비교

StrinfBuffer는 문자열을 다룰때 "기존에 생성했던 객체"에서 문자열을 수정하기 때문에 메모리를 낭비하지 않는다. 반면에 String형은 불변 객체이기 때문에 "수정을 할때마다 새로운 객체"를 계속 생성하기 때문에 성능이 많이 차이나는 것이다.
예를들어 String형이 동작하는 법을 알아보기위해 str 문자열에 문자열을 더하는 코드를 다음과 같이 작성하면
String str = "Hello"; //새로운 Hello 객체 생성
str += " World"; //새로운 Hello World 객체 생성
str += "!"; //새로운 Hello World! 객체 생성
System.out.println(str);
Hello라는 문자열 객체가 한번 생성되고, Hello World라는 객체가 또 한번 생성되고, Hello World!라는 새로운 객체가 또 생성된다.
➡️ 때문에 문자열을 수정할때마다 메모리 낭비가 되고 처리 속도도 늦어지는 것이다.
하지만 StringBuffer는 변경 가능한 객체이기 때문에 한번 객체를 생성하면 같은 객체에서 문자열을 수정할 수 있다. 같은 예시로 코드를 작성해보면
StringBuffer sb = new StringBuffer("Hello"); //Hello객체 생성
sb.append(" World"); //기존 Hello객체에 World를 추가
sb.append("!"); //기존 Hello World객체에 !를 추가
System.out.println(sb.toString());
StringBuffer는 문자열을 추가할때마다 객체가 생성되는것이 아닌 기존의 객체(sb)에 append()함수의 인자로 받은 문자열만 추가한다.
➡️ 때문에 메모리를 낭비할 일도 없고 처리속도도 빠르다.
🌟 이렇게 기존의 객체에서 수정이 가능한 이유는 StringBuffer가 내부적으로 문자열을 char[] 배열에 저장하고 관리하기 때문이다. "Hello World!"라는 문자열을 한자리씩 char형으로 배열에 저장하기 때문에 새로운 객체를 만들지 않고도 추가, 삽입, 삭제, 대체, 뒤집기 등 문자열 조작이 가능하다.