본문 바로가기

C# 프로그래밍/문법 개념

[C#] 메서드 매개 변수 (params, in, out , ref)

반응형

params

매개 변수를 여러 개(배열 형태) 전달할 수 있게 해주는 키워드

 

단, 반드시 1차원이어야 하며 매개변수의 끝에 위치하여야 한다(params 뒤에는 매개변수가 위치할 수 없다).

 

다음 예시 스크립트를 보자

void Start()
{
    Users("Korea", 1, 2, 3, 4);
}

public void Users(string nation, params int[] id)
{
    for (int i = 0; i < id.Length; i++)
    {
        Debug.Log(nation + id[i]);
    }
}

배열의 크기만큼 for루프를 돌며 로그를 찍는다.

 

로그 결과

params 키워드를 사용하면 매개변수로 배열이 필요한 경우 매번 배열을 선언할 필요 없이 편하게 전달이 가능하다.


ref

매개 변수를 참조로 전달하고 호출된 메서드에 읽고 쓰는 것이 모두 가능한 키워드

 

값 형식의 매개변수를 참조 형식처럼 함수 안에서 수정이 가능하게 해주는 키워드이다.

 

void Start()
{
    int first = 100;
    int second = 200;
    SwapNumber(ref first, ref second);
    Debug.Log(first);
    Debug.Log(second);
}

public void SwapNumber(ref int a, ref int b)
{
    int temp = b;
    b = a;
    a = temp;
}

로그 결과는 second인 200이 먼저 찍히게 된다.


out

매개 변수를 참조로 전달하고 호출된 메서드로 기록되도록 하는 키워드

 

out키워드는 Unity의 RayCast의 매개변수에도 붙어져 있는 키워드이다.

 

값 형식의 매개변수는 함수가 끝남과 동시에 소멸되지만 매개변수로 전달해준 데이터에 수정된 데이터를 다시 넣어주는 기능을 한다.

 

다음 스크립트를 확인해보자.

public class parameters : MonoBehaviour
{
    public Nation invitedNation;
    
    void Start()
    {
        if (IsContinent(37, 126, out invitedNation))
        {
            Debug.Log(invitedNation.name);
        }
    }
    
    public bool IsContinent(float latitude, float longitude, out Nation nationInfo)
    {
        nationInfo.name = "seoul";
        nationInfo.population = 10000000;
        nationInfo.gdp = 100;
        nationInfo.gop = 10;
        if (latitude == 37 && longitude == 126)
        {
            return true;
        }
        return false;
    }
}

public struct Nation
{
    public string name;
    public int population;
    public float gdp;
    public float gop;
}

아무것도 초기화 되지 않는 빈 값 invitedNation이 매개변수로 전달되었지만 로그는 seoul이 찍힌 것을 확인할 수 있다.

 

전달된 값 매개변수(struct)가 참조 형식처럼 데이터를 담게된다.

out을 사용하는 함수에서는 반드시 해당 값 형식의 모든 멤버를 채워야만 한다.


in

매개 변수를 참조로 전달할 수 있지만 호출된 메서드로만 읽을 수 있는 키워드

 

매개변수로 전달한 변수가 함수 내에서 수정되지 않도록 강제하는 기능이 바로 in이다.

 

다음 예시를 살펴보자.

public void NationId(in int id)
{
    id = 10;
}

id라는 int형식의 매개변수를 수정하려고 하면 아래와 같은 에러 메시지가 뜬다.

이러한 방식으로 값이 수정되는 것을 방지할 수 있다.

반응형