삽질의 현장/- .NET

#015_닷넷(.NET)_.Net Framework 기본 - 매개변수 한정자

shovelman 2015. 10. 23. 01:52


안녕하세요 삽잡이입니다.


지금부터 매개변수 한정자에 대해서 알아보도록 하겠습니다.


매개변수에는 크게 두 가지가 있습니다.

바로, '입력 매개변수'와 '출력 매개변수'입니다.


입력 매개변수는 'Client 쪽에서 Server 쪽으로 값을 읽기 위한 목적'의 매개변수입니다.

따라서 '인 파라메터'라고 부릅니다.

그리고 'Server 쪽에서 Client 쪽으로 값을 보내기 위한 목적'의 매개변수를

'아웃 파라메터'라고 부릅니다.


C#에서는 출력 매개변수를 다시 두 개로 더 쪼갭니다.

하나는 위에서 언급한 '아웃 파라메터'이고,

또 다른 하나는 '읽고 쓰는 목적'의 파라메터인, 'ref 파라메터'입니다.


일반적으로 읽고 쓰는 것도 '쓰는 것'으로 취급하고

쓰는 것도 '쓰는 것'이니 out 파라메터로 분류를 했었는데

C#에서는 이를 더욱 더 구체화 시킨 것입니다.


 

 

대표적인 out 파라메터의 예시로는

Add(a, b, sum) 함수를 들 수 있습니다.

만약, 매개변수로 a,b가 in 파라메터로 들어가고 sum을 out 파라메터로 보낼 때

sum에다가 a,b로부터 가공된 값을 저장하여 받아오는 것이지요...



in 파라메터는 아무거도 붙이지 않습니다...

out 파라메터는 '받아오겠다!'는 의미로써 out을 매개변수 앞에 붙입니다...



그런데 많이들 아시는 Swap(a, b) 함수쳐럼 매개변수 a, b를 가져갔다가

채우고 돌아오는 경우에는 ref 파라메터가 해당되는 것입니다.


 


ref 한정자는 '가져다가 쓰고', '이용하려고 쓰고'... 둘 다 하려는 파라메터에 붙입니다.

즉, '가져다가 값을 쓰고',' 값을 바꾼다.' 의 의도를 가지고 있습니다...


그래서 '담아오는' 역할을 하는 out 파라메터와 달리

ref 파라메터는 무조건 초기화를 해줘야합니다.


out 파라메터는 쓰고자하는 목적이 있습니다.

따라서 값이 입력되서 매개변수로 넘어간다는 보장을 할 수 없습니다.

즉, 제대로 된 값이 매개변수로 넘어온다는 보장을 할 수 없기 때문에

ref 파라메터와 out 파라메터는 목적에 맞게 명확하게 사용해야합니다.


여담으로 말씀드리자면, out 파라메터는 사실 객체지향에서 많이 쓰지 않습니다...


마지막 매개변수 한정자가 더 있습니다...


만약, 인수가 정해지지 않은 경우에는 매개변수를 어떻게 받아야할까요?

기존 C/C++에서는 int면 int, char면 char 와 같이

시그니처에 맞는 매개변수만을 필요로 했었습니다.


하지만, C#에서는 이와 같이 사용할 수 있습니다.



이처럼 int형 배열을 만들고 앞에 'params' 키워드를 붙이면 

'정수형 인자가 한개 이상 들어올 수 있다'는 사실을 말하게됩니다.

즉, 인수들의 목록을 배열로 받겠다는 매개변수 한정자인 것입니다...


params 키워드가 없다면, 정수형 배열만을 받겠다는 의미가 되지만

params 키워드가 있을 때는 몇개의 정수가 들어오던

'int형 배열'로 받겠다는 의미입니다.

추가적으로 int형 배열도 매개변수로 받을 수 있게 됬지요...


정말 신기하고 재미있는 기능이지요?!

그렇다고 해주세요... 허허...


그런데 더욱 신기한 기능이 있습니다...



각기 다른 형식들이 모인 집합을 매개변수로 받을 수 있다 이겁니다...

와우... 쇼킹합니다...


어떻게 받을 수 있을까요?

사실 hint는 Test Class에 적어뒀습니다...

모든 형식의 부모는 'object'라고 했습니다... 따라서 object형식으로 받으면 되지요...

부모 형식으로는 모두 가능하지 않겠습니까?

이 object를 출력하라고 하니 무조건 적으로 'ToString()' 메서드가 호출이 되지요...

이는 다형성에 의해서 자동으로 출력이 됩니다.


그런데 정말 놀랍지 않습니까...

class도 출력이 됩니다... 왜냐! class도 부모가 'object'이기 때문입니다...

그런데 위의 예제 코드를 출력하면 클래스의 이름이 출력됩니다.

object의 ToString() 메서드가 출력이 되기 때문입니다.


따라서 Test Class만의 출력을 원한다면

ToString() 메서드를 자식 클래스에서 재정의 해주면 되겠지요...


params 키워드에 대해서 정리하자면

인수들을 배열로 받는 방식을 확인했습니다.

단, 인수들이 배열에 들어갈 수 있어야됩니다... 배열의 원소로써 말입니다...

한마디로 object 배열을 만들어 놓은 순간 

'어떤 형식' 이던지 배열의 원소로 받을 수 있습니다.

닷넷에서 모든 객체의 부모는 'object'이기 때문이지요!


그리고 어떻게 모든 형식을 출력할 수 있느냐에 대해서 질문을 가지실 수 있습니다.

어느 이전 시간에 언급했는데...

ToString() 메서드가 호출이 되기 때문에

각 형태에 맞게 출력되도록 오버라이드가 되어 있어 

각 형식에 맞게 출력이 되는 것입니다.


정리하자면 생략, in, out, ref, params 라는 매개변수 한정자가 있는 것이군요...


이번 시간은 여기까지 하도록 하겠습니다.


이상 삽잡이였습니다!