레트로의 유니티 게임 프로그래밍 에센스 - 4.2

Cosmos·2023년 3월 28일
0

학습 매체 : 책

책이름 : 레트로의 유니티 게임 프로그래밍 에센스

저자 : 이제민


본 내용은 해당 강의 내용을 공부하면서 정리한 글입니다.


4.2 함수(메서드) 개념 잡기


  • 함수는 미리 정해진 동작을 수행하는 코드 묶음이다. 어떤 처리를 미리 함수로 만들어두면 다시 반복해서 사용할 수 있다.

4.2.1 함수로 중복 코드 줄이기

  • 프로그래밍에서 함수는 미리 지정된 동작을 수행하는 코드 묶음이다. 함수를 사용하면 같은 동작을 수행하는 코드를 여러 번 작성할 필요가 없다.

  • 물체를 움직이는 기능을 만들어 이를 나무 상자와 금속 상자에 적용해 움직여 보자.


  • 물체를 움직이는 기능 만들기

  • 체력 10을 소모하여 물체를 3미터 옮긴다고 하자.

물체 움직이기:
	체력 10만큼 소모;
    오브젝트를 3미터 옮기기;

  • 나무 상자와 금속 상자 움직이기

  • 앞에서 만든 기능을 나무 상자와 금속 상자를 대상으로 사용하자. 함수가 없다면 물체를 움직이는 코드를 반복해서 작성해야 한다.

나무 상자 움직이기:
	체력 10만큼 소모;
    오브젝트를 3미터 옮기기;
금속 상자 움직이기:
	체력 10만큼 소모;
    오브젝트를 3미터 옮기기;
  • 만약 옮길 물체가 100개라면 코드를 100번 반복해서 작성해야 한다.

  • 물체를 옮기는 기능에 소리 추가하기

  • 물체를 옮길 때 효과음을 재생하는 처리를 추가

물체 움직이기:
	체력 10만큼 소모;
    오브젝트를 3미터 옮기기;
    효과음 재생;
  • 이를 적용하려면 물체를 움직이는 모든 부분을 찾아가서 다음과 같이 새로운 코드를 일일이 추가해줘야 한다.
나무 상자 움직이기:
	체력 10만큼 소모;
    오브젝트를 3미터 옮기기;
    효과음 재생;
금속 상자 움직이기:
	체력 10만큼 소모;
    오브젝트를 3미터 옮기기;
    효과음 재생;
  • 옮길 물체가 100개라면 100군데 모두 수정해야 한다. 이런 방법은 귀찮고 비효율적이며 실수하기 쉽다.

  • 함수를 사용하여 반복되는 코드 대체

  • 반복되는 코드를 함수로 대체하면 문제를 해결할 수 있다. 물체를 움직이는 기능에 관한 코드를 Move()라는 함수로 묶는다.

void Move()
{
	체력 10만큼 소모;
    오브젝트를 3미터 옮기기;
    효과음 재생;
}
  • 기존에 물체를 움직인 코드를 Move() 뒤에 두고 중괄호로 묶었다. 이렇게 묶인 영역은 Move() 함수의 바디(body)가 된다.

  • 이렇게 하면 나무 상자와 금속 상자의 중복 코드를 다음과 같이 Move() 함수로 간결하게 대체할 수 있다.

나무 상자 움직이기:
	Move();
금속 상자 움직이기:
	Move();
  • 이제는 어떤 물체를 움직일 때 Move() 함수만 사용하면 된다. 이처럼 함수를 사용하면 코드가 반복되는 문제를 간결하게 해결할 수 있다.

4.2.2 함수의 입력

  • 나무를 옮길 때는 체력 10을 소모하여 물체를 3미터, 금속 상자를 옮길 때는 체력을 30을 소모하여 물체를 1미터 옮긴다고 하자.

  • 이럴 때는 함수의 입력을 사용한다. Move()의 괄호 부분은 바깥에서 값을 줄 수 있는 입구이다. 이 입구를 사용해 값을 전달할 수 있도록 Move() 함수를 변경한다.

  • Move() 입력

void Move(int hp, int distance)
{
	체력 hp만큼 감소;
    오브젝트를 distance미터 옮기기;
    효과음 재생;
}
  • 값을 전달할 수 있도록 함수 입력을 정의
Move(hp, distance);
  • 그러면 Move() 함수 입력을 통해 함수에 값을 전달할 수 있다.

  • 서로 다른 값을 사용하여 Move() 함수 실행

나무 상자 움직이기:
	Move(10, 3);
금속 상자 움직이기:
	Move(30, 1);

  • 함수의 입력 부분(int hp, int distance)은 외부로부터 int 타입의 값을 두 개 받겠다는 의미이다. 그리고 입력을 통해 외부에서 받은 값을 각각 hp와 distance라는 변수로 함수 내부에서 사용한다.

4.2.3 함수의 출력(반환값)

  • Move() 함수와 달리 어떤 함수는 계산이나 처리 결과를 다른 곳에 전달할 필요가 있다.
void GetRandomNumber()
{
	int number = 0;
    number = 임의의 숫자;
}
  • 이 함수는 변수 number를 만들고 임의의 숫자를 반환한다. 하지만 그 값을 외부에 전달하지는 않는다. 따라서 number에 저장된 임의의 숫자를 외부에서 사용할 수 없다. 이때 return 키워드를 사용하면 값을 외부로 전달할 수 있다.
void GetRandomNumber()
{
	int number = 0;
    number = 임의의 숫자;
    
    return number;
}
  • return number;는 'number를 반환한다'라고 읽는다. return은 1. 함수를 종료하고 2. 자신을 실행(호출)한 곳으로 되돌아가서 값을 전달(반환)한다.
  1. GetRandomNumber() 함수의 모든 처리를 종료한다.
  2. GetRandomNumber() 함수를 실행한 곳으로 되돌아가서 number의 값을 전달한다.
  • 컴퓨터는 똑똑하지 않아서 함수가 return으로 전달할 데이터 타입을 스스로 추측할 수 없다. 따라서 함수 이름 앞에 반환값(출력값 또는 리턴값이라고도 한다)의 타입을 표시해주어야 한다. 지금은 반환값이 없음을 뜻하는 void 타입을 지정했다.
    ( void는 '공허'라는 뜻이다. )
void GetRandomNumber()
  • GetRandomNumber()는 결과로 정수 int를 반환하므로 다음과 같이 void를 int로 변경해야 한다.
int GetRandomNumber()
{
	int number = 0;
    number = 임의의 숫자;
    
    return number;
}
  • 이제 GetRandomNumber() 함수의 실행 결과를 다른 곳에 전달할 수 있다. 다음과 같이 함수를 실행한 다음 = 기호를 사용해 함수의 결과(반환값)를 다른 변수에 저장하면 된다.
int randomNumber = GetRandomNumber();

return이 없는 함수

  • 모든 함수는 return 키워드를 가져야 한다. 단, void를 반환하는 함수는 컴퓨터가 암묵적으로 return을 만들어 사용하기 때문에 생략해도 된다.

내용 정리

  • 함수는 입력을 받거나 받지 않을 수 있다.

  • 함수는 결과를 반환하거나 반환하지 않을 수 있다.

C#에서는 (클래스의) 함수를 '메서드(method)'라고 부른다. 함수와 메서드는 혼용할 수 있지만, 통일성을 위해 이 책에서는 C# 함수를 모두 '메서드'로 통일한다.


다음 강의에서 계속~

profile
게임 개발을 목적으로 공부하고 있는 대학생입니다.

0개의 댓글