이번에 알아볼 것은 바로 메서드이다. C#에서는 메서드라 부르고 C/C++에서는 함수라고도 하는데, 특정한 동작을 수행하거나 특정 결과를 계산하는 일련의 구문 순서를 묶는 수단이다.
우리는 이 메서드들의 이름을 호출하여 사용할 수 있다.
using UnityEngine;
public class Test1 : MonoBehaviour
{
public void Start()
{
int a = 10, b = 20;
Debug.Log(Add(a, b));
}
public int Add(int a, int b)
{
int c = a + b;
return c;
}
}
...이런 식으로 말이다. 이 경우 Add라고 하는 메서드를 Start메서드 내에서 호출했다는 것을 알 수 있다.
메서드에 대해서 조금 더 알아보도록 하자.
스크립트를 보면 using UnityEngine;이라는 부분이 있다. 일종의 네임스페이스라고 보면 된다. 네임스페이스는 일종의 비스무리한 형식들을 묶어서 모아둔 범주와 같다고 생각하면 된다.
네임스페이스를 왜 써야하는가?
예를 들어 Play라는 메서드가 서로 다른 라이브러리에 있다고 해보자. 공교롭게도 Play라는 두 메서드를 한 스크립트에서 동시에 써야 하는경우 어떻게 해야 할까? 매개변수가 서로 달라서 구분되는 경우도 있지만, 너무나도 모호하다.
Animation.Play인지, 아니면 UI.Play인지를 구분해줘야 프로그램이 알아먹는데, 이 구분을 해주는 것이 바로 네임스페이스라는 것이다. 위의 코드의 경우 UnityEngine 내부의 메서드들을 활용하겠다는 의미이다.
여기서 우리는 Start라는 메서드와 Add라는 메서드 총 2개가 있다는 것을 알 수 있다. 그중 우리가 봐야 하는 메서드는 바로 Add메서드이다. 정수 매개변수를 두 개 입력받아 둘을 더한 값을 반환한다.
그 내용을 Start함수에서는 Debug.Log(Add(a, b));와 같은 형태로 호출하고 있다는 것을 알 수 있다. 일종의 출력 메서드 내부에 Add()함수를 호출한 것이다.
매개변수에 대해서도 한번 알아보자.
메서드에 추가로 어떤 인수들을 전달하고 싶을때 우리는 매개변수를 이용하여 전달을 한다. 예를 들어 두 값을 더해서 결과를 반환해주는 메서드가 있다고 해보자. 우리는 그러면 인수로 두 값을 전달해야 한다. 이 인수가 바로 매개변수가 되는 것이다.
이제 매개변수에 대해서도 대강 이해한 것 같다. 그렇다면 우리는 OOP에 대해서 마스터 한 것일까? 아니다.
ref 키워드
다음 스크립트를 한번 보라.
using System;
class Program
{
static void Swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
Console.WriteLine($"Inside Swap: a = {a}, b = {b}"); // 20, 10
}
static void Main(string[] args)
{
int x = 10, y = 20;
Swap(x, y);
Console.WriteLine($"After Swap: x = {x}, y = {y}"); // 10, 20
}
}
Swap메서드는 매개변수 두 개를 입력받아서 메서드 내부에서 교환을 해주는 메커니즘으로 동작한다. 과연 x y는 교환이 되었을까? 정답은 아니다. 이러한 매개변수를 값 형식이라고 하는데, 원본을 복사하여 메서드 내에서 사용되기 때문에 원본 값은 변화가 없다는 것이 특징이다. 변수의 주소가 달라졌다고 할 수 있다. 그렇다면 함수 내에서 교환을 한 결과가 Main함수에서도 유지되려면 어떻게 만들어야 할까?
이렇게 작성하면 된다.
using System;
class Program
{
static void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
Console.WriteLine($"Inside Swap: a = {a}, b = {b}"); // 20, 10
}
static void Main(string[] args)
{
int x = 10, y = 20;
Swap(ref x, ref y);
Console.WriteLine($"After Swap: x = {x}, y = {y}"); // 20, 10
}
}
ref 키워드를 이용하면 원본 변수의 값또한 변경된다.
out 키워드
이 키워드는 좀 특이하다. 처음 호출할 때 매개변수의 값이 없어도 상관 없다. 무한리필집의 접시와 같다고 생각하면 좋다.
메서드 내의 매개변수에 out키워드가 붙는다면 그것은 무조건 초기화를 메서드 내에서 시켜준다는 의미이다.
ref키워드와의 차이점은 ref의 경우 초기화가 된 이후에 매개변수로 사용할 수 있지만, out키워드는 초기화가 필요없다는 것이다.
심지어 매개변수를 메서드 내에서 선언해도 된다.
'Programming > C C# C++' 카테고리의 다른 글
C#) C#에서의 배열 사용 방법 (2) | 2024.11.18 |
---|---|
C#) 캐스팅, 박싱, 언박싱 (0) | 2024.11.14 |
C#) 값 형식과 참조 형식 (0) | 2024.11.13 |
C#) Null과 Void의 차이 (0) | 2024.11.13 |
1.1 + 0.1 == 1.2가 false인 이유 (1) | 2024.11.11 |