컴퓨터프로그래밍/C#

C#_메소드_인자(변수)전달하기

zelkova 2016. 11. 24. 13:07

<목차로 돌아가기>


  Call by Value

  1.  using System;
  2.  using System.Collections.Generic;
  3.  using System.Linq;
  4.  using System.Text;
  5.  using System.Threading.Tasks;

  6.  namespace ConsoleApplication1
  7.  {
  8.     class Program
  9.     {
  10.         public void Increase(int i)
  11.         {
  12.             i++;
  13.             Console.WriteLine("increase 메소드 안:{0}", var);
  14.             return;
  15.         }
  16.        
  17.         static void Main(string[] args)
  18.         {
  19.             Program pg = new Program(); // 이건 나중에~
  20.             int i=10;
  21.             Console.WriteLine("메소드호출전:{0}", i);
  22.             pg.Increase(i);
  23.             Console.WriteLine("메소드호출후:{0}", i);

  24.         }
  25.     }
  26.  }
결과)


여기서 주의해서 봐야할곳은 

23줄 : 메소드에 i를 집어넣고

13줄 : 여기에서 i를 +1 시키는것을 볼 수 있습니다.

14줄 : 메소드 안에서는 i가 증가하지만 

24줄 : 메소드 밖에서는 i값이 그대로입니다.


따라서 Increase메소드 안과 Increase메소드밖의 Main변수값은 이름만 같지 달라요~

이전의 포스팅에서 정리했던 메소드의 범위를 생각하면 됩니다.



  Call by Reference(참조방식)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;

  6. namespace ConsoleApplication1
  7. {
  8.     class Program
  9.     {
  10.         public void Increase(ref int i)
  11.         {
  12.             i++;
  13.             Console.WriteLine("increase 메소드 안:{0}", i);
  14.             return;
  15.         }
  16.        
  17.         static void Main(string[] args)
  18.         {
  19.             Program pg = new Program(); // 이건 나중에~
  20.             int i=10;
  21.             Console.WriteLine("메소드호출전:{0}", i);
  22.             pg.Increase(ref i);
  23.             Console.WriteLine("메소드호출후:{0}", i);
  24.         }
  25.     }
  26. }


결과)




위에서 보았던 Call by Value와의 차이점은 결과에서도 보이죠..? 

메소드안에 있는값을 변경했는데 메소드밖의 값이 변경되었습니다.

ref로 인하여 지역변수를 만드는 것이 아니라 외부의 변수값을 참조하여 사용하는 것입니다.


11줄, 23줄 : ref 참조




  out(출력인자 방식)


메소드는 보통 return문에 의하여 하나만 돌려주므로, 값 여러개를 돌려받고 싶은 경우 출력인자방식을 사용한다.


  1.  using System;
  2.  using System.Collections.Generic;
  3.  using System.Linq;
  4.  using System.Text;
  5.  using System.Threading.Tasks;

  6.  namespace ConsoleApplication1
  7.  {
  8.     class Program
  9.     {
  10.         public void Increase(out int var1,out int var2)
  11.         {
  12.             var1 = 1100;
  13.             var2 = 2000;
  14.         }
  15.        
  16.         static void Main(string[] args)
  17.         {
  18.             Program pg = new Program(); // 이건 나중에~
  19.             int i = 10;
  20.             int j = 5;
  21.             Console.WriteLine("메소드호출전:i:{0},j:{1}", i,j);
  22.             pg.Increase(out i, out j);
  23.             Console.WriteLine("메소드호출후:i:{0},j:{1}", i, j);
  24.         }
  25.     }
  26.  }


결과)

그러하다 ㅇㅇ...



  params(가변길이 인자방식)


인자(변수)목록의 길이가 고정적이지 않고 상황에 따라 변화하는 호출을 지원한든 인자를 말한다.  인자를 일일히 바꾸지 않고 개수를 늘리거나 줄일 수 있습니다. 


  1.  using System;
  2.  using System.Collections.Generic;
  3.  using System.Linq;
  4.  using System.Text;
  5.  using System.Threading.Tasks;

  6.  namespace ConsoleApplication1
  7.  {
  8.     class Program
  9.     {
  10.         public int average(params int[] ar)
  11.         {
  12.             int averageVar=0;
  13.             for(int i=0; i < ar.Length; i++)
  14.             {
  15.                 averageVar = averageVar + ar[i];
  16.             }
  17.             averageVar = averageVar / ar.Length;

  18.             return averageVar;
  19.         }
  20.        
  21.         static void Main(string[] args)
  22.         {
  23.             Program program = new Program();
  24.             int averageVar;
  25.             averageVar = program.average(78,65);
  26.             Console.WriteLine("평균값은 : {0}",averageVar);
  27.             Console.Write("\n");

  28.             averageVar = program.average(100,64,78,58,66,30);
  29.             Console.WriteLine("평균값은 : {0}", averageVar);
  30.         }
  31.     }
  32.  }


결과)



반응형

'컴퓨터프로그래밍 > C#' 카테고리의 다른 글

C# - 클래스, 객체지향의 개념잡기  (0) 2016.11.24
C# - 메소드 오버로딩  (0) 2016.11.24
C# 변수의 범위  (0) 2016.11.22
C# - 메소드  (6) 2016.11.22
C# - 배열  (2) 2016.11.21