메소드의 인자 목록을 이용해서, 호출하는 쪽에서 메소드로 인자 값을 넘겨 메소드에서 이를 사용할 수 있게 합니다.
인자로 사용하는 변수의 형식에 따라 인자는 값형 변수, 참조형 변수로 나눌 수 있으며, 인자 전달 방법은 이러한 인자의 형식에 따라 달라집니다.
인자 전달 방법
값에 의한 전달 (인자가 값형 변수일 때)
C#에서 일반적으로 사용하는 전달 방법이며, 인자로 사용하는 변수를 메소드에 그대로 전달하는 방식이고, 이때 사용하는 변수는 자신의 변수 형식에 맞는 변수 값을 포함합니다.
class Program
{
public void Increase(int n)
{
n++;
}
static void Main(string[] args)
{
int i = 10;
Program pr = new Program();
Console.WriteLine("호출전 : {0}", i);
pr.Increase(i);
Console.WriteLine("호출후 : {0}", i);
}
}
값형의 변수를 값에 의한 참조 방식으로 전달하게 되면, 전달하는 인자와 전달받은 변수의 메모리는 각각 다른 곳에 생성되며, 단순히 호출하는 쪽에서 호출받는 메소드로 값의 전달만 있을 뿐입니다.
값에 의한 전달 (인자가 참조형 변수일 때)
참조형 변수란 변수명을 통해서 값이 아닌, 변수의 저장된 메모리를 참조하는 변수를 말합니다. 그렇기 때문에 참조형 변수를 인자로 해서 메소드에 인자를 전달하면, 메소드에서 받은 인자를 변화시켰을 때, 전달된 변수의 메모리에도 변화가 발생하기 때문에 원래의 변수의 값에도 영향을 미치게 됩니다.
public class ParamRef
{
public int myVal = 10;
}
public class Program
{
public static void Increase(ParamRef varRef)
{
varRef.myVal++;
}
static void Main(string[] args)
{
ParamRef pr = new ParamRef();
Console.WriteLine("호출전 : {0}", pr.myVal);
Program.Increase(pr);
Console.WriteLine("호출후 : {0}", pr.myVal);
}
}
참조에 의한 전달 (인자가 값형 변수일 때)
값에 의한 전달 방식이 주어진 인자를 인자의 형태 그대로 전달하는 방삭에 비해, 참조에 의한 전달 방식은 인자로 사용된 변수 값이 아닌 참조를 전달하는 방식을 의미합니다.
결국, 참조형 변수를 인자로 사용하는 방식과 같은 원리며, 전달하는 인자의 변수명 앞에 ref 키워드를 사용해서 참조에 의한 전달 방식임을 알려줍니다.
참조에 의한 전달 (인자가 참조형 변수일 때)
인자로 사용할 변수가 참조형 변수이고, 전달 방식 또한 참조에 의한 방식입니다.
출력인자 방식
출력인자 방식이란 메소드를 호출할 때 사용하는 인자 값을 호출받는 메소드의 실제 인자를 넘겨주는 방식을 말합니다.
출력인자 방식은 out 키워드를 사용해서 정의하며, 참조 방식에 의한 전달과 같은 동작을 하지만 호출받은 메소드로부터는 어떤 값도 받지 않습니다. 즉, 호출받은 메소드의 결과 값의 리턴형은 void 입니다.
메소드는 보통 return문에 의해 값 하나만을 돌려주므로, 값 여러개를 돌려 받고 싶은 경우에 출력인자 방식을 사용합니다.
class Program
{
public void Increase(out int n)
{
n = 11;
}
static void Main(string[] args)
{
int i;
Program pr = new Program();
pr.Increase(out i);
Console.WriteLine("호출 후 값 : {0}", i);
}
}
가변길이 인자 방식
가변길이 인자 방식이란, 호출하는 메소드에 지정하는 인자 목록의 길이가 고정적이지 않고 상황에 따라 변화하는 호출을 지원하는 인자를 말합니다.
가변길이 인자 방식의 특징은 다음과 같습니다.
- params 키워드를 사용해서 정의한다.
- params 키워드를 사용해서 전달된 가변 길이 인자는 값에 의한 전달 방식으로 인식되어, 메소드의 인자 값이 메소드 호출 쪽의 인자 값으로 전달됩니다.
class Program
{
public int VarMethod(params int[] arr)
{
int sum = 0;
for (int i = 0; i < arr.Length; i++)
{
sum = sum + arr[i];
}
return sum;
}
static void Main(string[] args)
{
int result;
Program pr = new Program();
result = pr.VarMethod(10, 20);
Console.WriteLine(result);
result = pr.VarMethod(1, 2, 3, 4);
Console.WriteLine(result);
}
}
[출처] 메소드 인자 전달하기|작성자 웃진
댓글 없음:
댓글 쓰기