함수는 특정 작업을 수행하는 코드 블록이다
Console.WriteLine();
Console.ReadLine();
Console.Clean();
Conver.ToInt32();
위와 같이 이미 정의된 함수들이 있으며, 필요할 때 호출해서 쉽게 사용할 수 있다
정의된 함수가 없을 경우, 원하는 기능을 가진 함수를 직접 만들수도 있다
void 함수이름 ()
{
실행할 내용
}
함수 이름은 자유롭게 정할 수 있지만, 이름만 보고 어떤 기능을 수행하는지 유추할 수 있도록 의미있게 지어주는 것이 좋다
함수이름();
예제
Console.WriteLine("안녕하세요");
Console.WriteLine("반갑습니다");
void MethodSample()
{
Console.WriteLine("함수에 대해 알아보겠습니다");
Console.WriteLine("우선 영역에 대해 확인해보겠습니다");
}
Console.WriteLine("이해가 되셨으면 좋겠습니다.");
MethodSample(); // 함수 실행
결과
안녕하세요
반갑습니다
이해가 되셨으면 좋겠습니다
함수에 대해 알아보겠습니다
우선 영역에 대해 확인해보겠습니다
함수를 정의하는 코드는 중간에 작성했지만, 실제로는 호출한 시점에서 실행된다
Console.WriteLine("안녕하세요");
Console.WriteLine("반갑습니다");
Console.WriteLine("이해가 되셨으면 좋겠습니다.");
MethodSample(); // 함수 실행
void MethodSample()
{
Console.WriteLine("함수에 대해 알아보겠습니다");
Console.WriteLine("우선 영역에 대해 확인해보겠습니다");
}
가독성이 좋지 않기에 보통 위의 예제처럼 로직 중간에 함수를 만들지는 않는다
함수 안에서 어떤 계산이나 작업을 한 후, 결과값을 함수 밖으로 전달해주는 역할을 한다
반환형 함수이름(매개변수)
{
// 실행할 내용
return 반환값;
}
함수의 로직이 더이상 실행되지 않았으면 하는 경우가 있을때, 예를 들어 체력 5가 있는데 공격할 때마다 1씩 깎이는 함수를 만든다고 가정
int hp = 5;
void Attack()
{
--hp;
Console.Write("데미지 : 1 현재체력 :" + hp);
}
위 코드는 Attack 이라는 함수를 실행할 때마다 체력을 깎고 출력해주는 기능
Attack(); // 데미지 : 1 현재체력 : 4
Attack(); // 데미지 : 1 현재체력 : 3
Attack(); // 데미지 : 1 현재체력 : 2
Attack(); // 데미지 : 1 현재체력 : 1
Attack(); // 데미지 : 1 현재체력 : 0
Attack(); // 데미지 : 1 현재체력 : -1
이렇게 되면 체력이 0 아래로 계속 줄어들게 된다
현실적인 게임 로직에서는 체력이 0 이하로 내려가지 않도록 막아야 한다
void Attack()
{
if(hp < 1) // hp가 1보다 낮을때 아래 코드를 실행하지 않고 종료
{
return;
}
--hp; // hp가 1 이상일 때만 감소
Console.Write("데미지 : 1 현재체력 :" + hp);
}
Attack(); // 데미지 : 1 현재체력 : 4
Attack(); // 데미지 : 1 현재체력 : 3
Attack(); // 데미지 : 1 현재체력 : 2
Attack(); // 데미지 : 1 현재체력 : 1
Attack(); // 데미지 : 1 현재체력 : 0
Attack(); // 아무 출력 없음 (return으로 함수 종료)
함수를 활용할 때 보면 변수에 값을 입력할때도 활용했던 상황들이 있다
int num = Convert.ToInt32("10");
string readTest = Console.ReadLine();
int hp = 5;
int testNum = Attack();
string testString = Attack();
void Attack()
{
if(hp < 1)
{
return;
}
hp--;
Console.Write("데미지 : 1 현재체력 : " + hp);
}
이런식으로 함수를 저장하면 에러가 발생하며, 함수의 결과를 변수에 저장하고 싶다면 return을 이용해야 한다
void GetPoint()
{
Console.WriteLine("보상으로 100 포인트 획득");
return 100;
}
위와 같이 작성하면 에러가 뜨는 것을 볼 수 있다
그 이유는 void는 함수의 결과를 사용하지 않겠다는 뜻이기 때문에 사용하고 싶다면 void 부분을 int로 바꿔줘야 한다
int point = GetPoint(); // int point = 100;
int GetPoint()
{
Console.WriteLine("보상으로 100 포인트 획득");
}
GetPoint()를 실행하면 return 뒤에 있는 숫자 100이 저장된다
int GetPoint() // 정수
{
Console.WriteLine("보상으로 100 포인트 획득");
return 100; // 정수
}
int GetPoint() // 정수
{
Console.WriteLine("보상으로 100 포인트 획득");
반환값이 없다 // 에러
}
int GetPoint() // 정수
string PointText = GetPoint(); // 문자열 변수와는 데이터 타입이 다르다
{
Console.WriteLine("보상으로 100 포인트 획득");
return 100; // 정수
}
Attack 함수를 보면 실행할 때마다 체력이 1씩 깎이고 있다
void Attack()
{
if(hp < 1)
{
return;
}
--hp;
Console.Write("데미지 : 1 현재체력 : " + hp);
}
하지만 1이 아닌 다양한 데미지를 하고 싶을 때가 있다
그럴땐 함수의 괄호() 안에 변수를 넣어주고 사용하면 된다
int hp = 5;
Attack(3); // 데미지 : 3
Attack(2); // 데미지 : 2
void Attack(int damage)
{
if(hp < 1)
{
return;
}
hp -= damege;
Console.Write("데미지 : " + damege +" 현재체력 : " + hp);
}
이렇게 함수를 실행할 때마다 다르게 동작할 수 있는 변수를 매개변수라고 한다
매개변수는 한개만이 아닌 여러 매개변수를 만들 수 있다
DisplayMyInfo(10, "chad", "전사");
void DisplayMyInfo(int level, string name, string job)
{
Console.WriteLine("레벨 : " + level + "이름 : " + name + "직업 : " + job);
}
이때 매개변수 순서와 타입에 맞게 실행하여야 한다
함수를 만들때 매개변수를 설정하였다면 함수 실행시 반드시 값을 입력해야 한다
매개변수를 설정하지 않았다면 함수 실행할때 값을 입력할 수 없다
int hp = 5;
Attack(3); // 에러
void Attack() // 에러
{
...
}
int hp = 5;
Attack(); // 에러
void Attack(int damage) // 에러
{
...
}
int hp = 5;
Attack("3"); // 에러
void Attack(int damage) // 에러
{
...
}