Language/C# [C#] foreach, Method
  • 728x90
    반응형

     

     

     

    foreach, Method


     

     

     

    목차

       

      foreach(순회하며 차례대로 접근)

      📌 C#에서는 C와 동일하게 while, do~while, for 등의 반복문을 사용 할 수 있으며, foreach도 추가로 사용할 수 있다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int[] arr = { 1, 2, 5, 7, 4, 9, 8, 10, 4, 7, 11};
      
                  foreach (int i in arr)
                      Console.WriteLine("i:{0}", i);
              }
          }
      }

       

      결과)

      i:1
      i:2
      i:5
      i:7
      i:4
      i:9
      i:8
      i:10
      i:4
      i:7
      i:11
      계속하려면 아무 키나 누르십시오 . . .

       

      🔔 예) C# 구구단 코드

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  for(int dan = 2; dan < 10; dan++)
                  {
                      for(int i = 1; i < 10; i++)
                      {
                          Console.WriteLine("{0} x {1} = {2}", dan, i, dan * i); 
                      }
                  }
              }
          }
      }

       

      결과)

      2 x 1 = 2
      2 x 2 = 4
      2 x 3 = 6
      2 x 4 = 8
      2 x 5 = 10
      2 x 6 = 12
      2 x 7 = 14
      2 x 8 = 16
      2 x 9 = 18
      ...
      9 x 1 = 9
      9 x 2 = 18
      9 x 3 = 27
      9 x 4 = 36
      9 x 5 = 45
      9 x 6 = 54
      9 x 7 = 63
      9 x 8 = 72
      9 x 9 = 81
      계속하려면 아무 키나 누르십시오 . . .

       

       

       

      메소드(Method)

      📌 C#에서의 메소드(Method)는 C언어와 C++의 함수(Function)와 비슷한 기능을 한다. 메소드를 간단히 나타내자면 이어지는 코드들을 묶어놓은 코드 블록이다.

       

      아래는 C#에서 메소드를 정의하는 방법이다.

       

      ...
      static void square(int a) {
      	Console.WriteLine("{0} * {1} = {2}", a, a, a * a);
      }
      ...
      
      
      [접근 지정자] 반환형식 메소드명(매개변수 목록) {
      	// 실행될 코드
      }

       

      여기서 접근 지정자에는, private, public, protected 등이 있다. 접근 가능한 범위를 지정할 수 있다. 반환 형식은 메소드의 결과에 따라 다르며, 반환되는 데이터의 형식이 int형이라면, int를 써야하며 double형이라면 double을 반환형식 에다 적어주어야 한다. 만약에 반환되는 값이 없을 경우에는 void를 저으면 된다.

       

       

      Call by value vs Call by reference

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int a = 40;
                  int b = 10;
      
                  Console.WriteLine("Swap before: a={0}, b={1}", a, b);
      
                  Swap(a, b);
      
                  Console.WriteLine("Swap after: a={0}, b={1}", a, b);                       
              }
      
              static void Swap(int a, int b)
              {
                  int temp = b;
                  b = a;
                  a = temp;
              }
          }
      }

       

      결과)

      Swap before: a=40, b=10
      Swap after: a=40, b=10
      계속하려면 아무 키나 누르십시오 . . .

       

      Swap 함수의 내용을 보자면 값을 임시로 담아둘 temp란 변수를 선언하고 temp란 변수의 값을 b의 값으로 초기화 시킨다. 그러고는 b에 a의 값을 담는다. 그리고 a에는 temp(원래 b의 값)을 담는다. 즉, Swap 함수는 a와 b의 값을 서로 바꿔버리는 기능을 수행한다. 여기서 이렇게 매개변수를 변수의 값으로 가져온 경우를 Call by value(복사에 의한 함수 호출)이라고 부른다.

       

      정수형 변수 a와 b가 선언되었으며 그와 동시에 40과 10으로 각각 초기화 되었다. 그러곤 Swap 함수가 실행되기 전의 a, b의 값을 출력한 뒤에 Swap 함수가 실행되고 다시 한번 a, b의 값을 출력한다. 그러나 Swap 함수가 실행됨에도 불구하고 a와 b의 값은 바뀌지 않는다.

       

      메소드로부터 변수를 넘겨줄 때부터, 매개변수 a와 b는 변수 a와 b를 가르키는 게 아니고, 그저 변수 a와 b의 값을, 매개변수 a와 b로 복사하는 것 뿐이다. 한마디로 말하자면, 매개변수 a와 b, 변수 a와 b는 서로 별개 이며, 다른 메모리 공간을 사용한다. 그저 매개변수 a와 b의 값이 서로 바뀌었을 뿐 변수 a와 b의 값은 그대로인 것이다. a와 b의 값을 바꾸도록 하려면 Call by reference(참조에 의한 호출)로 넘기면 가능해진다. Call by reference는 Call by value와는 달리, 변수의 주소 값을 매개변수로 보낸다. 

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int a = 40;
                  int b = 10;
      
                  Console.WriteLine("Swap before: a={0}, b={1}", a, b);
      
                  Swap(ref a, ref b);
      
                  Console.WriteLine("Swap after: a={0}, b={1}", a, b);                       
              }
      
              static void Swap(ref int a, ref int b)
              {
                  int temp = b;
                  b = a;
                  a = temp;
              }
          }
      }

       

      결과)

      Swap before: a=40, b=10
      Swap after: a=10, b=40
      계속하려면 아무 키나 누르십시오 . . .

       

      ref 키워드는 매개변수를 참조형식으로 사용할 때 사용되는 키워드이다. 메소드의 선언, 호출 부분에 ref 키워드를 달아주면 그게 곧 Call by reference로 넘겨주는 방법이다. 결과를 살펴보면 a와 b의 값이 서로 바뀐 것을 확인할 수 있다.

       

       

      메소드 오버로딩(Method Overloading)

      📌 C언어에서는 오버로딩이 불가능했다. 메소드명을 중복하여 다르게 구현하는 것이 불가능하다. 그런데 C#에서는 메소드 오버로딩을 지원한다. 같은 메소드명에 인자만 다르게 하여 매개변수의 데이터 형식, 수에 따라 그에 맞는 코드를 실행할 수 있다.

       

      🔔 예제)

      ...
      static int Add(int a, int b)
      {
      	Console.WriteLine("두 int형 끼리의 덧셈");
          return a + b;
      }
      
      static double Add(double a, double b)
      {
      	Console.WriteLine("두 double형 끼리의 덧셈");
          return a + b;
      }
      
      static int Add(int a, int b, int c)
      {
      	Console.WriteLine("세 int형 끼리의 덧셈");
          return a + b + c;
      }
      ...

       

      위 예제를 보면 같은 메소드명인데도 불구하고 여러번 등장한다. 이렇게 똑같은 메소드명인데도 매개변수에 따라 호출되는 메소드가 다르다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {            
                  Console.WriteLine("{0}", Add(50, 10));           
                  Console.WriteLine("{0}", Add(544.2, 63.2));           
                  Console.WriteLine("{0}", Add(4, 7, 9));                                          
              }
      
              static int Add(int a, int b)
              {
                  Console.WriteLine("두 int형 끼리의 덧셈");
                  return a + b;
              }
      
              static double Add(double a, double b)
              {
                  Console.WriteLine("두 double형 끼리의 덧셈");
                  return a + b;
              }
      
              static int Add(int a, int b, int c)
              {
                  Console.WriteLine("세 int형 끼리의 덧셈");
                  return a + b + c;
              }
          }
      }

       

      결과)

      두 int형 끼리의 덧셈
      60
      두 double형 끼리의 덧셈
      607.4
      세 int형 끼리의 덧셈
      20
      계속하려면 아무 키나 누르십시오 . . .

       

       

       

      ref

      📌 ref 키워드를 사용하면 변수의 값을 그대로 전달하는게 아닌, 변수의 메모리 주소를 전달한다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int a = 40;
      
                  Add(ref a, 100);
                  Console.WriteLine("a = {0}", a);
                  Add(ref a, 200);
                  Console.WriteLine("a = {0}", a);
                  Add(ref a, 300);
                  Console.WriteLine("a = {0}", a);
              }
      
              static void Add(ref int a, int b)
              {
                  a += b; // a = a + b            
              }
          }
      }

       

      결과)

      a = 140
      a = 340
      a = 640
      계속하려면 아무 키나 누르십시오 . . .

       

      ref 키워드가 메소드를 호출할때도 쓰였고 매개변수에서도 사용되었다. ref 매개변수를 사용하려면 메소드를 호출할때나, 메소드를 정의할때도 ref 키워드를 명시적으로 사용해주어야 한다.

       

       

      out

      📌 out 키워드는 ref 키워드와 비슷하게 인수를 참조로 전달할때 사용된다. 그러나 차이점이 존재한다. out 키워드를 사용하면 변수를 전달하기전 초기화해야하는 ref 키워드와는 달리 초기화 하지 않고도 전달이 가능하다.

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {
                  int a;
      
                  Add(out a);
                  Console.WriteLine("a = {0}", a);
              }
      
              static void Add(out int a)
              {
                  a = 100; // a = a + b            
              }
          }
      }

       

      결과)

      a = 100
      계속하려면 아무 키나 누르십시오 . . .

       

      정수형 변수 a가 등장하나 초기화는 되지 않은것을 확인할 수 있다. Add 메소드가 등장하고 매개변수로 a의 주소값을 넘긴다. Add 메소드에서 이 a의 주소값을 가지고 a에 접근하여 100이란 값을 대입한다.

       

       

      params

      📌 params 키워드의 기능은 메소드에 여러개의 값을 전달할 수 있도록 도와준다. 

       

      🔔 예제)

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      
      namespace ConsoleApp
      {
          class Program
          {
              static void Main(string[] args)
              {                       
                  Console.WriteLine("sum = {0}", Total(20, 10, 40, 4, 7, 6, 44, 55, 2));
                  Console.WriteLine("sum = {0}", Total(30, 4, 5));
              }
      
              static int Total(params int[] list)
              {
                  int sum = 0;
      
                  for (int i = 0; i < list.Length; i++)
                      sum += list[i];
      
                  return sum;
              }
          }
      }

       

      결과)

      sum = 188
      sum = 39
      계속하려면 아무 키나 누르십시오 . . .

       

      Total 메소드에 매개변수 부분에 params 키워드가 사용됬고 int 형 뒤에 []가 붙었다. int[] 는 정수형 배열을 의미한다. 이 list를 가지고 하나하나 접근하여 sum이란 변수에 더하고 반복문을 빠져 나와 sum의 값을 반환(return)한다. 여기서 중요한건 params 키워드를 사용하여 매개변수의 길이를 유연하게 만들수 있음을 알 수 있다.

      728x90
      반응형

      'Language > C#' 카테고리의 다른 글

      [C#] 클래스(Class), 접근 제한자(Access Modifier), this  (0) 2019.09.06
      [C#] 배열(Array)  (0) 2019.09.06
      [C#] 연산자(Operators)  (0) 2019.09.06
      [C#] Hello World, 기본 자료형  (0) 2019.09.05
      .NET Framework, .NET Core, Xamarin 차이점  (0) 2019.09.05
    상단으로