함수

강성현
∙∙조회 2
함수

1. 함수(function)란?

코드 한 덩어리에 이름을 붙여두고, 필요할 때 그 이름으로 불러 쓰는 것 입니다.

변수가 데이터 별명을 지어주는거라면,

함수는 '기능'에 별명을 지어주는 것이다.

  • 함수를 부르는 것을 호출(call)이라고 한다.

 

==문법 형식 : <접근 제한자> <반환형> 이름 ( ) { }==

ex) public int GetRandomNumber( )

{ return (int형의 결과값 반환) }

  • 반환값이 없다면 <반환형>자리에 void를 넣어주면 된다.
  • 결과값이 필요하다면 반환형을,
  • 결과값이 필요없는 기능만을 수행할때는 void 사용
  • 이름은 동사로 시작하는 것이 관례입니다.
    • ex) PrintTitle , CalculateDamage , IsAlive

 


1-2) 매개변수

함수를 정의하는 쪽에 넘겨주는 값

csharp
static void Main()
{
	int a = Sum(3, 21); // 매개변수 전달
}

static int Sum(int a, int b) // Main함수에서 받아온 3,21 매개변수가 a와 b에 들어간다.
{
    int sum = a + b;
    return sum;
}

 


1-3) 값 전달과 참조 전달

표기뜻넘기기 전 값이 있어야 하는가함수 안에서 값을 넣어야 하는가
(없음)값을 복사해 넘깁니다예아니오
ref원본을 직접 다룹니다예아니오
out값을 받아 오기만 합니다아니오예
in원본을 보되 바꾸지 않습니다예넣을 수 없습니다

 

ref

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

        Swap(a, ref b);

        Console.WriteLine($"a = {a}, b = {b}");
    }

    static void Swap(int first, ref int second)
    {
        int temp = first;
        first = second;
        second = temp;
        
    }
  • 매개변수에 ref에 들어가 있다면 참조타입으로 A의 주소를 참조하고,
  • ref가 들어가 있지 않다면 값 타입으로 "Second" 라는 B의 값 복사본이 만들어진다.

 


out

out은 값을 받아오는 것이 목적이기 때문에 넘기는 변수에 값이 들어있지 않아도 되지만,

함수 안에서는 반드시 값을 넣어야 합니다.

 

return은 결과를 하나만 돌려줄 수 있기 때문에 결과를 둘 이상 돌려주어야 할 때 사용합니다.

  • out은 수정이 가능하나 조회가 불가능하다.
csharp
static void Main(string[] args)
{
    int num = 5;
    Foo(out num);
    Console.WriteLine(num);
}

static void Foo(out int a)
{
    Console.WriteLine(a); // 오류발생 
    
    a = 10;               
}

 


in

in은 ref처럼 원본을 직접 볼 수 있지만, 함수 안에서 값을 바꾸는 것을 문법으로 막습니다.

  • in은 조회가 가능하나 수정이 불가능하다.
  • 호출하는 쪽에서는 in을 생략해도 됩니다. Foo(num)과 같게 동작합니다.
csharp
static void Main(string[] args)
{
    int num = 5;
    Foo(in num);
    Console.WriteLine(num);
}

static void Foo(in int a)
{
    Console.WriteLine(a); 
    
    a = 10;               // 오류발생
}

 


1-4) 오버로딩

같은 이름의 함수를 여러 형태로 정의하는 것 입니다.

호출하는 쪽은 함수 이름만 기억하면 되고, 넘긴 값에 맞게 자동으로 골라집니다.

 

csharp
static void Main(string[] args)
{
    float floatA = 3.55f;
    float floatB = 2.6f;

    int intA = 10;
    int intB = 20; 
    int intC = 30; 

    Swap(floatA, floatB);
    Swap(intA, intB);

    Sum(intA, intB);
    Sum(intA, intB, intC);

}

static void Swap(float first, float second)
{
    float temp = first;
    first = second;
    second = temp;
}

static void Swap(int first, int second)
{
    int temp = first;
    first = second;
    second = temp;
}

static int Sum(int a, int b)
{
    int sum = a + b;
    return sum;
}

static int Sum(int a, int b, int c)
{
    int sum = a + b + c;
    return sum;
}
  • 다만, 반환 형식만 다른 것은 오버로딩이 되지 않습니다.
csharp
public static int GetValue(int a)  
{  
    return a;  
}

public static double GetValue(int a)   // 오류: 매개변수 목록이 같습니다  
{  
    return a;  
}

 


1-5) 재귀함수

자기 자신을 부르는 함수를 말합니다.

csharp
static void Main(string[] args)
{
    Foo(5);
}
static void Foo(int count)
{
    Console.WriteLine($"Foo 호출 count : {count}");
    // 기저조건 설정 필요
    if (count == 0)
    {
        Console.WriteLine("재귀 끝");
        return; // 함수 끝
    }
    Foo(count - 1);
    Console.WriteLine($"Foo 종료 count : {count}");
}