BLOG ARTICLE Enhance for-loop | 1 ARTICLE FOUND

  1. 2008.03.18 Java SE - 클래스에서 enhanced For-Loop 사용하기

Dev Note/Java 2008.03.18 19:41

여기서 소개 할 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);
         }
      }
   
   }

신고