본문 바로가기
Program/javaScript

StringBuilder : javaArrayList를 String으로 변환 하기

by Woodland 2019. 12. 28.

arrayList 어레이 리스트를 상황에 따라 String한줄로 뽑아내야 하는 경우가 생긴다.

이런 경우에 보통 쓰는 String.toString() 메서드로는 원하는 값을 받을 수 없는데,

이는 toString이라는 메서드가 해당 변수가 [대표하는 값]만을 String으로 만들어주기 때문이다.

 

이는 모든 주소값을 대변하는 자료형에 동일하게 작동한다.

배열, 이중매열, 오브젝트 등이 toString으로 뽑았을때, 단순히 16진수 주소값만을 리턴한다.

 

사실, 우리가 할 수 있는 방법은 단순히 루프를 돌면서 각 인덱스마다 String으로 만들어주는 수 밖에 없는데,

여기서도 단순한 코드 한줄로 성능을 극대화 시킬 수 있는 방법이 존재한다.

 

<잘못된 변환의 예>

ArrayList<String> list = new ArrayList<String>;

list.add("one");

list.add("two");

list.add("three");

 

String listString = ""

for ( String str : list){

    listString += s + "\t";

 

System.out.println(listString);

 

위와같은 코드에서, += 이라는 기능에 주목해보자.

자바 컴파일러는 위 +=의 코드를 StringBuilder로 변환해서 읽는다

따라서 단순한 기호를 통해 StringBuilder를 호출 할 수 있는것이다.

 

하지만 위 코드의 문제점은 매 루프마다 String builder를 호출하고 종료시킨다는 것이다.

만약 ArrayList가 하나의 문서를 저장하고 있다면 매 라인수만큼의 새로운 StringBuilder가 생성되고 종료되는것이다.

 

너무 많은 잉여 인스턴스 생성은 GarbageCollecter의 호출을 만들고, GC가 동작하는 동안에는 자바 머신의 모든 실행이 중지되므로, 

이부분에서 성능이 떨어진다.

 

이제 성능 좋은 코드를 보자.

 

<좋은 변환의 예>

ArrayList<String> list = new ArrayList<String>;

list.add("one");

list.add("two");

list.add("three");

 

StringBuilder listString = new StringBuilder();

for ( String str : list){

     listString.append(str);

 

System.out.println(listString);

 

위와같은 코드의 경우, 

 

StringBuilder를 루프 밖에 선언해줌으로써, 하나의 인스턴스만 생성이 되었다. 따라서 GC(Garbage Collecter)의 수행또한 적어질 것이다. 

 

위와같은 단순한 코딩 습관으로 최적화된 코드를 생산하려는 노력을  반드시 하여야 한다.

'Program > javaScript' 카테고리의 다른 글

python 1일차.  (0) 2018.04.10