본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티와 C# 개념 정리_Concept Summary

유니티와 C# 개념 정리_006_함수(메서드)

메서드(함수)의 탄생

앞에서 보았듯이 데이터를 저장하기 위해 변수(Variable)를 사용한다.

 

예를 들어 정수 타입의 두 변수(numberA, numberB)를 선언하고,

각각 1과 2로 초기화 한 후

addTwoNumbers(두 수 더하기)라는 변수에 두 변수를 더해서 넣는 코드를 아래와 같이 작성했다고 하자.

 

int numberA = 1;

int numberB = 2;

int addTwoNumbers = numberA + numberB;

 

만약 이 코드를 프로젝트 안의 다른 곳에서 또 사용해야 한다면 코드를 복사해서 붙여넣을 수 있을 것이다.

하지만 여러번 사용해야 하고 더하는 숫자도 그때 마다 달라진다면 번거러울 뿐만 아니라 코드가 난잡하게 될 것이다.

이런 불편함을 없애고 코드를 깔금하게 정리할 방법이 필요하다.

 

또한 numberA + numberB 코드는 변수와 달리 '더하다'라는 행위 또는 기능을 하고 있다.

그래서 코드 사용의 불편함을 없애고 기능을 담당하는 코드를 위해 함수(Function)라는 개념이 만들어졌을 것이다.

 

int AddTwoNumbers( )

{

    int numberA = 1;

    int numberB = 2;

    int addTwoNumbers = numberA + numberB;

}

 

함수를 만들어 놓으면 그 기능이 필요할 때 코드들을 일일이 복사해서 붙여넣을 필요없이 그냥 원하는 곳에서 함수 이름을 부르면 된다. 이것을 영어로 Call(콜, 호출)이라고 한다.

 

아래와 같이 기능을 확장하면 호출할 때 함수에게 데이터를 건네주거나 받을 수도 있다.

int AddTwoNumbers (int numberA, int numberB)

{

    return numberA + numberB;

 

참고로 함수(Function)는 메서드(method)와 기본적인 의미는 같기 때문에 아무거나 사용해도 된다.

굳이 따지자면 함수는 독립적으로 실행할 수 있는 형태를 말하고, 메서드는 클래스에 있는 함수를 참조하는 형태를 말한다. 유니티에서는 메서드라고 표현하겠다.

 

메서드 만들기

 

메서드를 만들어 두면 어디서든 메서드명으로 호출하여 실행할 수 있다.

 

메서드는 어떤 행위 또는 행동(~하다)을 정의하는데 사용한다.

다음과 같은 목표를 가진 메서드를 만들어보자.

 

목표: 5인치(inch)를 cm 미터로 바꾼다

 

Basic03 스크립트를 만들고 Basic 개체에 컴퍼넌트로 추가한다.

Basic03 스크립트를 더블클릭해서 먼저 아래와 같이 편집한다.

9번 줄에 위와 같이 입력하면 InchToCm 이라는 메서드가 정의된 것이다.

엔터키를 쳐서 한 칸 띄운 후 중괄호를 입력한다.

비주얼 스튜디오에서는 왼쪽 중괄호를 입력하면 오른쪽은 자동으로 입력된다.

메서드가 실행할 내용들은 이 중괄호 안에 작성하면 된다.

 

중괄호 안에 커서를 두고 엔터키를 치면 줄이 바뀌고 자동으로 보기 좋게 들여쓰기가 될 것이다.

아래와 같이 코드를 작성한다.

메서드( )는 한 쌍의 중괄호 { } 로 블록처럼 둘러 싸여 있다. 

그 안에 명령들을 넣는다.

Start( ) { ... } 

InchToCm( ) { ... }

 

9번 줄에서 메서드 InchToCm ( ) { } 를 정의했다.

위 메서드가 하는 행위는 '인치 단위를 센티미터로 바꾸다' 이다.

그래서 메서드명을 InchToCm으로 지었다.

ConvertInchesToCentimeters 처럼 완전한 문장으로 해도 되지만 To가 방향(~로)을 나타내고 있으므로 무슨 뜻인 지 알 수 있는 범위에서 줄인 것이다.

 

참고로 메서드명은 행위를 나타내므로 동사(~하다)로 이름 짓는 것이 좋다.

영어가 잘 안되더라도 구글 번역기나 파파고를 사용하면 쉽게 지을 수 있다.

메서드 이름(메서드명)

메서드명은 대문자로 시작하고 이어지는 단어가 있을 경우 첫글자를 대문자로 표시해서 읽기 쉽도록 한다.

이렇게 적는 방법을 낙타 모양을 닮았다고 해서 camel case (캐멀케이스)라고 부른다.

캐멀케이스는 대문자로 시작하거나 소문자로 시작할 수 있다.

대문자로 시작하는  경우를 Pascal case(파스칼 케이스)라고 부르기도 한다.

또한 단어를 밑줄로 연결하는 형태는 뱀 모양을 닮았다고 해서 snake_case (스네이크 케이스)라고 한다.

위의 명칭들은 별로 중요하지 않으므로 이런 형태로 이름을 지을 수 있다는 정도만 기억하면 된다.

이름을 지을 때 중요한 점은 통일된 형태를 유지하고 이해하기 쉽게 지어야 한다는 것이다.

 

메서드는 메서드명 다음에 괄호( )를 붙인다.

이 괄호는 외부에서 어떤 값 등을 전달 받을 때 사용한다.

외부에서 전달하는 어떤 값을 인자(argument : 요소)라고 부른다.

 

메서드가 집이라면 괄호는 우편함이라고 생각해도 될 것 같다.

우편함도 타입을 정해두고 맞는 타입만 전달 받을 수 있다.

여러 타입의 우편함을 준비해 둘 수 있다.

전달 받을 인자가 없을 때는 비워두면 된다.

 

메서드 내용

중괄호{ } 안에는 메서드에서 실행할 명령을 순서대로 적는다.

11번줄에서 13번줄 까지 인치를 센티미터로 바꿀 수 있는 논리에 맞게 코드를 작성했다.

 

인치를 센티미터로 바꾸려면 먼저 1인치가 몇 센티미터인지 알아야 한다.

그리고 알고자 하는 인치의 값에 곱하면 구할 수 있다.

 

11번 줄에 인치를 나타낼 수 있는 변수로 만들고 원하는 값을 저장한다.

여기서는 플로트 타입의 지역변수 inch(인치)를 정의하고 초기값으로 5.0f를 넣었다.

 

12번 줄에 센티미터를 나타낼 변수를 만들기 위해 플로트 타입의 지역변수 cm(센티미터)를 정의하고,

이 cm변수에 변수 inch값(5.0f) 곱하기 2.54f 한 값을 넣었다.

 

1인치는 2.54cm이므로 5인치를 계산하기 위해 muliply(멀티플라이; 곱)을 했다.

코딩에서 사칙연산(더하기, 빼기, 곱하기, 나누기)는 각각 + , - , * , / 기호를 사용한다.

 

이제 12번 줄의 변수 cm에는 5인치를 센티미터로 계산한 값이 float타입으로 저장되어 있다.

13번 줄에서 print( )메서드에 변수cm을 전달하면 변수값을 출력할 수 있다.

 

이제 이 메서드를 실행하기 위해 Start( )메서드를 이용한다.

Start( )메서드는 유니티가 실행되면, 안에 포함된 명령을 순서대로 실행하는 역할을 한다.

콘솔앱에서 Enter Point(시작점, 진입점) 역할을 하는 Main( )메서드와 같은 기능이다.

유니티에서는 진입점이 따로 없으며 시작할 수 있는 곳이 여러 군데 있다.

이에 대해서는 다음에 따로 정리한다.

 

어쨌든 Start메서드 안에서 InchToCm 메서드를 입력(호출)하면 유니티가 시작할 때 이 메서드를 실행할 수 있다.

 

스크립트를 저장(Ctrl + S )한 후 실행하면 다음과 같은 결과를 볼 수 있다.

 

그러므로 5인치는 12.7 센티미터이다.

 

Void (보이드)

 

이제 위에서 언급하지 않은 void에 대해 알아보자.

메서드명 앞에 붙은 void는 '비어 있는(empty)' 이라는 뜻이다.

 

이전 글에서 C#은 강한 타입화를 사용한다고 했다.

즉, 변수를 만들려면 어떤 타입(종류)으로 만들 지 미리 정해야 한다.

 

위에서 메서드는 우편함 기능의 괄호( )를 사용해서 바깥에서 인자를 받아올 수 있다고 했다.

받을 수 있으므로 줄 수도 있어야 한다. (give and take; 기브 앤 테이크)

우편함으로 숙제를 받았으면 답장을 작성해서 되돌려 줘야 한다.

 

프로그래밍에서는 데이터(자료)를 주고 받을 수 없으면 할 수 있는 일이 거의 없기 때문에 '주고, 받고, 전달'하는 기능이 매우 잘 설계되어 있다. 오히려 이 기능이 너무 많이 복잡하게 이루어지기 때문에 어렵고 골치 아픈 것이다.

 

어쨌든 메서드가 어떤 행위를 한 결과값을 바깥으로 전달하기 위해서는 변수와 마찬가지로 타입을 지정해야 한다.

이 과정을 return(리턴 ; 반환) 이라고 부른다.

 

위의 InchToCm메서드는 계산하여 변수에 저장한 값을 print( )메서드로 출력하는 과정까지 완료했기 때문에 이 메서드는 행위를 자체적으로 완성한 형태이다.

즉, 바깥으로 변수값을 반환하지 않는 형태이다.

다른 말로하면 '반환할 값이 없는' 메서드이다.

 

이런 경우 void 키워드를 붙여서 반환값이 없는 메서드라는 것을 표시한다. 

 

반환 타입을 가진 메서드

 

사실 위에서 만든 메서드는 인치를 미터로 계산하는 메서드가 아니라 정확하게는 5인치를 미터로 계산하는 메서드이다.

 

만약 Start( )메서드에서 12인치나 35인치가 몇 센티미터인지 물어보거나 다른 숫자도 계속 물어보면 어떻게 해야 하나?

각각의 인치를 바꿀 수 있는 비슷한 메서드를 계속 만들어야 할 것이다.

이런 문제를 해결하기 위해 메서드에 괄호를 만들어서 숙제를 받고 답을 돌려주는 시스템을 완성한 것이다.

 

위와 같이 Start( ) 메서드에서 InchesToCm( )이라는 메서드로 12를 인수로 전달한 후 답을 요구한다고 하자.

숙제를 받고 회신할 수 있는 메서드를 만들어 보자.

빨간 밑줄은 메서드가 없다는 표시이다.

메서드를 해당 이름으로 만들면 되지만 비주얼스튜디오의 기능을 이용할 수도 있다.

 

빨간줄 부분에 마우스 포인터를 가져가면 위와 같이 안내문이 나온다.

CS0103은 문법적으로 잘못된 부분을 지적한다.

클릭하면 해당 오류에 대한 마이크로소프트 docs 설명 문서 사이트로 이동한다.(온라인 연결된 상태에서)

Show potential fixes는 오류를 고칠 수 있는 방법들을 제시한다.

원하는 방법을 선택하여 오류를 고칠 수 있다.

 

Generate(생성하다,만들다)와 Change(바꾸다) 2가지를 제시하고 있다.

Generate method는 InchesToCm메서드를 만드는 것이고,

Change~는 기존에 InchToCm메서드가 있으므로 이름을 잘못 적은 것으로 착각해서 InchToCm(12)로 바꾸는 옵션이다.

 

여기서는 새 메서드를 만들것이므로 Generate부분을 선택한다.

 

2가지 변화가 생겼다.

하나는 13번줄에서 16번줄까지 원하는 메서드를 구현할 수 있는 형태로 메서드가 만들어졌다.

또 하나는 1번 줄에 using System; 이 생겼다.

이것은 15번 줄의 NotImplementedException( )메서드가 System이라는 namespace 안에 있기 때문에 이것을 사용할 수 있도록 using키워드를 사용해서 연결한 것이다.

이 상태에서 자신이 원하는 메서드로 다듬어 가면 된다.

 

하지만 초보자 일수록 이런 방법 보다는 직접 작성하는 것이 실력향상에 도움이 된다고 한다.

Ctrl키를 누른 상태에서 Z키를 계속 누르면 방금 했던 작업을 거꾸로 되돌릴 수 있다.

 

아래와 같이 기존 메서드 아래에 InchesToCm메서드를 작성한다.

 

17번 줄에서 21번 줄까지 메서드를 작성한다.

 

이번에는 인수를 전달 받아서 되돌려 줘야 하므로 void 대신 float 타입으로 메서드를 정의한다.

 

메서드명을 적고 괄호 안에는 인수를 전달 받을 때 사용할 변수와 타입도 지정해야 한다.

여기서는 float타입으로 변수명은 inch라고 정했다.

특별히 이 괄호 안에 사용하는 변수를 매개변수(parameter : 퍼래미터) 라고 부른다.

중간에서 외부와 연락을 주고 받는 역할을 하기 때문에 붙여진 이름이다.

 

참고로 para는 '옆에' '추가로' 라는 뜻이다. parallel 은 옆에 같은 선이 있으니까 '평행선'이라는 뜻이다.

 

19번 줄에서 변수 cm에는 계산에 사용할 인치값을 매개변수 inch를 통해서 전달받아 사용한다.

20번 줄에서 다시 되돌려 주기 위해서는 return키워드를 사용하고 뒤에 반환할 변수를 적어준다.

 

Start( )메서드에서는 print( )메서드 안에 InchesToCm 메서드의 괄호안에 센티미터로 바꾸고 싶은 인치값을 전달한다.

그러면 return으로 계산된 값을 다시 되돌려 받아서 출력(print)할 수 있다.

 

InchToCm메서드와 InchesToCm메서드를 잘 비교해 보면 어떻게 작동되고 있는 지 감을 잡을 것이다.

 

스크립트를 저장한 후 출력한 결과는 다음과 같다.

 

InchesToCm메서드의 좋은 점은 센치미터로 바꾸고 싶은 값을 계속 작성할 수 있다는 것이다.

참고로 인치값을 float타입으로 받도록 했는데 int(정수) 타입인 12, 35를 인수로 전달할 수 있는 이유는 float타입이 int타입 보다 범위가 더 크기 때문에 가능하다. 다시 말해서 int 타입의 숫자는 float타입의 숫자에 포함되어 있기 때문에 자동으로 float타입으로 바꿔준다.

이렇게 타입을 다른 타입으로 바꾸는 것을 casting(캐스팅)이라고 하며 다음에 다시 정리할 것이다.

 

끝.

Wravan...