본문 바로가기
Java

[Java] for문 사용 시 유의해야 할 점

by 작은돼지 2022. 7. 28.

1. 조건식에 .size() 등의 연산 피하기

        List<String> list = new ArrayList<>();
        
        // 리스트에 요소를 추가한다. (생략)

        for(int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

list 내의 요소를 하나씩 콘솔에 출력하는 코드이다.

그런데 현재 이 코드는 매회 반복 시 list.size() 연산을 수행하며 조건식을 평가한다.

 

단, 여기서 size() 메서드는 for 루프를 돌 때 마다 list의 사이즈를 매번 측정하여 반환하는 것이 아니라

list가 들고 있는 정수 사이즈 값(인스턴스 변수 size의 값)을 반환하므로 성능 차이는 크지 않다.

 

배열의 길이를 구하는 .length의 경우 컴파일러에서 최적화를 수행한다.

배열은 생성 시 길이가 정해져 있어서 컴파일러에서 길이를 미리 상수처럼 처리하여 사용할 수 있기 때문이다.

 

        // ...
        
	int listSize = list.size();
	for (int i = 0; i < listSize; i++) {
		System.out.println(list.get(i));
	}

이렇게 변수 listSize를 생성하여 사용하면

변수에 저장된 숫자를 사용하기 때문에 불필요한 연산을 피할 수 있다.

 

2. 조건식에 매직 넘버 사용을 피하기

	for (int i = 0; i < 30; i++) {
		System.out.println("HELLO");
	}

매직 넘버란 읽기 난해한 숫자 또는 무슨 의미인지 알기 힘든 숫자를 의미한다.

 

이 코드는 HELLO 문자열을 30번 반복하여 출력하는 코드이다.

여기서 30회가 무엇을 의미하는지, 왜 반복하는지 다른 사람이 알 수 있도록 해야 한다.

 

    final int TOTAL_STUDENT_COUNT = 30;

    for (int i = 0; i < TOTAL_STUDENT_COUNT; i++) {
    	System.out.println("HELLO");
    }

30이란 숫자를 TOTAL_STUDENT_COUNT 이름의 상수로 선언했다.

이제 30이란 숫자가 '총 학생 수'를 의미하는 숫자임을 알 수 있다.

 

	final int TOTAL_STUDENT_COUNT = 20;
		
	for (int i = 0; i < TOTAL_STUDENT_COUNT; i++) {
		System.out.println("HELLO");
	}
		
	for (int j = 0; j < TOTAL_STUDENT_COUNT; j++) {
		System.out.println("SEE YOU LATER");
	}

만약 TOTAL_STUDENT_COUNT를 사용하는 다른 코드가 있다면

나중에 총 학생 수의 변경이 일어나도 변경에 용이해질 수 있다.

 

3. for each문 사용

    List<String> list = new ArrayList<>();

    for (String s : list) {
        System.out.println(s);
    }

for each문을 사용하면 최대 길이를 고민할 필요가 없기 때문에

ArrayIndexOutOfBoundsException을 효과적으로 방지할 수 있다.

단, 특정 요소를 조작해야 하는 경우에는 사용이 불가능하다.

 

4. Stream 활용

IntStream.range(0, list.size())
	.forEach(i -> System.out.println(list.get(i)));

Stream을 사용하면 더 간단하게 작성할 수 있다.

성능면에서는 전통 for문이 더 빠를 수는 있다.