2024. 3. 27. 22:53ㆍC#/구문
우리가 함수를 사용하다 보면 여러 클래스의 객체들을 이용하여 계산하거나 처리하는 경우가 많다.
그때 함수에 전달하는 변수(인수)들을 우리는 매개 변수라고 이야기 한다.
매개 변수들을 전달하는 방식은 크게 값에 의한 전달과 참조에 의한 전달로 나눌 수 있으며
기본적으로 함수에 전달되는 인수들은 값에 의한 전달 형식이다.
값에 의한 전달은 원본 변수의 값을 복사하여 해당 메소드들에게 넘기는 것을 의미하는데,
말 그대로 복사하여 전달하기 때문에 메소드에서 처리한 값이 원본 데이터에게 영향을 미치지 않는다.
그러나 참조에 의한 전달 방식은 원본 데이터의 주소(참조)를 해당 메소드에게 넘기는 것으로
메소드에서 처리된 값들은 그대로 원본 데이터에게 영향을 미친다.
우리가 주로 사용하는 클래스와 같은 경우는 참조에 의한 전달 방식으로
메서드가 다른 클래스의 원본 데이터에게 직접적인 영향을 줄 수 있습니다.
(접근 제한자가 public 인 형태 혹은 상속 받은 경우 protected 의 형태로 제한된다.)
반면 구조체는 값에 의한 전달을 기본형으로 가지고 있어
메서드에서 처리된 데이터는 해당 메서드가 종료되면 즉시 소멸됩니다.
그러나 우리는 이것을 in, out, ref, readonly ref과 같은 한정자를 매개 변수로 선언하여 극복할 수 있다.
ref : 메서드를 호출하기 전에 인수를 초기화 해야 한다.
또한 매개 변수의 인수에는 ref 한정자가 포함되어야 한다.
//메서드의 정의와 호출 모두 ref 한정자를 명시해줘야 한다.
void Method(ref int refArgument)
{
refArgument = refArgument + 44;
}
int number = 1;
Method(ref number);
Console.WriteLine(number);
// Output: 45
메서드가 인수값을 읽거나 쓸 수 있음을 의미한다.
out : 메서드를 호출하기 전에 인수를 초기화해줄 필요가 없다.
매개 변수의 인수에는 ref 한정자와 동일하게 포함되어 있어야 한다.
//메서드를 호출하는 인수에 out 한정자를 명시.
int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod); // value is now 44
//호출하기 전까지 미리 초기화할 필요가 없다.
void OutArgExample(out int number)
{
number = 44;
}
메서드가 인수 값을 설정함을 의미한다.
in : 메서드 선언에는 필요하지만 호출 사이트에는 필요하지 않다.
int readonlyArgument = 44;
InArgExample(readonlyArgument);
Console.WriteLine(readonlyArgument); // value is still 44
//매개 변수에 in 한정자 명시
void InArgExample(in int number)
{
// Uncomment the following line to see error CS8331
//number = 19;
}
메서드가 읽기는 하지만 인수 값을 사용할 수 없다.
void ModifyValue(in int value)
{
int k = value + 5; // 오류: 'value'는 읽기 전용
}
'C# > 구문' 카테고리의 다른 글
[ C# ] 리스트(List) (0) | 2024.03.13 |
---|---|
[ C# ] Action 과 Func (1) | 2024.03.13 |
[ C# ] 예외 처리 (0) | 2024.03.11 |
[ C# ] foreach 문 (0) | 2024.03.04 |