본문 바로가기

Udemy 강의 후기/Udemy - POCU C# 프로그래밍 기초

Default Parameter와 out 매개변수

기본 매개변수(Default Parameter) - JS에도 있음!

 

말 그대로 함수에 전달된 파라미터의 값이 undefined나 아무것도 전달되지 않았을때,

기본으로 설정해둔 값을 쓴다는 소리이다.

 

강사님은 게임 프로그래머 출신이라 게임에 빗대서 설명을 하셨는데,

만약 몬스터의 난이도가 따로 주어지지 않았으면 0, 즉 Easy가 기본값일때 쓸수 있다는 식으로

설명을 하셨다.

 

예를들어 

 

static float getHP(int level, int mapID, int difficulty = 0) 

라고 쓸수 있다.

 

그냥 언뜻 보면 '아 이거 실수 방지용으로 상당히 괜찮은 기능 아닌가?' 라는 생각이 들 수 있지만

다음과 같은 사항을 조심해야 한다

 

1. 중간에 누군가 기본값을 추가하거나, 삭제한다면, 코드가 제대로 동작하지 않을 수 있음

- 파라미터의 순서는 굉장히 중요하기 때문.

 

2. 기본값 자체를 누군가 바꾼다면 프로그램이 굉장히 이상해짐

- 난이도가 0이 기본이 아니라 1로 누군가 바꿔버린다면 나중에 0에서 1로 난이도를 올려도 난이도 설정이 안되는 괴상한 일이 발생할수 있음.

(사실 이 대목에서 강사님이 몬스터 체력이 HP*Difficulty 라고 설명을 하시는데, LOL에 등장하는 두꺼비나 바론같은 것들이 시간에 따라 HP나 공격력이 곱연산으로 수치가 정해진다고 알고있어서 신기했음)

 

그래서 결론은

남발하지 말자 + 기본 매개변수는 제일 뒤에서부터 채워넣는다 + 복잡하게 기본 매개변수를

설정하지 말것 정도가 있겠다.

 

 

OUT 매개변수

static void Divide(int a, int b, ref int qutient, ref int remainder)

{

    qutient = a / b;

    remainder = a % b;

}

 

int a = 20;

int b = 3;

int c = 0;

int d = 0;

이 함수를 실행하면  

a: 20 b:3 c:6 d:2
라는 결과가 나오는 심플한 코드인데, 

여기서 두가지 문제가 있다.

 

1. 어차피 몫과 나머지는 뭐가되었던 구해질텐데, 이걸 굳이 0으로 초기화를 해야되나?
2. 만약에 a나 b가 변수로 안들어올 경우, 에러메시지가 뜨지 않는다! 

그걸 위해 out 키워드가 등장했는데,

1. 0으로 초기화를 안해도 됨
2. out매개변수를 함수 안에서 선언을하던, 연산을 하던 꼭 '언급'이 되어야함!

두가지 장점이 있어서, 좀 더 안전한 방법을 추구할때 쓰는 키워드이다.

 

출처 : https://qzqz.tistory.com/109