C# 함수(ref, out)

선비Sunbei·2023년 1월 8일
0

C#

목록 보기
4/18
post-thumbnail

함수 선언 방법

using System;

namespace Study2
{
    class Program
    {
        static int Add(int a , int b)
        {
            return a + b;
        }
        static void Main(string[] args)
        {
            Console.WriteLine($"{Add(2,3)}");
        }
    }
}

C#의 함수 선언 방법은 다른 언어와 유사하다.

반환_자료형 함수명(매개변수){ /*본문*/ }

주의할 점은 Main함수가 static 함수이므로 호출하는 함수 또한 static 이어야 한다. 만약 static 함수를 사용하지 않는다면 다음과 같이 객체를 동적 생성 후에 사용해야 할 것이다.

using System;

namespace Study2
{
    class Program
    {
        int Add(int a , int b)
        {
            return a + b;
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            Console.WriteLine($"{p.Add(2,3)}");
        }
    }
}

C#은 JAVA와 마찬가지로 Garbage Collecter가 존재하여 C++처럼 new 후, delete처리에 신경쓰지않아도 괜찮다.

함수의 파라미터와 인자(ref, out)

using System;

namespace Study2
{
    class Program
    {
        static void ChangeValue1(int val) 
            // 값 복사로 넘어온다.
        {
            val++;
        }
        static void ChangeValue2(ref int val) 
            // 참조로 넘어온다.
        {
            val++;
        }
        static void ChangeValue3(int input ,out int val) 
            // val은 참조로, input은 값 복사로 넘어온다.
        {   // val은 out키워드로 인해 반드시 값 할당이 되어야 한다.
            val = ++input;
        }

        static void Main(string[] args)
        {
            int value = 5;
            Console.WriteLine($"now-value : {value}"); 
            // 현재 값 출력

            ChangeValue1(value);
            Console.WriteLine($"now-value : {value}"); 
            // ChangeValue1 함수에서 값 복사로 넘어간다.

            ChangeValue2(ref value);                   
            // 넘겨줄 때도 명시적으로 ref 키워드를 붙여줘야 한다.
            Console.WriteLine($"now-value : {value}"); 
            // ChangeValue2 함수에서 레퍼런스(참조)로 넘어간다.

            ChangeValue3(value,out value);             
            // out 변수를 넘겨줄 때도 명시적으로 out 키워드를 붙여줘야 한다.
            Console.WriteLine($"now-value : {value}"); 
            // ChangeValue3 함수에서 레퍼런스(참조)로 넘어간다.
        }
    }
}

기본 자료형(int, short, ...)을 인자로 넘겨주게 될 경우 값을 복사해서 함수의 파라미터에 값이 넘어온다.
C++처럼 reference(&)를 사용하기 위해서는 ref키워드를 사용해야 한다.
함수의 파라미터와 함수 호출 할 때 인자에 ref 키워드를 둘다 붙여줘야 한다.
out 키워드의 경우 ref 키워드와 비슷하다. 하지만 다른점이 있다. 바로 out을 파라미터로 작성한 함수에서는 해당 변수를 반드시 값 대입을 해줘야 한다. 만약 값 대입을 하지 않을 경우에 에러가 발생한다. 즉, 좀 더 함수의 명확한 사용을 위해서 존재하는 키워드라고 볼 수 있다.

using System;

namespace Study3
{
    class Program
    {
        static void strModify(string t)
        {
            t = "변형";
        }
        static void strModifyRef(ref string t)
        {
            t = "변형";
        }

        static void Main(string[] args)
        {
            string testSTR = "test";
            strModify(testSTR);
            // 주의 ! 레퍼런스로 안넘어가고 COPY로 넘어간다. 
            // 객체가 아닌 기본 자료형 처리로 하고있는 것 같다.
            Console.WriteLine($"{testSTR}"); // 출력 : test

            strModifyRef(ref testSTR);
            Console.WriteLine($"{testSTR}"); // 출력 : 변형

            testSTR.Trim();
        }
    }
}

또 주의할 점으로 C#에서 제공해주는 string 자료형이다.
C#에서 string은 기본 자료형으로서 본다.
후에 다시 설명하겠지만 C#에서는 Class의 객체를 Reference 방식을 통해 넘겨준다. (단, struct의 경우 Value-Copy를 통해서 넘긴다.)
C#에서 string을 기본 자료형으로 보기때문에 Reference로 보면 안된다!

0개의 댓글