여기서 소개 할 enhanced For-Loop는 Java SE 플랫품 5.0에 도입되어 널리 쓰이는 기능 중 하나로 간단한 구조로 Array/Collection의 한 요소에서 다른 요소로 이동하는 방법을 명시적으로 표현하지 않고서도 각 요소를 거치는 For-Loop를 제공하여 코드를 간소화하는 팁이다.
기존 Java SE 5.0 이전의 코등 스타일은 Array/Collection의 각 요소를 거치려면 enhanced For-Loop를 사용하여 다음과 같이 코딩해야 한다.
for (int i=0;i<array.lenght;i++) {
System.out.println("Element : " + array[i]);
}
그러나 Java SE 5.0의 새로운 스타일을 적용할 경우 다음과 같은 형태로 바뀐다.
for (String element : array) {
System.out.println("Element : " + element);
}
"array"가 String[]로 정의 되었다고 가정하면, array를 루프할 때 각 요소가 요소 변수 String element에 할당된다.
Company라는 클래스가 있고 이 클래스가 여러 Team 개체로 구성된 경우, enhanced For-Loop를 작동하기 위한 추가적인 작업 없이 각 Team 요소를 루프하는 방법 중 하나는 Iterator를 반환하고 Company를 반복하는 것이다. 그러나, enhanced For-Loop는 Iterator와 작동하지 않으므로 다음과 같은 Company는 컴파일에서 오류가 발생할 것이다.
package com.junducki.blog.se.enhanced;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Company {
static class Team {
private String name = null;
public Team(String name) {
this.name = name;
}
public String toString() {
return "Team [" + name + "]";
}
}
private Set<Team> set = new HashSet<Team>();
public void addTeam(Team team) {
set.add(team);
}
public Iterator<Team> getTeams() {
return set.iterator();
}
public static void main(String[] args) {
Company company = new Company();
Team bsTeam = new Team("B/S Team");
Team designTeam = new Team("Design Team");
company.addTeam(bsTeam);
company.addTeam(designTeam);
for(Team team : company.getTeams()) {
System.out.println(team);
}
}
}
위의 소스는 컴파일에서 오류가 발생할 것이다. enhanced For-Loop와 함께 클래스를 사용하려면 Iterator가 필요하지만 Iterator가 Iterable 인터페이스를 통해 제공되어야 한다. 더 정확성을 기하기 위해서는, 기존 Object 대신 generic T를 사용함으로써 enhanced For-Loop가 유형 변환을 방지하고 지정된 generic 형식을 반환하게 할 수 있다. 그렇지 않으면 Object를 반환하게 된다.
public interface java.lang.Iterable<T> {
public java.util.Iterator<T> iterator();
}
다음과 같이 알맞은 implements 절을 제공함으로써
public class Company implements Iterable<Company.Team> {
Company에 대해 enhanced For-Loop를 얻게 된다.
for (Team team : company) {
옳바르게 수정 된 전체 소스를 다음과 같아진다.
package com.junducki.blog.se.enhanced;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Company implements Iterable<Company.Team> {
static class Team {
private String name = null;
public Team(String name) {
this.name = name;
}
public String toString() {
return "Team [" + name + "]";
}
}
private Set<Team> set = new HashSet<Team>();
public void addTeam(Team team) {
set.add(team);
}
public Iterator<Team> iterator() {
return set.iterator();
}
public static void main(String[] args) {
Company company = new Company();
Team bsTeam = new Team("B/S Team");
Team designTeam = new Team("Design Team");
company.addTeam(bsTeam);
company.addTeam(designTeam);
for(Team team : company) {
System.out.println(team);
}
}
}
'Enhance for-loop'에 해당되는 글 1건
- 2008.03.18 Java SE - 클래스에서 enhanced For-Loop 사용하기
Dev Note/Java2008. 3. 18. 19:41