• Home
  • About
    • KKsDev photo

      KKsDev

      게임 프로그래머를 목표로 Unity, C#을 공부하고 있습니다.

    • Learn More
    • Email
    • Github
    • Steam
  • Posts
    • All Posts
    • All Tags
  • Projects

C# 매개변수 한정자 ref, out 키워드

17 Jul 2023

Reading time ~1 minute

매개변수 한정자?

어떤 함수가 있을 때 해당 함수의 매개변수의 앞에 붙이는 키워드를 매개변수 한정자라고 한다.

이를 통해서 매개변수에 특정한 기능, 역할을 부여할 수 있다.

out 키워드

out 키워드는 매개변수 한정자 중 하나이다.

반환타입 함수이름 (out 타입 변수이름) 의 형태를 가진다.

int a;
int b;

int Func(out int x, out int y)
{
    x = 5;
    y = 10;
    return x + y;
}

Console.WriteLine(Func(out a, out b));
Console.WriteLine(a);
Console.WriteLine(b); 

매개변수 한정자가 out이라면 함수를 호출할때 매개변수에 out 한정자 를 붙혀줘야 한다.

함수 Func()은 변수 a와 b의 참조를 전달 받는다.

이때 변수 a와 b에는 값이 초기화 되지 않아도 된다.

대신 반드시 함수 내에서 out 매개변수에 값을 할당해야만 한다.

즉 out 매개변수는 함수에서 여러가지 값을 반환하기 위해서

값을 반환받을 메모리 공간을 매개변수로 요청하는 문법이다.

ref 키워드

ref 키워드도 매개변수 한정자 중 하나이다.


void Func (ref int x, int y){
    x += y;
    y += x;
}

int a = 10;
int b = 20;
Func(ref a, b);

Console.WriteLine(a); // 30출력 함수 내부 연산의 영향을 받았다.
Console.WriteLine(b); // 20출력 함수 내부 연산의 영향을 받지 않았다.

매개변수 한정자가 ref라면 함수를 호출할때 매개변수에 ref 한정자를 붙혀줘야 한다.

기본적으로 C#에서 함수에 매개변수를 전달할때 Func의 두번쨰 매개변수 b처럼 call by value를 한다. 이때 함수 내부에서 발생한 연산의 결과는 b의 원본에는 아무런 영향을 주지 못한다.

하지만 ref 키워드를 사용해 명시적으로 call by reference를 할 수 있다. 참조로 전달을 하게되면 함수 내부에서 발생한 연산의 결과가 원본인 a에 영향을 끼치게 된다.

ref와 out의 차이점

out은 매개변수로 줄 변수가 초기화 되어있지 않아도 상관이 없었다.

out에서 필요로 하는건 오직 값을 반환받기 위한 메모리 공간이기 떄문이다.

하지만 ref는 변수의 값을 참조전달 받기 위한 문법이기 때문에 변수가 미리 초기화 되어있어야만 한다.

대신 out 과 다르게 함수 내부에서 ref 매개변수의 값을 할당하지 않아도 된다.



CSharp Share Tweet +1