안녕하세요 ^^
앞서 임시 지역 변수 사용에 따른 성능 측정 결과를 정리한 글에 이어
한 가지 "구체적인 사용 요령"을 추가로 올립니다.
변수의 scope를 최소화 하자 !
저는 이전에 C 개발이 주특기(?)였습니다.
C++도 꽤 하기는 했으나, 상당히 C 스타일의 C++에서 크게 벗어나질 못했습니다.
Java도 알고는 있었지만 거의 안 쓰다가 안드로이드 오면서 본격적으로 Java를 하게 되었습니다.
저와 같은 분들의 특징은 지역 변수 선언을 함수 초반에 몰아 넣는 (나쁜) 습관이 있다는 것입니다.
예를 들어 보겠습니다.
void testFunc() {
int left = getLeft();
int right = getRight();
// left를 써서 계산하는 코드 (이 부분에서 right는 전혀 쓰지 않음)
...
...
// right를 써서 계산하는 코드
...
...
}
이런 코드는 가독성이 떨어지므로 절대 좋은 습관이 아닙니다.
left를 써서 계산하는 코드 부분이 상당히 복잡하다고 합시다.
그러면, right가 중간에 쓰였는지 안쓰였는지,
right값에 새로운 값을 써서 중간에 값이 바뀌지는 않았는지...
한눈에 파악이 안됩니다.
대신 아래와 같이 쓰면...
void testFunc() {
int left = getLeft();
// left를 써서 계산하는 코드 (이 부분에서 right는 전혀 쓰지 않음)
...
...
int right = getRight();
// right를 써서 계산하는 코드
...
...
}
left를 써서 계산하는 코드 부분에서 right값을 사용하지도 바꾸지도 않았다는 사실이 분명해집니다.
선언을 초반에 몰아 쓴다고 해서 조금도 더 빨라지지 않습니다.
지역 변수는 사용 직전에 선언하고 초기화 합시다.
심지어 이런 예도 있습니다.
int value;
int size = mList.size();
for (int i = 0; i < size; i++) {
value = mList.get(i);
// value를 써서 계산하는 코드
...
...
}
// 이 뒤에도 코드가 계속되지만 value 변수는 더 이상 사용하지 않음
...
...
이것 보다는 아래와 같은 코드가 조금 더 좋습니다.
int size = mList.size();
for (int i = 0; i < size; i++) {
int value = mList.get(i);
// value를 써서 계산하는 코드
...
...
}
// 이 뒤에도 코드가 계속되지만 value 변수는 더 이상 사용하지 않음
...
...
이번에는 for 루프 바깥에 변수를 선언하지 않고, 루프 안에서 value를 선언했습니다.
value는 for 루프 안에서만 사용되는 변수기 때문에 scope를 최소화 하기 위해서 이렇게 했습니다.
처음 코드는 for 루프가 끝난 후
뒤에 이어지는 코드에서는 value가 더 이상 필요하지 않지만
변수는 계속해서 유효하기 때문에 별로 좋지 않습니다.
문제는...
"저렇게 변수를 자주 선언하면 더 느려지지 않나요? ㅠㅡㅠ" 입니다.
느낌상 정말 엄청 느려질 것 같습니다만...
사실 루프 내에서 변수를 선언한다고 해서 더 느려지지는 않습니다.
걱정하지 않으셔도 된다고 합니다.
이에 대한 자세한 설명은 아래 글을 참고하시기 바랍니다. :)
http://benelog.springnote.com/pages/386996
정말 유익한 글이니 한 번 쯤 시간을 내어 꼭 읽어보시기 바랍니다.
아랫 글에 "봉느님"님이 걸어두신 링크 읽어보고 댓글 답니다.
http://developer.android.com/guide/practices/design/performance.html
"Avoid Creating Unnecessary Object" 이 부분입니다.
불필요한 임시변수가 생성되면 GC가 너무 빈번히 발생되서
(물론 진저에서 GC 성능향상이 있었습니다만)
user experience에 악영향을 끼칠 수 있다고 경고하고 있습니다.
특히 user interface loop에서는 "hiccups", 즉 딸꾹질같은 끈김이 발생할 수 있다고 합니다.
모바일의 특성상, 실행 속도보다는 user experience가 더 중요한게 아닐까 합니다.
ps. 저 링크는 안드로이드 개발자라면 꼭 읽어봐야할 내용인것 같습니다.
개발자 싸이트에 좋은 내용이 많은것 같네요.
언젠가는 시간을 내서 정독을 해야 할 것 같은 느낌.