[C#] 6. 함수 & 매개변수

치치·2024년 11월 22일
0

C#

목록 보기
7/16
post-thumbnail
  • C#은 함수를 생성하려면 클래스를 무조건 만들어야 함

📌 함수란?

  • 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 코드의 집합
  • 함수의 경우 자료형과 반환하는 값의 형태가 일치하지 않으면 원하는 값을 얻을 수 없다
  • 함수를 실행하려면 🎈반드시 Main함수 안에 사용🎈
static void Create()
{
    for(int i = 0; i < 3; i++) 
    {
        Console.WriteLine("★게임 아이템 생성★");
    }
}

static void Main(string[] args)
{
	Create();
}

결과값:
★게임 아이템 생성★
★게임 아이템 생성★
★게임 아이템 생성★


📌 매개 변수 한정자

  • 함수에 전달하는 매개 변수의 전달 방식을 지정하기 위해 사용하는 지정자 ( 매개변수의 특별한 기능, 역할을 붙여주기 위해 매개변수 앞에 사용하는 키워드 )

📌 매개 변수란?

  • 함수의 정의에서 전달받은 인수를 함수 내부로 전달하기 위해 사용하는 변수
  • 하나의 함수에서 서로 다른 자료형의 매개 변수를 선언할 수 있고, 여러 개의 매개 변수를 선언할 수 있다

여기서 매개변수는 health
인수는 currentHealth

static void Health(int health)
{
    Console.WriteLine(health);
}
static void Main(string[] args)
{
	int currentHealth = 100;
    
    Health(currentHealth);
}

결과값: 100

📌 ref 매개 변수 한정자

쉽게 말하자면, 메인함수에 있는 x와 y값이 참조 형태 인자로 매개변수로 전달되기 때문에, 안에서 값이 바뀌면 밖에서도 바뀐 값이 적용된다

  • ex) 값에 의한 전달 (Call by Value) -> 함수 내에서는 바뀌었어도 값이 복사되어 들어가기 때문에 결론적으로는 Swap되지 않는다
static void Swap(ref int x, ref int y)
{
    int temporary = y;

    y = x;
    x = temporary;
}

int x = 10;
int y = 20;
// 이렇게 하면 값이 Swap되지 않는다
Swap(x, y);
Console.WriteLine("x의 값은: " + x);
Console.WriteLine("y의 값은: " + y);
  • ref를 사용 -> 참조에 의한 전달 (Call by reference)
  • 매개 변수에 ref를 사용하게 되면 값이 그대로 들어가게 됨
  • Swap 가능
static void Swap(ref int x, ref int y)
{
    int temporary = y;

    y = x;
    x = temporary;
}

static void Main(string[] args)
{
	int x = 10;
	int y = 20;

	Swap(ref x, ref y);
	Console.WriteLine("x의 값은: " + x);
	Console.WriteLine("y의 값은: " + y);	
}

결과값: x의 값은: 20 / y의 값은: 10


📌 out 매개 변수 한정자

  • 참조에 의한 전달
  • 함수 내부에서 바뀐 값이 밖에서도 그대로 적용된다
  • out 키워드를 사용한 매개변수는 함수 내부에서 무조건 값을 셋팅 해야함
  • 아래 코드에서 out int score 매개변수의 값이 안에서 case별로 다 지정되어있음
static void Score(char grade, out int score)
{ 
    switch(grade) 
    {
        case 'A': score = 100;
            break;
        case 'B':
            score = 90;
            break;
        case 'C':
            score = 80;
            break;
        case 'D':
            score = 70;
            break;
        default: score = 0;
            break;
    }
}

static void Main(string[] args)
{
	int score = 0;

	Score('A', out score);

	Console.WriteLine("score 변수의 값 : " + score);
}

결과값: score 변수의 값 : 100
case A에 해당하는 값인 100


📌 in 매개 변수 한정자

  • 읽기 전용 변수 in 으로 매개 변수로 들어온 값을 변경 할 수 없음
static void Receive(in int packet)
{
    // packet = 99; 값 변경 불가능

    Console.WriteLine("packet : " + packet);
}
static void Main(string[] args)
{
	int data = 100;
    Receive(data);
}

결과값: 100

📌 기본 매개 변수

  • 함수를 선언 및 정의할 때 사용자가 미리 기본값을 지정하는 매개변수
  • 기본 매개 변수를 지정할 때, 오른쪽에서 부터 지정해서 사용할 수 있으며, 기본 매개 변수의 경우 왼쪽에서 부터 데이터를 넣어줌

매개 변수 현재 x = 0, y = 0
default 매개변수 = 0 (기본적으로 아무것도 인자로 안넘기면 들어있는 값)

  • 매개 변수는 오른쪽부터 작성 가능하고, 인수로 넣은 수는 왼쪽부터 데이터가 들어감
static void Position(int x, int y = 1) 
{
    Console.WriteLine("x의 좌표 : " + x);
    Console.WriteLine("y의 좌표 : " + y);
}

static void Main(string[] args)
{
	Position(2);
}

결과값:


📌 재귀 함수

  • 어떤 함수에서 자신을 다시 호출하여 작업을 수행하는 함수
  • 함수를 계속 호출하기 때문에 스택 영역에 메모리가 계속 쌓이게 되므로 스택 오버플로우가 발생

    꼭 재귀를 탈출 할 수 있는 조건의 return문을 가장 위에 써두자!!! 나중에 알고리즘에서 정말 많이 쓴다 (지금의 나는 모르겠지만 알아두자 제발)

static void Connect(int count)
{     
    if(count <= 0) 
    {
        return;
    }

    Console.WriteLine("Connection....");
    
    Connect(count - 1);
}

static void Main(string[] args)
{
	Connect(3);
}

결과값: Connection.... Connection.... Connection....

profile
뉴비 개발자

0개의 댓글