<개인공부>/[C#]

[C#] foreach 사용법과 다양한 예제

사용자 BlockDMask 2019. 1. 11. 20:24
반응형

안녕하세요. BlockDMask 입니다.

오늘은 C#에 존재하는 조금 특별한 반복문 foreach에 대해서 알아보도록 하겠습니다.

1. foreach에 대해서

(1) foreach 란?

- 끝을 지정해주는 다른 반복문과 달리, 인자로 들어온 itrable-item의 내부 인덱스 끝까지 알아서 순환을 해주는 반복문 입니다.


(2) foreach 반복문의 생김새(syntax)

foreach (element in iterable-item)

{

// body

}

: 여기서 element는 데이터 타입과 변수명을 포함합니다. 아래와 같이 사용합니다.

: foreach(string        str      in  arr);

: foreach(데이터타입 변수명 in 배열,컬렉션등)


2. foreach 예제1 - 1차원 배열에서의 foreach


(1) 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void Main(string[] args)
{
    int[] arr = new int[7] { 11121314151617 };
 
    //foreach문
    Console.WriteLine("## foreach 사용");
    int index = 0;
    foreach(int elem in arr)
    {
        Console.WriteLine("arr[" + index + "] : " +elem);
        ++index;
    }
    Console.WriteLine("current i : " + index);
 
    //for문으로 작성했다면?
    Console.WriteLine();
    Console.WriteLine("## for 사용");
    for(int i=0; i<7++i)
    {
        Console.WriteLine("arr[" + i + "] : " + arr[i]);
    }
 
}
cs

: 1차원 배열 arr을 선언과 동시에 초기화를 해서, foreach문을 통해 인자들을 출력해 보았습니다.

: 관련 도서나, 인터넷 검색을 했지만 아직 foreach에서 현재 어느 index를 읽고 있는지 알수 있는 부분을 못찾았습니다.

: C++에서 list같은 container들을 C#에서는 컬렉션이라 부르는데 일부 컬렉션에서는 index를 구하는 방법이 있는걸로 보이는데 배열에서따로 구하는 것은 찾지 못했습니다.


(2) 결과


3. foreach 예제2 - 2차원 배열에서의 foreach


(1) 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
static void Main(string[] args)
{
    int[,] arr = new int[43]
    {
        { 111213 },
        { 212223 },
        { 313233 },
        { 414243 }
    };
 
    //foreach문 1개로 해결가능.
    Console.WriteLine("## foreach 사용");
    int index = 0;
    foreach(int elem in arr)
    {
        Console.WriteLine("arr[" + index + "] : " +elem);
        ++index;
    }
    Console.WriteLine("current i : " + index);
 
    //for문으로 작성했다면?
    //이중 for문으로 작성해야합니다.
    Console.WriteLine();
    Console.WriteLine("## for 사용");
    for (int i = 0; i < 4++i)
    {
        for (int j = 0; j < 3++j)
        {
            Console.WriteLine("arr[" + i + "," + j + "] : " + arr[i,j]);
        }
    }
}
cs

: 2차원 배열도 foreach를 사용하면, 한번에 순회하는 것을 알 수 있습니다.

: C#에서 2차원 배열의 선언과 초기화 그리고 사용방법이 궁금하신 분들은 아래 링크로 따라가시면 됩니다.

Link -  [<개인공부>/[C#]] - [C#] 배열, 다차원배열, 가변배열에 대해서 (array, jagged array)

(2) 결과

: 2차원 배열에서 foreach를 썼을경우 어느 위치에 있는 인덱스 인지 알 방법이 없네요.

: 혹시 아시는분 있다면, 댓글 부탁드려요. 저도 찾아볼게요 여러분.


4. foreach 예제3 - enum을 순회할 수 있는 foreach


(1) 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
enum Month
{
    January = 1,
    February,
    March,
    April,
    May,
    June,
    July,
    August,
    September,
    October,
    November,
    December
};
 
static void Main(string[] args)
{
    Console.WriteLine("## foreach 열거형 출력 - Enum.GetValues()");
    foreach (int elem in Enum.GetValues(typeof(Month)))
    {
        Console.WriteLine(elem + "월");
    }
 
    Console.WriteLine();
    Console.WriteLine("## foreach 열거형 출력 - Enum.GetNames()");
    foreach (string elem in Enum.GetNames(typeof(Month)))
    {
        Console.WriteLine(elem);
    }
}
cs

: 이렇게 열거형일때 System.Enum 클래스의 멤버 함수들을 이용하면, 열거형(enum)의 내부 요소들을 순회할 수 있습니다.

: 굉장히 편리하네요.

: 여기서 봐야할 것은 elem의 타입입니다. 받을 테이터 타입을 알맞게 바꿔서 지정해주어야합니다. 


(2) 결과

: Enum.GetValues()를 이용하면 foreach를 돌면서 enum에 해당하는 int 값반환해줍니다. 

(enum을 처음 선언했을때 아무 타입도 넣어주지 않으면 default 타입이 int로 지정됩니다.)

: Enum.GetNames()를 이용하면 foreach를 돌면서 enum에 해당하는 string 값반환해줍니다.


추가적으로 제가 foreach를 유용하게 사용할 수 있는 C#만의 자료구조들을 배우게 되면, 나중에 "foreach 반복문2" 라는 이름으로 포스팅 하겠습니다. 감사합니다. 여러분의 하트, 지적, 댓글이 저에게 큰 힘이 됩니다.

반응형