본문 바로가기
Development/멋쟁이사자처럼 게임개발 부트캠프

[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 5일차 & 6일차 - 함수

by jjeondeuk1008 2025. 3. 7.

[ 목차 ]

     


     

     

    배열을 넘겨.. 함수까지 왔습니다..

     

     

    고등학교부터 수포자였던 저에게 함수 PTSD가 남아있는데요. . .

     

     

     

    여기의 함수만이라도 극복할 수 있길.. . . . . 빕니다..

     


     

    1. 함수(메서드)

     

     

    함수란!! 무엇인가

     

    특정 작업을 수행하기 위해 작성된 코드블록,

    재사용이 가능하며 가독성을 높일 수 있다!

     

    쉽게 정리하자면 코드를 분리해서 호출한다.

     

     

     

    왜 분리를 하는 걸까? 의 대답으로

     

    코드가 점점 길어지면 관리하기 힘들 것이고, 묶어서 관리하면

    보기에도 편하고 수정도 용이하기 때문이다.

    위에서 가독성을 높인다는 것이 이런 말인 것 같다.

     

     

    그렇게

    메인함수에서 전체 처리한 것을 나누어

    최대한 코드를 최소화하고 겹치는 코드가 없기 위해서 사용한다.

     

     

    함수메서드라고도 불리는데

    void SayHello() { Console.WriteLine("Hello,world"); }

     

    여기에서 SayHello함수명이다.

    Void SayHello()
    {
    	Console.WriteLine("Hello,World");
    }
    
    //함수 호출
    SayHello();
    

     

    이제 함수명만으로도 호출이 가능하다는 것이다.

     

     

    여기에서 void는 무엇인가?

    왜 쓰이는 건가?

    라는 궁금증이 생기는데,

     

     

    void가 없으면 return 을 사용하는 것이고,

    return 값이 필요하지 않으면 void가 사용된다.

     

     

    return 값이 필요하다! 하면 void를 사용하면 안 된다!

    이것은 매개변수 쪽에서 설명을 더 할 수 있다.

     

     

     

     

    함수 호출 형태 3가지

     

    함수이름();
    함수이름(매개변수);
    결과값 = 함수이름(매개변수);

     

     

     

     


     

    2. 매개변수

     

     

    함수는 입력값(매개변수)를 받고 결과를 반환할 수 있다.

     

    매개변수가 무엇이냐!?

     

    예를 든 코드를 보여주겠다.

    int Add(int a, int b)
    {
    	return a + b;
    }
    
    int result = Add(5,3);
    Console.WriteLine($"Result: {result}")
    

     

       int            Add      (int a, int b)     {  return   a  +  b }

    정수형          함수          매개변수                반환값

     

    이렇게 된다. 매개변수는 int a, int b인 것이다.

     

     

     

     

    (1) 매개변수와 반환값이 없는 함수 (void)

     

    매개변수가 ()로 아무것도 없고, return 반환값이 없어 void를 사용하는 예시이다.

    //1. 매개변수와 반환값이 없는 함수 (void)
    static void PrintHello()
    {
        Console.WriteLine("안녕하세요");
    }
    
    static void Main(string[] args)
    {
    		PrintHello();        // 결과 값 : 안녕하세요
    }
    

     

     

     

     

    (2) 매개변수만 있는 함수

     

    매개변수에 (string message) 가 있는 함수의 예시이다.

    //2. 매개변수만 있는 함수
    static void PrintMessage(string message)
    {
        Console.WriteLine(message); //입력이 있는 함수
    }
    
    static void Main(string[] args)
    {
    		PrintMessage("오전 09시 19분 입니다");       // 결과 값 : 오전 09시 19분 입니다
    }
    

     

     

     

     

    (3) 반환값만 있는 함수

     

    return 으로 42를 반환하고 있고,

    GetNumber 함수에서 가져와 Main 함수에서 호출한다.

     //3. 반환값만 있는 함수
     static int num2;
     
     static int GetNumber()
     {
         num2 = 30;
         return 42;
     }
     
     static void Main(string[] args)
    {
    	int result = GetNumber()
    	Console.WriteLine(num2);       // 결과 값 : 30
        Console.WriteLine(result);		//결과 값 : 42
    }

     

     

     

     

    (4) 매개변수와 반환값이 있는 함수

    //4. 매개변수와 반환값이 있는 함수
    static int Add(int a, int b)
    {
        return a + b;
    }
    
     static void Main(string[] args)
    {
    		Console.WriteLine( Add(3, 5));   //결과 값 : 8
    }
    

     

     

     

     

    (5) 기본값을 가진 매개변수 (디폴트 매개변수)

     

    매개변수에서 초기값을 선언해주고, Main 함수에서 호출하면

    선언한 초기값이 나온다.

    //5. 기본값을 가진 매개변수 (디폴트 매개변수)
    static void Greet(string name = "손님")
    {
        Console.WriteLine($"안녕하세요, {name}");
    }
    
    static void Main(string[] args)
    {
    		Greet();              // 결과 값 : 안녕하세요, 손님
    		Greet("맹구");         // 결과 값 : 안녕하세요, 맹구
    }
    

     

     

     

     


     

    3. 전역변수

     

    클래스와 같은 레벨에서 선언된 변수를

    전역 변수 혹은 필드라고 한다.

    // Static을 이용해서 변수 선언할때, 그게 전역 변수.
    // ex) Static string A = "전역 변수";
    
     static int num1 = 30;
     static int num2 = 20;
     
     static void Main(string[] args)
    {
    	Console.WriteLine(num1);         // 결과 값 : 30
        Console.WriteLine(num2);         // 결과 값 : 20
    }

     

     

     

     

     


     

    4. 함수 오버로딩

     

    오버로딩(Overloading)이란 무엇인가?

    바로 하나의 함수(메소드)를 가지고 여러 가지로 구현하는 것을 말한다.

     

    중요한 점은 매개변수의 개수와 형이 달라야 한다.

     

     

    아래의 코드는 Multiply 함수를 지정하고, 정수형과 실수형으로 타입을 다르게 매개변수를 설정하였다.

    static int Multiply(int a, int b) //정수형 타입
    {
        return a * b;
    }
    
    static double Multiply(double a, double b) //이름을 같이 쓰고 싶다면 타입만 다르게 (실수형 타입)
    {
        return a * b;
    }
    
    static void Main(string[] args)
    {
    
                Console.WriteLine(Multiply(3, 4));        // 결과 값 : 12
                Console.WriteLine(Multiply(2.5, 3.5));    // 결과 값 : 8.75
    }
    

     

     

     

     


     

    5. XML

     

    XML 요소를 사용하여 출력 문서의 구조를 알아보자.

     

    XML 주석으로 함수의 용도를 설명한다.

    /// <summary>
    /// 두수를 곱하는 함수
    /// </summary>
    /// <param name="a">int, double 오버로딩해놈</param>
    /// <param name="b">int, double 오버로딩해놈</param>
    /// <returns></returns>
    

     

     

     

     


     

    6. out 키워드

     

    out 키워드는 여러 값을 반환할 때 쓴다.

     

    return은 한 개만 되지만,

    out 키워드를 사용하면 return 값을 여러개 할 수 있다!

     

    매개변수에 out 키워드를 붙이면 함수 내부에서 무조건 값을 세팅해주어야 한다.

    out 키워드를 사용하면 메서드 내에서 변수를 초기화 할 수 있다.

    //8. out 키워드 (여러 값을 반환할때)
    //return은 한 개 밖에 안되지만, Out 키워드를 사용하면 return 값을 여러개 할 수 있음.
    static void Divide(int a, int b, out int quotient, out int remainder)
    {
        quotient = a / b;
    
        remainder = a % b;
    }
    static void Main(string[] args)
    {
    
       Console.WriteLine("몫 : " + q + " 나머지 :" + r);   // 출력 -> 몫 : 3 나머지 : 1
    }
    

     

     

     

     


     

     

    7. ref 키워드

     

    ref 키워드는 명시적으로 참조 전달을 할 수 있다.

     

    '참조한다' 라는 것은 외부에서 전달된 원본 변수를 직접 수정할 수 있게 된다.

    이것도 out 키워드처럼 함수 내부에서 무조건 값을 세팅해주어야 한다.

     

     

    그렇게 함수를 나누어 실습을 해보았다.

     static void Loading()
     {
    
         Console.WriteLine("로딩중.");
         Thread.Sleep(1000);
         Console.WriteLine("로딩중..");
         Thread.Sleep(1000);
         Console.WriteLine("로딩중...");
         Thread.Sleep(1000);
     }
    static void Main(string[] args)
    {
     Loading();
    
     Console.WriteLine("게임이 시작됩니다.");
     Console.ReadLine();

     

     

     


     

    8. parmas 키워드 (가변 매개변수)

     

     

    가변 말 그대로 변할 수 있다는 뜻이다.

    매개변수가 변할 수 있다! 무엇을 ?

     

    개수를 !

     

     

     

    모든 인수의 합을 구하는 Sum() 메소드 구현할 때 유용하다.

    //parmas 키워드 (가변 매개변수)
    static int Sum(params int[] numbers)
    {
        int total = 0;
    
        foreach(int num in numbers)
        {
            total += num;
        }
        return total;
    }
    
    static void Main(string[] args)
    {
                Console.WriteLine(Sum(1, 2, 3));  //출력 6
    
                Console.WriteLine(Sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));  //출력 55
    }
    

     

     

     

     


     

    9. 재귀함수

     

    재귀란 뜻은 다시 돌아오는 것이다.

    그러므로 자기 자신을 호출한다는 뜻이다.

     

    그렇게 자기 자신을 호출하는 걸 반복한다는 것이 재귀함수이다.

     

    장점은 복잡한 문제를 간단하게 표현할 수 있다는 것이다.

     

    //11. 재귀함수 (자기 자신을 호출)
    // 함수 자신을 호출 하는 것 -> 재귀 함수
    static void Print()
    {
        Console.WriteLine("나는 재귀함수");
        Print(); //무한반복
    }
    static void Main(stirng[] args)
    {
    		Print();      // 출력 값 : 나는 재귀함수
    }
    

     

     

     

     

     

    팩토리얼

     

    팩토리얼은 자연수의 곱을 계산하는 함수이다.

    일반적으로 n! 으로 표기한다.

     

    즉, n과 n보다 작은 모든 자연수의 곱이다.

     

    5! = 5 × 4 × 3 × 2 × 1

    = 120

     

    0! = 1이다.

     

    코드에서는 주로 n * Factorial(n - 1); 으로 쓰인다.

    //11-1. 재귀함수 (팩토리얼)
    static int Factorial(int n)
    {
        if (n <= 1)
            return 1;
    
        return n * Factorial(n - 1);
    }
    static void Main(stirng[] args)
    {
       Console.WriteLine(Factorial(5));       // 결과 값 : 120
       //5! = 5 x 4 x 3 x 2 x 1
       //   = 120
    }
    

     

     

     

     


     

    10. 실습

     

     

    위의 내용으로 함수를 응용한 캐릭터의 공격력 실습을 진행해보았다.

    	static int BaseAtk()
    	{
    	    //기본공격력 10
    	    int Atk = 10;
    	
    	    return Atk;    //출력
    	}
      static void AtkFunction(int Atk)
      {
          Console.WriteLine(" 공격력은 : " + Atk);
      }
      static void Main(string[] args)
      {
          int Atk = 0;
          int bAtk = 0;
          Console.WriteLine("캐릭터의 공격력을 입력해주세요 : ");
          Atk = Convert.ToInt32(Console.ReadLine());
    
          //기본공격력
          bAtk = BaseAtk();
    
          AtkFunction(Atk + bAtk);
    

     

     

     

     

    매개변수를 이용한 실습도 진행하였다.

     

    int add 함수int a, int b 매개변수를 선언해주고

    Main 함수에서 10, 20의 값을 a b에 대입해 결과를 호출할 수 있다. 

    static int Add(int a, int b)
            {
                int res = a + b;
    
                return res;
            }
    
            static void Main(string[] args)
            {
                int result = Add(10, 20);
                Console.WriteLine("10 + 20 = " + result); 
    

     

     

     

     

    기초 문제 실습으로 두 수의 합을 구하는 함수를 진행하였다.

    두 개의 정수를 입력 받고 두 개의 합을 구하는 함수이다.

    static void Main(string[] args)
    {
        Console.WriteLine("두 개의 정수를 입력하세요 ");
        string input = Console.ReadLine();
        string[] numbers = input.Split(' ');
    
        int num1 = int.Parse(numbers[0]);
        int num2 = int.Parse(numbers[1]);
    
        Console.WriteLine($"{num1}과 {num2}의 합: {Add(num1, num2)}");
    
    }
    
    static int Add(int a, int b)
    {
        return a + b;
    }

     

     

     

    문자열을 입력 받아 길이를 반환하는 함수 실습

    이것은 길이 Length를 응용한다.

    static void Main(string[] args)
    {
        //Q8. 문자열을 입력받아 길이를 반환하는 함수
        Console.Write("문자열 입력: ");
        string input = Console.ReadLine();
        Console.WriteLine("문자열 길이: " + back(input));
    }
    
    static int back(string input)
    {
        return input.Length;
    }
    

     

     

     

    세 개의 정수를 입력 받아 가장 큰 값을 반환하는 함수 실습이다.

    메인에서 입력 받은 것을 조건을 구하는 곳으로 함수를 따로 넣고,

    다시 메인에서 호출한다.

    static void Main(string[] args)
    {
        //Q9. 세 개의 정수를 입력받아 가장 큰 값을 반환하는 함수를 작성하세요.
        int a = int.Parse(Console.ReadLine());
        int b = int.Parse(Console.ReadLine());
        int c = int.Parse(Console.ReadLine());
    
        Console.WriteLine("가장 큰 수: " + maxnum(a, b, c));
    
    }
    
    static int maxnum(int a, int b, int c)
    {
        int max = 0;
        if (a > b && a > c)
        {
            max = a;
        }
        else if (b > a && b > c)
        {
            max = b;
        }
        else
        {
            max = c;
        }
        return max;
    }
    

     

     

     

     


     

    이렇게 함수에 대해서 여러 함수들이 있다는 것을 알아보았다...

    솔직히 함수도 긴가민가 했는데

     

    재귀함수,, 가변 함수. . . . 등등 ..~

     

    많이 어렵긴 한데.. 익숙해지길 빈다.  . .

     

     

     

    그러면서 뭔가 알면 알수록 많아지는 코드를 위함과 가독성을 위해서

    여러 개념이 등장하는 느낌인데

     

    이걸 활용하면 할 수록 편해지는 느낌?

    일 것 같지만..

     

     

     

    아직 개념도 헷갈리는 나에겐 어려울 뿐이다.. 

     

     

    익숙해질 수 있겠지..😢

     

     

     

    오늘의 나에게 박수를 보낸다.. 

     


    목차