프로그래밍/C#

[C#] C#에서 함수 사용하는 4가지 방법

gameObject 2023. 6. 13. 00:55
728x90

C# 에서는 함수를 4가지 방법으로 사용이 가능하다.

C++에서 Call by value와 Call by reference에 대한 개념이 있다면 문법을 익히면 금방 사용할 수 있을 것으로 생각된다.

 

설명과 아래 코드를 참조하면 좋다.

CallFunc001 ~ 004까지 4가지 방법으로 함수를 사용해보았다.

 

*static 이 앞에 붙는 이유는 main함수에도 static이 붙어있기 때문이다.

*static이 붙어있는 함수와 붙어있지 않는 함수는 읽는 순서가 다르기 때문에 고려하여 써야한다.

 

1번 방법 : Call by value를 이용한 방식으로 보통 C++에서 사용했던 함수 사용방식과 같다.

//Main에서 호출
CallFunc001(str);

//함수 생성
static void CallFunc001(string[] str)

 

2번 방법: Call by value + params을 붙여 호출시에 여러개의 문자열을 입력해줄 수 있다.

//main에서 호출
CallFunc002("Hello", "World", "+", "Hello", "World");

//함수 생성
static void CallFunc002(params string[] str){}

 

3번 방법: Call by reference에 의한 방법이다. cpp에서는 &을 이용했지만 C#에서는 ref를 이용한다.(reference의 줄임말)

//Main에서 호출
CallFunc003(ref str);

//함수 생성
static void CallFunc003(ref string[] str){}

 

4번 방법 : Call by value에 의한 방법이다. return값을 out을 통해 받을 수 있다.

 - 꼭 받아야 하는 값이 있을때 사용한다. out 값이 채워져 있지 않으면 에러를 발생시킨다.

//Main에서 호출
CallFunc004(str, out resultStr);


//함수 생성
static void CallFunc004(string[] str, out string[] outStr){}

 

/// ///////함수의 4가지 선언방법

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace csharp_practice
{
    public class Program
    {
        static void Main(string[] args) // static함수와 static함수가 아닌 함수를 부르는 순서가 달라서 static함수 내에서는 static함수만 써야한다.
        {
            string[] str = new string[2] { "Hello", "World" };
            CallFunc001(str);
            CallFunc002("Hello", "World", "+", "Hello", "World");
            CallFunc003(ref str); // c++에서는 &였지만 c#에서는 ref키워드

            string[] resultStr; //string 배열을 선언
            CallFunc004(str, out resultStr); //out을 활용해서 값을 넘겨받음
            foreach(string result_ in resultStr)
            {
                Console.Write("{0} ", result_);
            }
            Console.WriteLine();

            int number = 0;
            number += 1;  // 이렇게 넣어야 출력이 1이 나온다 .
            number = number++; //이렇게 넣으면 바로 아래 출력이 0이 나온다.(c++에서는 1이 나온다)
                               //왜냐하면 c++에서는 new하면 delete를 해줘야하지만 c#에서는 메모리세이프티적인 언어라서 자동으로 닫혀버리기 때문
                               //여기서 c#에서는 덧셈을 할때도 따로 메모리를 할당을 해주고 계산을 해줌을 알 수 있다.
            Console.WriteLine("number는 무슨 값이 들어 있?? {0}", number);
        }//Main()

        //C#에서 함수를 Call하는 방법 4가지

        //4번 방법 : 매개변수를 call by reference 방식으로 넘기는 방법이나 독특한 방법
        //         매개변수를 통해서 값을 return한다 .
        static void CallFunc004(string[] str, out string[] outStr) // out키워드를 쓸거면 무조건 out키워드에 값이 있어야 한다.
                                                                   // 이것만큼은 절대로 비우고싶지 않을때 사용한다.
                                                                   // C#에서는 배열로 받아도 값으로 받을 수 있다 . c++에서는 배열 첫 주소를 받아오지만
        {
            string[] resultString = new string[str.Length + 1];

            for(int i=0; i<str.Length; i++)
            {
                resultString[i] = str[i];
            }
            resultString[str.Length] = "!";
            outStr = resultString; //값을 넣어주는 순간 에러가 사라지는것을 볼 수 있다 .
        }

        //3번 방법 : 매개변수를 call by reference 방식으로 넘기는 방법
        static void CallFunc003(ref string[] str) //ref (reference _참조 )의 약자
        {
            foreach (string strElement in str)
            {
                Console.Write("{0} ", strElement);
            }

            Console.WriteLine();
        }

        //2번 방법 : 매개변수를 call by value 방식으로 넘기는건 똑같음 . 그런데 원하는 만큼 넣을수있다.
        //          배열의 요소형태로 여러개 넘길 수 있.
        static void CallFunc002(params string[] str) //params (매개변수: 파라미터의 줄임말) , 같은말 : arguement(인수)
        {
            foreach (string strElement in str)
            {
                Console.Write("{0} ", strElement);
            }

            Console.WriteLine();
        }

        // 1번 방법 : 매개변수를 Call by value 방식으로 넘기는 방법

        static void CallFunc001(string[] str) // 배열을 복사해서 받았다.
        {
            foreach (string strElement in str) //반복문인데 몇번 반복할지는 in 뒤에 컬렉션이 결정한다.
                                               //컬렉션 숫자에 맞춰서 하나씩 뽑아서 strElement에 값 타입으로 복사한다.
                                               //역순으로 돌릴수는 없다. 쓰고싶다면 리버스정렬을 사용해야한다.
                                               //문자열도 가능하며 char형도 가능하다.
            { 
                Console.Write("{0} ", strElement);
            }

            Console.WriteLine();

        }//CallFunc001()

        
        
    }// class Program
}

 

728x90