SSISO Community

갤러리정

메소드 - CSharp

인자를 가지는 메소드
- 입력인자(Argument, parameter)매개변수
- 메소드 호출시 전달할 값이 있을 경우 인자를 통해 전달

 

return문
- 메소드의 연산결과를 반환하기 위해 사용
- 객체 or 변수변환가능
- 값 변환시 제어도 같이 이동(즉, return문 이후 코드는 접근 불가 코드)
- 리턴형이 void가 아닌경우를 제외하곤 반드시 return문을 가져야 한다.
- 리턴값은 단일값만 가능
- 반드시 데이터 타입이 같거나 암시적으로 형변환이 가능한 데이터 반환


인자사용
- 값으로 전달(Call by Balue) : 입력 전용인자
- 참조로 전달(Call by Reference) : 입출력 겸용 인자
- 출력 파라미터(Output parameter): 출력 전용인자
- 가변 인자 리스트

 

값으로 전달
- 메소드 호출시 변수의 값을 복사해서 메소드로 전달
- 메소드 내에서 인자값이 변경될수 있다.(Side Effect)가 없다.
- 메소드 안의 값은 밖에서 확인 불가능
- 인자값은 호환가능(암시적 형변환 가능)

 

참조에 의한 전달
- 값을 전달하는 것이 아니라 변수의 메모리 주소를 전달
- ref키워드 사용
- 인자의 데이터형이 일치해야 한다(암시적으로 형변환 불가능)
- 참조 전달시 반드시 변수값 초기화

 

  public static void callrefTest()
  {
      int i = 3;
      refTest(ref i);
      Console.WriteLine("Main출력 : " + i);
  }

  public static void refTest(ref int i)
  {
      Console.WriteLine("Test출력"+i);
      i =100;   
      Console.WriteLine(i);
  }

 

출력파라미터
- 메소드 호출시 값을 넘겨줄 필요가 없을 경우
- 메커니즘은 ref와 유사
- ref처럼 변수를 초기화 시키지 않아도 된다.
- out키워드 사용

 

 public static void callTest()
  {
      int i = 3;
      int j = 10;
      Console.WriteLine("{0}, {1}",i, j);
      Test(out i, out j);
      Console.WriteLine("{0}, {1}",i, j);

  }

 

 public static void Test(out int i, out int j)
  {

      //out으로 참조한 변수에는 값이 할당되지 않은상태이다.

      //때문에 변수값이 한번이상 변경 되지 않는 상태에서 사용하려 하면 오류발생

      i =100;
      j =200;
      Console.WriteLine("{0}, {1}",i, j);
  }

 

인자사용 가이드 라인
- value > out > ref
- 값으로 인자를 전달하는 경우가 일반적
- 함수가 반환할 값이 하나일 경우 value
- 함수가 반환할 값이 둘 이상일 경우 ref, out
- 인자가 함수에 대한 입력과 출력 두가지 목적으로 사용될때 ref

 

가변길이 파라미터
- 여러 개의 파라미터를 전달 할 경우
- Call by Value 형식이다.
- 메소드명(params int[] x)
- 인자 앞에 params키워드를 붙여 주면 가변인자됨. 배열 처럼 사용.
- 가변인자와 일반인자를 같이 사용할 경우 : 예) 메소드명(string str, params int[] x)
   -> 반드시 가변인자를 마지막에 명시

 

using System;
class Class1
{

   public static int Method1(params int[] x)
   { 
       int z=0;
       for(int i = 0; i < x.Length; i++)
       {
          z += x[i];
       }
       return z;
    }
   

   public static void Main()
   {
      int y = Method1(10,15,20,35);     

      Console.WriteLine("y의 값은 {0}입니다.",y);
    }
}


재귀메소드(Recursive Method)
- 자기자신을 호출하는 메소드
- 무한 루프 주의

 

  public static void callMethod()
  {
      long factNumber = 0;
      long number = 4;

      factNumber = Factorial(number);
      Console.WriteLine("{0}의 팩토리얼 값은 {1}입니다.", number, factNumber);

  }

 

  public static long Factorial(long number)
  {
      if(number>1)
         return number*Factorial(number-1);
      else
         return 1;
  }

 

메소드 오버로딩(Method Overloading)
- 한 클래스 내에서 같은 이름을 가지지만 다른 동작을 하는 메소드들
- Meshod Signature
- 다양한 종류의 파라미터를 갖는 동일한 이름의 메소드 선언 방식
- 파라미터 형식을 기반으로 내부적으로 별개의 메소드로 인식
- 실제 호출이 되는 메소드는 인자리스트에 의해서 결정(메소드 서명)
- 메소드 서명이 될수 있는 요소 : 메소드명,  인자의 타입, 인자의 갯수, out, ref, params키워드
- 메소드 서명이 될 수 없는 요소 : 인자의 이름, 리턴 타입

 

 1. public static void WriteLine();
 2. public static void WriteLine(int i);
 3. public static void WriteLine(int j);   // 2번과 동일한 메소드로 본다.
 4. public static void WriteLine(int i, int j);
 5. public static int WriteLine(int i);    // 2번과 동일하게 본다.
 6. public static void WriteLine(ref int i);
 7. public static void WriteLine(out int i);  //인자수가 같은경우 ref나 out는 둘중에 하나만 사용가능
 8. public static void WriteLine(string i);
 9. public static void WriteLine(out int i,  int j);  //ref나 out 둘다 사용시 인자수가 다르다면 가능

 

 메소드 오버로딩 가이드 라인
 - 서로 다른 인자 리스트를 가지는 비슷한 메소드를 정의할 경우(이름이 같다 -> 하는일이 비슷)
 - 기존의 코드에 새로운 기능을 추가하는 경우
 - 메소드 오버로딩의 되도록 자재 -> 디버깅, 유지보수 문제.


803 view

4.0 stars