본문 바로가기
TIL/C#

함수와 지역,전역 변수

by jaemmm 2020. 9. 12.

지금까지 조건문, 반복문, 연산자 등등 C#에서 쓰이는 기본적인 것들에 대해서 공부해보았다.

 

이번 시간에는 이러한 기능들을 하나로 묶어서 사용할 수 있는 함수에 대해서 알아보도록 하겠다.


가장 먼저 함수란 무엇일까?

 

간단하게 말하면 위에서 잠깐 설명한 것처럼 여러 기능을 하나로 묶어서 사용할 수 있는 것이다.

 

만약 내가 플레이어가 움직이는 코드를 만들었고, 이 코드가 50줄이 넘는 엄청나게 긴 코드라고 가정하자.

 

그러고 다른 곳에 움직이는 코드를 사용해서 또 다른 것을 구현하고 싶을 때, 하나하나 50줄이나 되는 코드를 작성하기는 상당히 귀찮을 일이다.

 

그때 움직이는 코드를 하나의 함수(playerMove)로 지정해두었다면 playerMove만 입력하면 움직이는 코드를 간편하게 사용할 수 있는 것이다.

 


C# 스크립트를 켜게 되면 void Start, void Update가 보일 텐데 이 역시 함수이다.

 

여기서 void의 의미를 잠깐 알아보자면 return을 할 필요가 없는 함수를 쓸 때 사용하는 것이다.

 

return에 대한 설명은 잠시 후에 하도록 하겠다.

 

유니티에는 이처럼 기본 함수가 여러 종류가 있다.

 

1) Update

 

Update 함수는 스크립트가 켜져 있을 때(enabled 상태일 때) 매 프레임마다 호출된다.
Update 함수는 스크립트에서 가장 빈번하게 사용되는 함수이며, 스크립트가 켜져 있을 때만 불린다.

 

2) LateUpdate

 

LateUpdate 함수는 스크립트가 켜져 있을 때 매 프레임마다 호출된다.

그냥 Update와의 차이점은 모든 Update가 호출된 후 호출된다. (실행순서를 결정지을 때 도움된다.)

예를 들어 따라다니는 카메라는 언제나 LateUpdate 를 구현해야 하는데, 그 이유는 이 카메라가 따라가는 오브젝트들은 Update 안에서 움직일 가능성이 있기 때문이다.

이 함수도 마찬가지로 스크립트가 켜져 있을 때만 불린다.

 

3) FixedUpdate

 

FixedUpdate 함수는 스크립트가 켜져 있을 때 매 프레임마다 호출된다.

FixedUpdate는 Rigidbody 를 다룰 때, Update 대신에 사용된다.

 

4) Start

 

Start 함수는 Update 함수가 처음 호출될 때 Update 함수 직전에 호출된다.

 

5) Awake

 

Awake 함수는 스크립트가 로딩될 때 호출되며, 변수 혹은 게임 상태를 시작 전에 초기화시킬 때 사용된다.

Start 함수보다 먼저 호출된다.

 

 

 

내용이 조금 많아 헷갈릴 수 있지만 기본 함수마다 특성이 있기 때문에 주의해야 한다.


이어서 기본 함수의 종류를 간단하게 살펴봤으니, 직접 함수를 만들어 보겠다.

 

함수를 쓸 때는 void, int, flaot, string과 같이 이 함수의 형태(정수, 소수, 문자열)를 생각하여 사용하면 된다.

 

void는 위에서 약간 언급한 것 처럼 return 할 필요 없이 코드를 실행시킬 수 있는 형태이다.

 

 

damage는 Start안에 들어있는 변수이다. float는 Start와 별개로 생성된 함수.

위의 사진은 buff라는 새로운 함수를 만들어둔 상태이며, damage를 30퍼센트 증가 시켜주는 기능을 하고 있다.

 

그리고 damage라는 변수는 현재 void Start안에 있는 변수이기 때문에 buff의 시점으로 보면 damage를 쓸 수 없기 때문에 buff 괄호 안에 damage를 넣어준 것이다.

 

damage의 값을 가져왔으면 다시 가져다주어야 하기때문에 마지막에 return이 들어가는 것이다.

 

여기서 새로운 개념이 등장하는데 바로 지역 변수전역 변수이다.

 

 

 

지역 변수 : 함수 안에서 선언된 변수

 

전역 변수 : 함수 바깥에 선언된 번수

 

 

 

즉, damage는 Start 함수 안에 선언된 변수이기 때문에 지역 변수이다.

 

 

그렇다면, void 함수는 return할 필요가 없다고 했는데 buff라는 함수도 return 없이 void함수로 만들 수 있지 않을까?

 

그럴 경우에는 작성해야되는 코드가 꽤나 바뀌게 된다.

 

먼저 damage를 전역 함수로 바꿔준다.

 

지금 buff의 관점에서 볼 때 damage라는 변수는 볼 수 있기 때문에 괄호 안에 별도의 변수를 입력하지 않아도 된다.

 

불러오는 변수가 없기 때문에 return할 필요가 없어진 것이다.

 

 

 

 

이렇게 직접 함수를 만들어 봤는데 전역, 지역 변수의 개념을 확실하게 알고 넘어가야 함수를 자유롭게 사용할 수 있을 것이다. 

 

전역 변수를 최대한 줄이는 것이 메모리 상으로 좋은데, 전역 변수는 프로세스가 시작될 때 생성을 해둔 상태에서 계속 사용되기 때문에 메모리를 잡아먹는다. 

 

그 반면에 지역 변수는 사용될 때만 잠깐 불러오고 다시 삭제시켜서 메모리 적으로 유리할 것 같지만, 지역 변수를 필요 이상으로 여러 개 묶어서 사용하면 오히려 전역 변수보다 메모리를 차지하는 일이 생길 수 있기 때문에 상황에 따라 쓰는 것이 좋다.

 

 

 

 

오늘은 지금까지 배운 것 중에 가장 복잡한 내용이었다.

 

막상 이해하고 보니 너무 해맨거 같다는 생각도 들지만 이렇게 이해하고 넘어가서 다행이다.

 

 

 

 

다음 시간에 계~~~~~~속!!!!

 

 

 

 

 

 

 

 

'TIL > C#' 카테고리의 다른 글

클래스(Class)  (0) 2020.09.15
반복문(while, for, foreach)  (0) 2020.09.11
조건문 (switch-case,default)  (0) 2020.09.09
조건문 (if-else)  (0) 2020.09.07
비교, 논리, 삼항 연산자  (0) 2020.09.05

댓글