본문 바로가기
유니티 공부/C# 문법

C# - 파라미터 전달방식(ref, out, in 키워드), Pass by Value(값에 의한 전달) 및 Pass by Reference(참조에 의한 전달)

by 코딩하는 돼징 2023. 12. 14.
반응형

1. Pass by Value(값에 의한 전달)

파라미터 "값"을 복사해서 파라미터 값 자체를 복사해서 전달하는 방식이다. 

만약 몰래 소주를 마셔서 이를 물로 채워넣는다는 예시로 코드를 작성해보자

class change
{
    public void changeToWater(int leftsoju)
    {
        int water = 100;
        leftsoju = water;
    }
}

public static void Main()
{
    int leftvalue = 0; // 소주를 다 마신 상태
    chang Change = new chang(); 
    Change.changeToWater(leftvalue) // 마신 소주에 물 넣기
    Console.WriteLine(leftsoju);
}

값을 복사해서 전달하기 때문에  weight2와 weight는 별도로 2개의 메모리 영역을 가지게 된다. 그러므로 weight2의 값을 변경하더라도 weight는 변경되지 않는다.

static void Pig(int weight2)
{
    weight2 += 100;
    Console.WriteLine(weight2);
}

public static void Main()
{
    int weight = 10; 
    Pig(weight);
    Console.WriteLine(weight);
}

 


2. Pass by Reference(참조에 의한 전달)

변수에 대한 액세스를 해당 변수의 메모리 주소를 전달하여 메모리를 공유하는 것을 의미한다.

01 ref (read-write)

메서드 내에서 변수를 변경하면 호출자의 변수도 같이 변경된다. 변수를 전달하기전에 초기화가 반드시 되어있어야 한다.

static void Pig(ref int weight2)
{
    weight2 += 100;
    Console.WriteLine(weight2);
}

public static void Main()
{
    int weight = 10;
    Pig(ref weight);
    Console.WriteLine(weight);
}


02 out(write-only)

out키워드로 선언된 매개변수는 메서드 내에서 반드시 초기화해야 된다. 해당 변술르 메서드 내에서 사용하기 전에 값을 할당해야 한다. 호출자에서는 초기화하지 않아도 된다. 호출자는 out키워드로 선언된 매개변수를 호출 전에 초기화할 필요가 없다.

static void Pig(out int o)
{
    o = 100; // 메서드 내에서 초기화 필수
    Console.WriteLine(o);
}

public static void Main()
{
    int value; // 초기화 하지 않아도 된다
    Pig(out value);
}

만약 아래와 같이 메서드 내에서 초기화하지 않고 사용하면 컴파일 오류가 발생한다.

static void Pig(out int o)
{
    Console.WriteLine(o);
}

public static void Main()
{
    int value = 2;

    Pig(out value);
}

03 in (read only)

in 키워드로 전달된 변수는 읽기 전용이므로 수정할 수 없다.

static void Pig(in int r)
{
    Console.WriteLine(r);
}

public static void Main()
{
    int value = 2;
    Pig(in value);
}

아래와 같이 변수를 수정하려고 하면 에러가 나온다.

static void Pig(in int r)
{
    r = 3;
    Console.WriteLine(r);
}

 

 

 

 

 

반응형

댓글