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 |
---|