본문 바로가기

개발언어/Java

[Java] Java문법 for, for-each

이번 포스팅도 마찬가지로 Effective java의 내용을 정리한 포스팅 입니다.


이번 내용은 Java의 반복문 중 for문과 for-each문에 관해서 어떤것을 주로 사용할지에 관한 내용입니다.


기본적으로 반복문을 사용할때 우리에게 필요한것은 반복자(예를들면 int i = 0 의 i같은)나 인덱스(i가 arr이란 배열에서 arr[i]처럼 사용되는 경우)이 아닌 배열혹은 리스트등의 내부에 원소입니다. 


이러한 반복자와 인덱스의 사용은 실질적으로 필요하지 않은 변수임에도 코드에서 사용되어서 개발자의 실수를 늘리는 요소로 작용됩니다.


또한 컬렉션이나 배열이냐에 따라 for문 내부의 형태가 달리지므로 이또한 주의할 점이 됩니다. 


위의 문제들은 for-each문을 사용하게 되면 모두 자연스럽게 해결되는 문제입니다. 

=> for-each 문은 배열과 컬렉션의 사용법이 다르지 않고, 인덱스 혹은 구분자를 사용하지 않아 실수할 확률을 줄여줍니다.


애초에 for-each 의 정식 명칭은 ‘enhanced for statement’ 로 향상된 for문을 의미합니다. 


반복문을 반복해서 사용하는 경우 이러한 이점은 훨신 크게 나타납니다. 


예를 들어서 for문에서 컬렉션을 사용하는 경우, 



enum 이름들 {철수영희}

enum 과목들 {수학과학}


static Collection<이름들> 학생이름 = Arrays.asList(이름들.values());

static Collection<과목들> 수강과목 = Arrays.asList(과목들.values());


List<학생> 학생부 = new ArrayList<>();


for(Iterator<이름> i = 학생이름.iterator(); i.hasNext();)

    for(Iterator<소개> j = 수강과목.iterator(); j.hasNext();)

        학생부.add(new 학생(i.next(), j.next()));



다음 코드에서 어떠한 문제가 있는지 쉽게 찾기가 힘들다. 


다음 코드는 학생 이라는 클래스에 학생 이름에 과목을 각각 매칭해서 총 4개의 객체를 만들려는 의도를 가진 코드다. 


4개의 객체는 다음과 같다


{ 철수, 수학 }

{ 철수, 과학 }

{ 영희, 수학 }

{ 영희, 과학 }


하지만 보기에는 그럴듯해 보여도 간단한 실수를 범한 코드인데, 실수는 바로 i의 증가와 j의 증가가 동시에 일어나는 문제이다. 


반복문은 작성자의 의도인 코드가 4번이 돌아가는것이 아닌 단 2번만 돌아가고 종료된다.  


실제로 생성되는 2개의 객체


{ 철수, 수학 }

{ 영희, 과학 }


이 상황에서 코드를 다시 제대로 만들기 위해서는 



enum 이름들 {철수영희}

enum 과목들 {수학과학}


static Collection<이름들> 학생이름 = Arrays.asList(이름들.values());

static Collection<과목들> 수강과목 = Arrays.asList(과목들.values());


List<학생> 학생부 = new ArrayList<>();


for(Iterator<이름> i = 학생이름.iterator(); i.hasNext();)

{

    이름 학생명 = i.next();

    for(Iterator<소개> j = 수강과목.iterator(); j.hasNext();)

    {

        학생부.add(new 학생(학생명, j.next()));

    }

}


위와 같이 변경되어야 한다. 대충봐도 코드가 길어지고 좀 더 번잡해졌다. 이를 for-each 문으로 변경시켜 보자.



enum 이름들 {철수영희}

enum 과목들 {수학과학}


static Collection<이름들> 학생이름 = Arrays.asList(이름들.values());

static Collection<과목들> 수강과목 = Arrays.asList(과목들.values());


List<학생> 학생부 = new ArrayList<>();


for(이름들 이름 : 학생이름)

    for(과목들 과목 : 수강과목)

        학생부(new 학생(이름, 과목));


한눈에 보기에도 훨신 간결해졌다. 


이런식으로 for문에 비해서 for-ecah문이 여러므로 장점이 훨신 많으므로 for-each문을 주로 사용하는게 좀더 낫다고 볼 수 있다.


하지만 예외적으로 사용이 불가는 상황이 세가지 있는데. 이는 다음 포스팅에서 정리하겠다.