달나라 노트

C# : ref, reference (Global 변수 참조하기, Global 변수 값 변경하기) 본문

C#/C#

C# : ref, reference (Global 변수 참조하기, Global 변수 값 변경하기)

CosmosProject 2022. 5. 30. 20:01
728x90
반응형

 

 

 

아래 코드를 봅시다.

 

using System;

class Sample2
{
    public static void Main()
    {
        int x = 1;
        Console.WriteLine(x);

        Functions f = new Functions();
        f.change_number(x);
        Console.WriteLine(x);
    }
}

class Functions
{
    public void change_number(int x)
    {
        x = x + 10;
    }
}


-- Result
1
1

 

 

        int x = 1;
        Console.WriteLine(x);

 

Main 내부에서 x 변수에 1이라는 값을 할당하고 있습니다.

그리고 x 값을 출력합니다.

여기선 당연히 1이 출력될겁니다.

 

 

 

 

class Functions
{
    public void change_number(int x)
    {
        x = x + 10;
    }
}

 

Functions class를 Sample2 외부에 선언한 후 change_number라는 method를 만들었습니다.

change_number method는 어떤 int인 x를 받아 10을 더한 후 그것을 다시 x에 할당하는 기능을 가집니다.

 

 

 

 

        Functions f = new Functions();
        f.change_number(x);
        Console.WriteLine(x);

 

다시 Main으로 와서 Functions class를 f변수에 상속한 후 f의 change_number method를 호출합니다.

change_number method의 인자는 처음에 선언된 int x = 1이 주어졌습니다.

 

change_number method는 x를 받아 10을 더한 후 그 결과를 x에 다시 할당하는 기능을 가진다고 했으니 change_number method의 결과로 x를 출력하면 11이 될까요?

 

아닙니다.

결과는 1입니다.

 

왜일까요?

 

change_number method는 Sample2의 외부에서 별도의 Functions라는 class에서 선언되었습니다.

반면에 int x 변수는 Sample2의 Main method에서 선언되었죠.

 

 

 

class Functions
{
    public void change_number(int x)
    {
        x = x + 10;
    }
}

 

따라서 change_number method에서 x = x + 10을 수행할 때 왼쪽에 있는 x는 Main에서 선언된 x가 아닙니다.

즉, change_number method에서는 Main에서 선언된 변수들의 값을 변경할 수 없습니다.

 

그래서 결국 x = x + 10의 과정을 거쳐도 x값은 그대로 1인 것입니다.

 

 

 

그렇다면 Main에서 선언된 x값을 Functions class에서 선언된 change_number method에서 변경하려면 어떻게 해야할까요?

이럴 때 사용할 수 있는 키워드가 바로 ref(reference) 입니다.

 

 

위 코드를 살짝 바꿔봅시다.

 

 

 

using System;

class Sample2
{
    public static void Main()
    {
        int x = 1;
        Console.WriteLine(x);

        Functions f = new Functions();
        f.change_number(ref x);
        Console.WriteLine(x);
    }
}

class Functions
{
    public void change_number(ref int x)
    {
        x = x + 10;
    }
}


-- Result
1
11

 

일단 결과를 보면 1과 11이 출력되었습니다.

이 말은 change_number method에서 참조한 x가 바로 Main에서 선언된 x 변수 자체의 값을 건드렸다는 의미입니다.

 

수정된 부분이 어떤건지 하나씩 봐봅시다.

 

 

class Functions
{
    public void change_number(ref int x)
    {
        x = x + 10;
    }
}

 

일단 change_number method에서 parameter를 보면 int x 가 아니라 ref int x로 적혀있습니다.

 

ref 키워드가 붙은 parameter는 단순히 어떤 값을 전달하는게 아니라 전달받은 변수 자체를 참조한다는 의미라고 받아들입시다.

 

 

 

        Functions f = new Functions();
        f.change_number(ref x);
        Console.WriteLine(x);

 

그리고 change_number method 호출 부분에서도 x값을 전달할 때 ref x로 전달하고 있습니다.

변수 x를 참조의 형태로 전달한다는 의미입니다.

 

이렇게되면 Sample2 외부에서 선언된 change_number method는 Main에서 선언된 x라는 변수 그 자체를 건드릴 수 있게 됩니다.

 

따라서 change_number 함수 내에서 x = x + 10의 연산을 진행할 때, x + 10의 결과가 할당되는 x는 Main에서 선언된 int x = 1; 이라는 것이죠.

이것이 change_number method가 실행된 후 x를 출력해보면 1 + 10 = 11이 출력되는 이유입니다.

 

 

 

 

 

 

 

using System;

class Sample2
{
    public static void Main()
    {
        int x = 1;
        Console.WriteLine(x);

        Functions f = new Functions();
        f.change_number(ref x);
        Console.WriteLine(x);
    }
}

class Functions
{
    public void change_number(ref int k)
    {
        k = k + 10;
    }
}


-- Result
1
11

 

참고로 위처럼 change_number 함수 선언 부분에서 parameter의 이름은 원하는대로 정해도 됩니다.

주의할 점은 ref 키워드를 붙여야한다는 것이며 change_number 함수를 호출할 때 ref x를 전달하면 됩니다.

 

 

 

 

 

 

728x90
반응형
Comments