티스토리 뷰
요즘 읽고있는 「프로그래밍면접, 이렇게 준비한다(4판)」에서 나온 문제를 풀다가
StringBuilder에 관한 내용이 나와 정리해본다.
문제가 나오면 처음에 혼자 풀어본뒤 책에서 나온 코드를 보고 비교해 보는 방식으로 책을 읽고있다.
이번에 본 문제
라이브러리 함수를 쓰지 않고 문자열을 뒤집는 함수를 만들어라.
내가 처음 작성한 답
public static void main(String[] args) {
String str = "abcdef";
List<String> listStr = new ArrayList<String>();
int strLen = str.length();
for(int i=strLen-1; i>=0; i--) {
String subStr = str.substring(i, i+1);
listStr.add(subStr);
System.out.println("i: "+i);
}
StringBuilder sb = new StringBuilder();
for(String strByList : listStr) {
sb.append(strByList);
}
String reverseStr = sb.toString();
System.out.println(reverseStr);
}
값은 나온다고 만족하면서 책에 나온 첫번째 코드를 봤는데
/**
* 책 예시1
*/
public static String reverse1(String in) {
String out = "";
for(int i = in.length(); i>=0; --i) {
out += in.charAt(i);
}
return out;
}
너무 깔끔하게 써놔서 아직 내가 많이 부족하구나 라고 느꼈다.
그런데 이 코드도 완벽하지 않다며 보여준 2번째 코드
/**
* 책 예시2
*
*/
public static String reverse2(String in) {
int len = in.length();
StringBuilder out = new StringBuilder(len);
for(int i=len-1; i>=0; i--) {
out.append(in.charAt(i));
}
return out.toString();
}
이 방식은 for문이 돌때마다 String객체를 새로 생성하지 않아도 되는 방식이라고 했다.
그래서 여기서 쓴 StringBuilder가 어떤것인지 궁금해져 정리해보려고 한다.
StringBuilder를 정리하기전에 정리가 필요한 String에 대해 먼저 알아보자
String
・자바 문자열이며 시스템 클래스 객체
・문자열을 손쉽게 문자 및 바이트 배열과 상호 변환 가능
☞내부적으로 문자열 클래스에서는 char 배열을 써서 문자열 정리
・문자열에 있는 개별 문자는 직접 액세스할 수 없고 String클래스에 있는 메서드를 써야만 액세스가능
・프로그램 소스코드에 있는 String리터럴은 자바 컴파일러에서 자동으로 String인스턴스로 변환
☞String리터럴에 관련해 잘 정리된 사이트가 있어서 참조합니다.
・같은 문자열끼리는 같은 배열을 공유
・자바 문자열은 변형불가능(immutable)
☞문자열을 조작하는 메서드도 사실은 새로운 문자열 인스턴스를 반환
・대신 필요에 따라 String 인스턴스로 변환될수 있는 변형 가능한 문자열을 만들어주는
StringBuffer와 StringBuilder클래스가 있다.
・StringBuffer는 모든 버전의 자바에서 쓸 수 있고 스레드 안전성 제공
・StringBuilder는 JDK1.5버전에서 도입되었으며 빠르긴 하지만 스레드 안전성 제공x
즉, 책예시1의 소스코드는 풀어써보면 다음과 같다.
/**
* 책 예시1 풀어쓴 결과
*/
public static String reverse1ByStringBuilder(String in) {
String out = "";
for(int i = in.length(); i>=0; --i) {
StringBuilder sb = new StringBuilder();
sb.append(out);
sb.append(in.charAt(i));
out = sb.toString();
}
return out;
}
for문이 돌때마다 StringBuilder객체를 새로 생성하고있었던 것이다.
따라서 문자열을 순환문으로 변경해야하는 경우에는 StringBuilder를 사용하는것이 더 효과적임을 알게됐다.
'개발관련 > Java' 카테고리의 다른 글
Velocity Editor for Eclipse (0) | 2020.04.20 |
---|---|
선증가 후증가 선감소 후감소 연산자 정리 (0) | 2019.12.12 |
- Total
- Today
- Yesterday
- 자바
- 선증가
- 선감소
- nginx multiple domain
- 일본 장터
- StringBuilder
- 일본 만두
- 연산자
- VelocityPluginImages
- string
- 엔진엑스 멀티도메인 404에러
- 후증가
- 자바책
- 누가_쏙쏙_바로바로_알려줄사람_어디없나
- 일본 한인마트
- 엔진엑스 ssl 멀티도메인 404
- 벨로시티
- velocity
- 일본 비비고
- 후감소
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |