728x90
반응형
1. 핵심 정리
using System;
class Program {
public static int Sum(int a, int b) {
return a + b;
}
public static void Main() {
int s1 = Sum(1, 2);
int s2 = Sum(1, 2, 3);
Console.WriteLine($"{s1}, {s2}");
}
}
위와 코드는 인자의 합을 리턴하는 Sum함수가 있고, Main에서 사용하고 있다.
s1 같은 경우는 문제가 없지만
이번에 s2와 같이 3개의 합을 구하고 싶다고 해보자.
당연히 인자를 3개 받는 Sum함수는 없기에 에러가 난다.
그럼 3개짜리를 만들면 되지만 이후 4개, 5개가 필요할 수도 있는데
어떻게 처리해야 할까?
ⓛ 메소드의 인자 개수를 가변 길이로 하는 방법
=> 방법1. 배열을 사용해서 전달
using System;
class Program {
public static int Sum(int[] arr) {
int s = 0;
foreach(int n in arr)
s += n;
return s;
}
public static void Main() {
int s1 = Sum(new int[] {1, 2});
int s2 = Sum(new int[] {1, 2, 3});
Console.WriteLine($"{s1}, {s2}");
}
}
=> 방법2. 가변 길이 매개 변수(variable length parameter) 사용
using System;
class Program {
public static int Sum(params int a, int b) {
return a + b;
}
public static void Main() {
int s1 = Sum(1, 2);
int s2 = Sum(1, 2, 3);
int s3 = Sum(new int[] {1, 2});
int s4 = Sum(new int[] {1, 2, 3});
Console.WriteLine($"{s1}, {s2}");
}
}
배열을 사용하게 되면 해결이 되지만
인자를 적는곳에 배열을 일일이 쓰는 것보다 원하는 정수만 넣는게 편해보인다.
그럴 경우 인자를 받는곳에 params 라는 키워드를 사용하면 된다.
params를 사용하게 되면 정수만 전달해도 처리가 되고
그대로 배열을 만들어 보내도 처리가 된다.
2. 좀 더 살펴보기
using System;
class Program {
public static void f1(params int[] arr) {
}
public static void Main() {
f1(1, 3.4, "Hello");
}
}
위의 코드는 전과 비슷하지만 이번엔 데이터 타입이 다른 경우이다.
현재 인자는 int타입으로 정수만 보낼 수 있지만 실수와 문자열도 보내고 싶다.
이럴 땐, 결국 모든 데이터 타입들은 기반 클래스가 object이므로 object로 받으면 된다.
① 서로 다른 타입 여러 개를 인자로 받고 싶다면
=> object 타입을 사용
using System;
class Program {
public static void f1(params object[] arr) {
foreach(object o in arr) {
Console.WriteLine(o.ToString());
}
}
public static void Main() {
f1(1, 3.4, "Hello");
}
}
② 주의 사항
=> params는 마지막 인자에만 사용할 수 있다.
using System;
class Program {
public static void f1(int a, params object[] arr) { }
public static void f2(params object[] arr, int a) { } // error
public static void Main() {
f1(1, 2, 3, 4);
f2(1, 2, 3, 4); // error
}
}
③ 성능의 문제
=> 항상 배열을 힙에 생성하게 되므로 성능 저하가 있을 수 있다.
=> 자주 사용하는 버전의 메소드는 별도로 제공하는 것이 좋다. (Console.WriteLine 클래스)
728x90
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] Extension Method (0) | 2020.03.09 |
---|---|
[C#] Named, Optional Parameter (0) | 2020.02.28 |
[C#] 인자 전달 방식 (2) (0) | 2020.02.17 |
[C#] 인자 전달 방식 (1) (0) | 2020.02.15 |
[C#] 다차원 배열, 가변 배열 (1) | 2020.02.14 |