Deff_Dev
[Unity/C#] 메소드 본문
해당 포스팅은 고박사님의 유니티 C# 강의를 보고 공부한 내용과 추가적으로 공부한 내용을 정리한 포스팅입니다.
메소드란 ?
- 객체 지향 프로그래밍 언어에서 사용하는 용어 (메소드 = 함수, 프로시져, 서브루틴)
- 일련의 코드를 하나의 이름 아래 묶은 것
- 묶어 놓은 코드를 메소드의 이름을 불러 내부 코드들을 실행
public class 클래스이름
{
한정자 반환형식 메소드이름(매개변수)
{
// 코드
return (반환형식)데이터;
}
}
메소드의 장점
- 반복된 코드 작성이 편해지고 가독성이 높아진다.
매개 변수
값에 의한 전달 (Call By Value)
- 함수의 매개변수에 값을 복사해 전달한다.
- 값이 복사되어 매개변수로 전달되기 때문에 함수 내에서 해당 변수의 값을 변경하더라도 호출된 함수에서의 원래의 값이 변경되지 않는다.
private void Awake()
{
int a = 10, b = 1;
Debug.Log(a + " " + b);
Swap(a, b);
Debug.Log(a + " " + b);
}
private void Swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
참조에 의한 전달 (Call By Reference)
- 값에 의한 전달과 달리, 해당 변수의 메모리 주소를 전달하여 값을 수정할 수 있다.
- 변수의 복사본이 아닌 실제 변수 자체를 전달한다.
- 사용 방법은 매개 변수 앞에 ref를 작성한다.
private void Awake()
{
int a = 10, b = 1;
Debug.Log(a + " " + b);
Swap(ref a, ref b);
Debug.Log(a + " " + b);
}
private void Swap(ref int a,ref int b)
{
int tmp = a;
a = b;
b = tmp;
}
참조 지역 변수
public class Product
{
private int price = 100;
public ref int GetPrice()
{
return ref price;
}
public void PrintPrice()
{
Debug.Log($"Price : {price}");
}
}
public class TestManager : MonoBehaviour
{
private void Start()
{
Product snack = new Product();
// 참조 지역 변수
ref int snackPrice = ref snack.GetPrice();
snack.PrintPrice();
Debug.Log(snackPrice);
// 참조 지역 변수의 값을 바꿔도 snack의 price 값이 바뀐다.
snackPrice = 1000;
snack.PrintPrice();
Debug.Log(snackPrice);
}
출력 전용 매개 변수 Out
- ref 매개 변수는 메소드 내부에서 결과를 저장하지 않아도 컴파일러가 아무런 경고도 하지 않는다.
- out 매개 변수는 메소드 내부에서 결과를 저장하지 않으면 컴파일 에러가 발생해 개발자의 실수를 줄여주기 때문에 out을 쓰는것을 권장한다.
private void Awake()
{
int a = 10, b = 1, result = 0;
Add(a, b , out result);
Debug.Log(result);
}
private void Add(int a,int b, out int result)
{
result = a + b;
}
메소드 오버로딩
- 동일한 메소드 이름으로 여러 종류의 메소드를 구현하는 것
- 매개 변수의 개수와 형식을 분석하여 메소드를 선택함.
- 단, 반환 형식은 고려하지 않기 때문에 반환 형식만 다를 경우는 구분하지 못한다.
private void Awake()
{
Add(1,2);
Add(1.7f, 1.1f);
}
private void Add(int a,int b)
{
Debug.Log(a + b);
}
private void Add(float a, float b)
{
Debug.Log(a + b);
}
가변 길이 매개 변수
- 개수가 유연하게 변할 수 있는 매개 변수
- 배열 매개 변수 앞에 params 키워드를 붙히고 사용
private void Awake()
{
Add(1,2,3,4);
Add(1,2);
}
private void Add(params int[] nums)
{
int sum = 0;
for(int i = 0; i< nums.Length; i++)
{
sum += nums[i];
}
Debug.Log(sum);
}
명명된 매개 변수
- 일반적을 매개 변수에 데이터를 할당할 때 순서에 의거하여 할당하는 반면, 순서에 상관 없이 매개 변수의 이름에 근거하여 데이터를 할당하는 방법
- 코드의 길이는 길어지지만 코드 가독성이 높아진다.
private void Awake()
{
Func(b: 500,a: 100);
}
private void Func(int a,int b)
{
Debug.Log("a = " + a + " b = " + b);
}
선택적 매개 변수
- 매개 변수를 특정 값으로 초기화 하지 않았을 때 기본 값을 할당하는 것
- 필요에 따라 매개 변수에 데이터를 할당하거나 할당하지 않을 때 사용
- 선택적 매개 변수는 항상 필수 매개 변수 뒤에 와야 한다.
private void Awake()
{
Func(100);
}
private void Func(int a,int b = 10000)
{
Debug.Log("a = " + a + " b = " + b);
}
// 선택적 매개 변수는 항상 필수 매개 변수 뒤에 나와야 함
/* 불가능한 코드
private void Func(int a = 1000 ,int b)
{
Debug.Log("a = " + a + " b = " + b);
}
*/
로컬 함수
- 메소드 안에서 선언되고, 선언된 메소드 안에서만 사용되는 특별한 함수이다.
- 클래스의 멤버가 아니기 때문에 메소드가 아니라 함수라고 부른다.
- 로컬 함수는 해당 메소드에서만 사용되는 함수이기 때문에 함수 간의 의존성을 줄일 수 있고 가독성 향상과 유지 보수하기 쉬워진다는 장점이 있다.
private void Start()
{
int x = 100;
LocalFunc(); // 로컬 함수 호출
void LocalFunc() // 로컬 함수
{
Debug.Log(x); // 100
x = 500; // 메소드의 지역 변수에 접근할 수 있다.
Debug.Log(x); // 500
}
}
'Unity(유니티) > 유니티 공부' 카테고리의 다른 글
[Unity/C#] 클래스 (0) | 2024.03.09 |
---|---|
[Unity/C#] 객체 지향 프로그래밍 (0) | 2024.03.09 |
[Unity/C#] 상수, 열거형, Nullable, var (0) | 2024.03.04 |
[Unity/C#] 데이터 형 변환 (0) | 2024.03.04 |
[Unity/C#] 변수 (0) | 2024.02.25 |