2024. 3. 7. 10:36ㆍ코딩 테스트/[프로그래머스] Java
배경
코딩 테스트 연습 문제를 풀어보면서, 다른 사람의 풀이를 보게 되었다.
그때 Stringbuilder를 사용해서 풀이를 한 것을 보았는데, Stringbuilder가 뭐지?라는 생각이 들었다.
처음 듣는 객체였다..!
그래서 구글에 간단하게 검색해 보았는데, String을 관련해서 다룰 때 잘 쓰이는 것 같았다.
또, String 객체로만 풀이할 때 발생하는 여러가지 메모리 문제도 해결해 줄 수 있을 것 같았다.
그래서 조금 더 자세하게 알아가보기로 하였다!
시작
그래서 Stringbuilder가 뭘까?
그 전에 String의 개념에 대해서 다시 확실하게 짚고 넘어가자.
1. Class String - java.lang
String 클래스는 "abc"같은 character들의 연결을 나타낸다.
String 객체들은 상수이다. 그들의 값이 한번 정해지면, 변하지 않는다.
그래서 Stringbuffer를 이용함으로써 변할 수 있는 String을 사용하도록 한다.
이처럼, String object들은 불변이므로, 그들간의 공유가 가능하다.
2. Class StringBuffer - java.lang
StringBuffet 클래스는 thread로부터 안전하고, 변화 가능한 문자열을 나타낸다.
StringBuffer는 String과 같지만, 수정 가능하다는 점에서 차이가 있다.
특정 메소드 호출에 의해 문자열의 길이나 내용이 변경될 수 있다.
또, 이는 multiple threads에서 안전하다.
메소드는 필요한 경우에 동기화되어, 특정 인스턴스의 모든 작업이 관련된 각각의 스레드의 메소드 호출 순서와
일치하는 일련의 순서로 발생하는 것처럼 동작하기 때문이다.
3. Class StringBuilder - java.lang
이도 마찬가지로 수정 가능한 문자열을 나타낸다.
이 클래스는 StringBuffer와 호환 가능한 API를 제공하지만, 동기화를 보장하지는 않는다.
이 클래스는 StringBuffer가 단일 스레드에서 사용되는 위치에서 drop-in 대체품으로 사용하기 위해 설계되었다. (멀티 스레드에서는 안정적이지 않다.)
가능하다면, StringBuffer보다 StringBuilder를 우선적으로 사용하자.
대부분의 구현에서 이 클래스가 더 빠르기 때문이다.
String Builder의 주요 작업은 <append>와 <insert> 작업이다.
이들은 모든 유형의 데이터를 허용하도록 오버로딩된 메소드들이다.
주어진 데이터를 문자열로 효과적으로 변환한 다음, 해당 문자열의 문자를 StringBuilder에 <append> 또는 <insert>한다.
- <append> 메소드는 항상 빌더 끝에 문자를 추가한다.
- <insert> 메소드는 지정된 지점에 문자를 추가한다.
StringBuilder 사용방법
StringBuilder sb = new StringBuilder(); //객체 선언.ver1
StringBuilder sb = new StringBuilder("abc"); //객체 선언.ver2
sb.append("def"); // "abcdef"
sb.insert(2,"A"); // "abAcdef"
sb.deleteCharAt(2); // "abcdef"
sb.reverse(); // "fedcba"
sb.delete(0,3); //"cba"
sb.toString(); // "cba"
이처럼 다양한 메소드를 포함하고 있다.
덕분에 문자열을 더 쉽고 간편하게 수정하고 접근할 수 있을 것 같다.
String과 StringBuffer, StringBuilder의 메모리 차이
이전에 읽은 것 중에서 궁금한 부분이 있다.
String은 수정이 불가능하고, StringBuffer/StringBuilder는 수정이 가능하다는 것이다.
여기서 "수정"이라는 명확한 기능이 알고싶다.
- "수정" 가능한 (mutuable)
최초 객체 생성 후, 해당 객체를 변경할 수 있다.
생성된 객체에 추가 및 삭제 등 변경이 허용된다.
원하는 변경 사항을 기존 객체에 적용하여 표현할 수 있다.
- "수정" 불가능한 (immutable)
최초 객체 생성 후, 해당 객체를 변경할 수 없다.
생성된 객체에 추가 및 삭제 등 변경이 금지된다.
원하는 변경 사항을 새로운 객체에 적용하여 새로 생성해야 한다.
수정 불가능한 객체, 즉 String 객체를 사용할 때를 가정해보자.
원하는 수정 사항을 적용하기 위해 객체를 새로 생성하게 되면 이전에 존재하던 문자열은 더이상 쓸모가 없게 된다.
기존 문자열은 메모리에서 더이상 접근되지 않으며, Java에서 제공하는 가비지 컬렉터에 의해 처리된다.
만약 계속해서 수정 사항이 생긴다면, 계속해서 새로운 객체를 생성해야 하고 메모리 차지도 점점 늘어날 수 밖에 없다.
이를 조금이나마 개선하고자 수정 가능한 객체, StringBuffer와 StringBuilder가 탄생한 것 같다!
앞으로 String을 계속해서 접근하고 수정해야 하는 상황이 온다면, String이 아닌 다른 객체를 사용하는 것을 염두에 두자!
[참고 사이트]
'코딩 테스트 > [프로그래머스] Java' 카테고리의 다른 글
[코딩테스트연습] 코딩 기초 트레이닝 > Lv.0 정수를 나선형으로 배치하기 (0) | 2024.03.09 |
---|---|
[코딩테스트연습] 코딩테스트 입문 > Lv.0 자릿수 더하기 (2) | 2024.03.07 |
[코딩테스트연습] 코딩테스트 입문 > Lv.0 머쓱이보다 키 큰사람 (0) | 2024.03.07 |
[코딩테스트연습] 코딩테스트 입문 > Lv.0 배열 원소의 길이 (0) | 2024.03.07 |
[코딩테스트연습] 코딩테스트 입문> Lv.0 문자열 뒤집기 (0) | 2024.03.07 |