[JAVA] for-each문, 향상된 for문

myminimin·2023년 7월 25일
0

JAVA

목록 보기
10/21

  • 일반적인 for문

    		for(초기값 ; 조건식 ; 증감식) {
      	조건식이 참일 경우 반복 수행;
      }
      
  • 향상(개선)된 for문

    		for(타입 변수명 : 배열 또는 컬렉션) {
      	// 배열 또는 컬렉션에 저장된 값이 매 반복마다 하나씩 순서대로 읽어서 변수에 저장
      }
    
    		<조건>
      	1. JDK 1.5 이상 사용 가능
          2. 사용하는 변수는 지역변수로 인식된다. (for문 앞에서만 사용되기 때문에 당연한 전제)
          3. 대상은 배열 또는 여러가지 원소들을 포함한 자료형이어야 한다.
          
      <장점>
      	1. 사용이 간편하고 가독성이 좋다
          2. 배열의 인덱션 문제를 해결할 수 있다. (ArrayIndexOutOfBoundsException 예외)
          
      <단점>
      	1. 배열의 인덱션 문제는 해결이 가능하지만, 인덱스를 사용하지 못한다.
          2. 배열이나 ArrayList 값을 사용할 수는 있지만 수정은 불가능하다.
          

로직 특성상 index에 접근할 필요가 있다면 일반 for문을 사용해야 하지만 그런 특정한 케이스가 아니라면 향상된 for문을 사용하는 쪽을 권장한다. (속도 자체는 비슷하지만 장점의 이유때문에...)


  • 컬렉션이 중첩되는 경우 for-each문의 강점이 더욱 커진다
// before 기본 for문을 사용하는 경우
enum Suit { CLUB, DIAMOND, HEART, SPADE}
enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING}

static Collection<Suit> suits = Arrays.asList(Suit.values());
static Collection<Rank> ranks = Arrays.asList(Rank.values());

List<Card> deck = new ArrayList<>();
for(Iterator<Suit> i = suits.iterator(); i.hasNext();) {
    for(Iterator<Rank> j = ranks.iterator(); j.hasNext();) {
        // 오류 발생!! i.next()가 너무 많이 호출됨.
        deck.add(new Card(i.next(), j.next()));
    }
}
// after 향상된 for문을 사용하는 경우
enum Suit { CLUB, DIAMOND, HEART, SPADE}
enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING}

static Collection<Suit> suits = Arrays.asList(Suit.values());
static Collection<Rank> ranks = Arrays.asList(Rank.values());

List<Card> deck = new ArrayList<>();
for(Suit suit : suits) {
    for(Rank rank : ranks) {
        deck.add(new Card(suit, rank));   
    }
}

이렇게 더욱 명확하고 간결한 코드로 만들 수 있다 !


공식문서

for문, for-each문

Java 설명서에 별도의 항목으로 나열되어 있지 않아서 찾기가 어려웠다... 영어로 한 번 쓱 읽어보고 어려운 내용은 아니라서 이해는 됐다!


0개의 댓글