[SBS게임아카데미] 1인개발 프로그래밍 (C#, 유니티)

[7] C# 함수와 호출 (SBS게임아카데미 6일차_230716_일)

개발린마케터 2023. 7. 23. 19:57
반응형

지난 시간에 약간 하고 넘어갔던 함수부터 다시 하고 시작. 

 

[함수]

   - 함수는 아래에 따로 써놓고 불러온다.

새 프로젝트를 열었을 때의 첫 화면. 그 동안은 1에다가 코드를 넣고 모든 걸 했는데, 함수는 2에다 함수코드를 넣고 1에서 불러오는 방식이다.

 

(1) 예제. 인사하는 함수를 만들어보자.

        static void Main(string[] args)
        {
            PrintHI();      //함수 호출!!!
        }
        
        static private void PrintHI()       //반환형식(void) X, 매개변수가 없는 인사 출력 함수!!
        {
            Console.WriteLine("안녕하세요~");
            Console.WriteLine("반갑습니다~");
            Console.WriteLine("Hello~");
            Console.WriteLine("곤니찌와~");
        }

위와 같이 기존에 코드를 넣던 영역에는 PrintHI(); 라고 함수를 불러오게 하고, 

아래에 2의 영역에 4가지의 인삿말을 출력하는 함수를 넣어둔다. 

첨부와 같이 잘 출력되었다.

 

(2) 문자를 출력하는 함수를 만들어보자

        static void Main(string[] args)
        {
            PrintString("화내지마~");
        }
        
        static void PrintString(string str)       //반환형식X, 필수매개변수 string 타입. 호출 시 매개변수에서 요하는 타입의 값을 넣어서 호출해야함.
        {
            Console.WriteLine(str);     //위의 함수는 고정된 넣어둔 인사말 4개가 나오는 반면 이건 그때 그때 넣은 값이 나온다
        }

입력한 문자를 잘 출력했다

(3) 숫자를 출력하는 함수를 만들어보자

        static void Main(string[] args)
        {
            PrintInt(10);
        }
        
        static void PrintInt(int a)     //반환형식 X, 매개변수 int 타입
        {
            Console.WriteLine(a);
        }

숫자가 출력되었다

(4) 배열을 출력하는 함수를 만들어보자

        static void Main(string[] args)
        {
            int[] arr = new int[5] { 1, 2, 3, 4, 5 };
            PrintArray(arr);
        }
        
        static void PrintArray(int[] arr)       //반환형식 X, 매개변수 int배열 타입.
        {
            foreach (int i in arr) Console.WriteLine(i);
        }

배열의 데이터가 잘 출력되었다

(5) 수식을 계산하는 함수를 만들어보자

        static void Main(string[] args)
        {
            int a = Add(4, 6);
            PrintInt(a);
            PrintInt(Add(100, 200));
        }
        
        static int Add(int a, int b)        //반환형식 int. 매개변수 2개를 받아서 더한 뒤 그 값을 반환해주는 함수
        {
            //반환
            return a + b;
        }

입력한 숫자들을 잘 더해주었다

*위와 같은 형태를 응용하여 아래와 같이 빼기, 곱하기, 나누기, 나머지 등도 만들 수 있다.

        static int Subtract(int a, int b)
        {
            return a - b;
        }

        static int Multiple(int a, int b)
        {
            return a * b;
        }

        static int Divide(int a, int b)
        {
            return a / b;
        }

        static int Remainder(int a, int b)
        {
            return a % b;
        }

 

(6) 조건에 따라 출력하는 함수를 만들어보자

        static void Main(string[] args)
        {
            Console.WriteLine(Moving(1));
            Console.WriteLine(Moving(0));
        }
        
        static bool Moving(int speed)
        {
            if (speed > 0) return true;
            else return false;

            //삼항 연산자
            //조건식? 조건식이 참이면 왼쪽 값, 거짓이면 오른쪽 값을 반환

            //return (speed > 0) ? true : false;

        }

스피드가 0보다 크면 (즉, 움직이고 있으면) true를, 가만히 있으면 false를 출력하는 함수이다. 

if/else를 활용해서 두 줄로 써줄 수도 있고, 

아래 주석에 있는 삼항 연산자를 활용해서 왼쪽 조건이 참이면 왼쪽/ 거짓이면 오른쪽 값을 반환하게끔 할 수도 있다. 

1에는 true, 0에는 false가 출력되었다

*** 예제 ***
매개변수로 int 배열을 받아서 그 배열안의 값을 모두 더한 뒤 반환해주는 함수를 만들어주세요. 
갯수는 10개, {5, 1, 85, 31, 4, 19, 3, 2, 65, 51}로 하자.

[내가 풀던 것]

미처 다 마무리 짓지도 못하고 제대로 비슷하게라도 만들어보지도 못하고 끝났다. 

배열 문제처럼 자동으로 슥슥 가서 합치게끔 하려고 하다가 머리가 꼬여버렸다.

        static int TotalSum(int[] arr)
        {
            for (int i = 0; i < numArr.Length; i++)
            {
                for (int j = i + 1; j < numArr.Length; j++)
                {
                    int a = Add(arr[{ i},{ j}] i, j);
                }
            }
        }

[선생님이 푼 것]

        static void Main(string[] args)
        {
            int[] arr = new int[10] { 5, 1, 85, 31, 4, 19, 3, 2, 65, 51 };
            PrintInt(TotalSum(arr));
        }
        
        static int TotalSum(int[] arr)
        {
            int sum = 0;

            foreach (int i in arr) sum += i;        // sum += i => sum = sum + i

            return sum;
        }

심플한 차원을 넘어서 수업 시간에 처음 이걸 봤을 때는 이게 왜 풀리는 지 조차 바로 이해가 되지 않았다. 

그리고 뜯어보다가 내가 foreach 문의 정확한 이해가 안 되어 있구나 하는 걸 깨달았다. 

foreach 자체에 순회의 의미가 있는데 그걸 굳이 어렵게 for문으로 만들어보려고 했던 것이었다. 

 

[함수 오버로딩]

 - 함수의 이름을 바꾸지 않고도 최초 정의된 함수의 내용을 다르게 실행시키게 할 수 있다. 

static int Add(int a, int b, int c)
        {
            return a + b + c;
        }

        static float add(float a, float b)
        {
            return a + b;
        }

        static int Add(int a, float b)
        {
            return a + (int)b;
        }

굳이 Add, Add1, Add2와 같이 다양하게 만들지 않고 Add 하나로 아까 만들었던 int a와 b, 2개의 합 외에 3개의 합, float 2개의 합, int와 float의 합 등을 할 수 있게 오버로딩 되었다. 

 

[값에 의한 호출]

   - 개념적으로 좀 이해하기 어려웠지만 간단히 설명하면 원래의 값이 바뀌지 않고 대체로 불러온 값만 바꾸는 것이다. 

        static void Main(string[] args)
        {
            int a = 3;
            int b = 40;

            Console.WriteLine("값에 의한 호출 스왑 전: a{0}, b:{1}", a, b);
            Swap(a, b);
            Console.WriteLine("값에 의한 호출 스왑 후: a{0}, b:{1}", a, b);
        }
        
        static void Swap(int x, int y)  //교체 함수
        {
            Console.WriteLine("스왑 전 x:{0}, y:{1}", x, y);
            int temp = x;
            x = y;
            y = temp;
            Console.WriteLine("스왑 후 x:{0}, y:{1}", x, y);
        }

함수 내용을 보면 x와 y를 서로 위치를 바꾸는 함수를 만들었다. 

 1) 먼저, x를 임시에 넣어두고

 2) x를 y로 대체해서 바꾸고 (지금 이 순간은 x에도 y가 들어갔고, y에는 원래 y가 있다)

 3) y에 임시에 있던 녀석을 가져온다 (즉, x를 여기에 넣었다)

그리고 비교하기 위해 전과 후에 각각 스왑전의 숫자와 스왑후의 숫자를 출력하게끔 함수에 포함했다.

 

위에서 a는 3, b는 40이고, swap 함수를 통해 어떻게 바뀌는지 보려고 한다. 

또한 a와 b의 값을 스왑 전 후에 각각 출력하게끔 했다. 

왓더???

분명히 함수 속에서는 x와 y의 위치가 바뀌었는데 

원래 a와 b의 데이터는 전혀 바뀌지 않았다. 

 

[참조에 의한 호출]

   - 원래 데이터가 있는 메모리 주소를 통해 호출하는 것. 

        static void Main(string[] args)
        {
            int a = 5;
            int b = 10;

            Console.WriteLine("참조에 의한 호출 스왑 전: a{0}, b:{1}", a, b);
            Swap(ref a, ref b);
            Console.WriteLine("참조에 의한 호출 스왑 후: a{0}, b:{1}", a, b);
        }
        
        static void Swap(ref int x, ref int y)  //교체 함수. int형 값이 저장되어 있는 메모리 주소를 받는 매개변수
        {

            Console.WriteLine("스왑 전 x:{0}, y:{1}", x, y);
            int temp = x;
            x = y;
            y = temp;
            Console.WriteLine("스왑 후 x:{0}, y:{1}", x, y);
        }

이번엔 바뀌었다!!!

개념 자체가 혼란스러울 수 있다고도 선생님이 말씀하셨지만 여전히 대략 이해가 가는 것 같으면서도 누군가에게 설명하라고 하면 왜 이렇게 되는지 명확히 설명할 수 있을 지는 모르겠다. 

원본이 바뀌냐 안 바뀌냐 정도로만 이해하고 넘어가련다...

 

 

[강의내용]

https://www.notion.so/2023-07-16-c554f300d626433a8481d04938ac2ddf

반응형