본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 14.매개변수

기본적으로 C# 에서는 함수를 호출할때

함수가 정의된 파라미터와 자료형, 순서, 개수등이 동일해야한다.


그러나 이를 모두 맞춰주는것이 상당히 불편한 상황이 생길수있어

C#에서는 다양한 매개변수 스타일을 제공해준다



1. 가변길이 매개변수

여러가지 숫자의 합을 리턴해주는 함수를 만든다고 해보자

static int Sum(int x, int y)
{
return x + y;
}
static int Sum(int x, int y, int z)
{
return x + y + z;
}
static int Sum(int x, int y, int z, int w)
{
return x + y + z + w;
}

다음과 같이 2개짜리 3개짜리 4개짜리 ... 을 만들어야 할것이다.

이러한 상황을 해결하기위하여 나온것이 가변길이 매개변수이다.


using System;

namespace ConsoleApp1
{
class Program
{
static int Sum(params int[] args)
{
int sum = 0;
foreach (int item in args)
{
sum += item;
}
return sum;
}

static void Main(string[] args)
{
int sum = Sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Console.WriteLine("합:{0}", sum);

}
}
}


다음과같이 params  키워드와 뒤에 배열을 받으면

자동적으로 받은 파라미터를 배열의 순차적으로 집어놓고 사용할수 있게 한다.



2. 디폴트 파라미터 (선택적 매개변수)

게임에서 사용자 ID 를 출력하는 함수를 만들었다고 해보자


using System;

namespace ConsoleApp1
{
class Program
{
static void PrintUser(string username)
{
Console.WriteLine("{0}님 안녕하세요~", username);
}

static void Main(string[] args)
{
PrintUser("킹갓");
PrintUser("망겜수준");
}
}
}


킹갓님 안녕하세요~
망겜수준님 안녕하세요~

해당 함수를 사용중인데 로그인하지 않고 사용하고 싶어하는 유저들이 있어 로그인하지 않은경우

일반사용자님 안녕하세요~ 라는 메시지를 띄우고 싶다.

근데 각종 게임을 만들면서 사용하다보니 로그인하지 않고 사용하는 유저들이 너무많아

이럴때마다 


PrintUser("일반사용자")


처럼 "일반사용자" 를 인자로 넘겨줘야하는것이 너무 귀찮아졌다.

그럴때 사용하는것이 디폴트 파라미터이다.

using System;

namespace ConsoleApp1
{
class Program
{
static void PrintUser(string username = "일반사용자")
{
Console.WriteLine("{0}님 안녕하세요~", username);
}

static void Main(string[] args)
{
PrintUser("킹갓");
PrintUser("망겜수준");
PrintUser(); //인자를 넘기지 않음
}
}
}


킹갓님 안녕하세요~
망겜수준님 안녕하세요~
일반사용자님 안녕하세요~


다음과 같이 함수 정의에서 파라미터값을 미리 정해놓으면 해당 인자가 들어가지 않았을경우 미리 정해준 인자가 들어가게된다.



using System;

namespace ConsoleApp1
{
class Program
{
static void PrintUserMessage(string username = "일반사용자", string message = "안녕하세요")
{
Console.WriteLine("{0}님 {1}", username, message);
}

static void Main(string[] args)
{
PrintUserMessage("킹갓", "강퇴당하였습니다.");
PrintUserMessage("망겜수준");
PrintUserMessage();
}
}
}

킹갓님 강퇴당하였습니다.
망겜수준님 안녕하세요
일반사용자님 안녕하세요

위와 같이 사용가능하다.


디폴트 파라미터를 정할때 주의할점은

파라미터 뒤부터 채워져야 한다는것이다.

이유는 해당 함수를 쓸때 우리가 파라미터를 앞에서 부터 채워넣기때문이다.





3. 키워드 매개변수

위 함수에서 일반사용자에게 다른메시지를 띄워주고 싶으면 어떻게할까?

PrintUserMessage("강퇴당하였습니다.")

이렇게 해버리면..

강퇴당하였습니다.님 안녕하세요

과 같이 출력되게된다.

기본적으로 함수의 인자는 들어가는 순서에 따라 정해지게 되어있어 처음들어가는 인자는 username이어야한다.

따라서 결국

PrintUserMessage("일반사용자" ,"강퇴당하였습니다.")

일반사용자님 강퇴당하였습니다.

과 같이 일반사용자가 디폴트 인수임에도 불구하고 넘겨주어야하는데

C# 에서는 이와 같은 상황을 해결하기위해 키워드 인수 방법을 제공한다.


using System;

namespace ConsoleApp1
{
class Program
{
static void PrintUserMessage(string username = "일반사용자", string message = "안녕하세요")
{
Console.WriteLine("{0}님 {1}", username, message);
}

static void Main(string[] args)
{
PrintUserMessage("킹갓", "강퇴당하였습니다.");
PrintUserMessage("망겜수준");
PrintUserMessage(message:"강퇴당하였습니다.");
}
}
}

과같이 파라미터 이름을 지정하면서 넘겨주게 되면 해당 파라미터로 값이 들어가게된다.

파라미터명:파라미터값 으로 순서에 맞지 않아도 파라미터의 이름으로 값을 넘겨 줄수있다.

728x90