티스토리 뷰

개발관련/Java

StringBuilder정리

이블로 2019. 12. 14. 17:44

요즘 읽고있는 「프로그래밍면접, 이렇게 준비한다(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 인스턴스로 변환될수 있는 변형 가능한 문자열을 만들어주는

   StringBufferStringBuilder클래스가 있다.

・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
링크
«   2025/04   »
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
글 보관함