https://wonseok1112.tistory.com/7
값 형식과 참조 형식에 대한 글 참고
C#에서 메소드를 호출 할 때 필요한 값을 전달해주기 위해 매개변수에 값을 넣어 전달해준다.
그러나 값 형식은 전에 알아봤듯이 메모리 저장 방식이 달라서 원본값을 바꾸지 못한다.
매개변수로 전달 시에 해당 인자의 값을 복사하여 전달하기 때문.
이것을 값의 의한 호출이라고 하고,
원본을 바꾸기 위해선 참조 형식만 할 수 있는 참조에 의한 호출을 해야 한다.
하지만 int, float, struct 등등의 값 형식 타입의 자료형들도 참조의 의한 호출로 넘길수 있는 키워드가 있다.
(C++ 포인터의 C# 버전이라고 볼 수 있다.)
ref 키워드
사용 방식 ↴
void Start()
{
int a = 1; //int a의 값을 초기화 시켜주지 않고 int a; 이런식으로 놔두면 오류가 생긴다.
Func(ref a);
}
void Func(ref int num) { ... }
함수를 호출하는 부분과, 함수의 매개변수 부분에 ref라는 키워드를 추가하면 참조에 의한 호출이 된다.
위와 똑같은 예시에서 ref 키워드를 사용했더니 원본이 바뀌어 출력된 것을 볼 수 있다.
스택 메모리를 살펴보면 num은 a의 주소를 참조하고 있으므로, num의 값을 바꾸면 원본값(a의 값)도 바뀌게 되는것이다.
하지만 ref는 원본을 바꾸므로 위험할 수도 있는 상황이 생길 수 있다.
따라서 읽기 전용인 in 키워드도 있다.
in 키워드
사용 방식 ↴
void Start()
{
int a = 1; //in 또한 int a의 값을 초기화 시켜주지 않으면 오류가 생긴다.
Func(in a);
}
void Func(in int num) { ... } //읽기 전용
in 키워드는 읽기 전용이기 때문에 값을 대입할 수 없다.
따라서 원본값을 보존하는데에 유리하다.
out 키워드
사용 방식 ↴
void Start()
{
int a; //out에서는 초기화를 안 시켜줘도 된다.
Func(out a);
Debug.Log(a);
}
void Func(out int num) { ... } //쓰기 전용
in과 반대로 out은 쓰기 전용이다.
이렇게 값을 대입할 수 있고,
num에 아무 값을 할당하지 않고 반환하지 않으면 오류가 생긴다.
그리고 out에서는 ref, in과 달리 변수를 초기화 시켜주지 않는데, 초기화를 시키면 오히려 메모리 낭비이기 때문이다.
위의 사진처럼 a값을 12345로 초기화 시켜봤자, Func 함수를 실행시켰을 때 a값은 5로 새로 덮여씌워진다.
따라서 초기화를 시킬 필요가 없다.
추가로
private void Start()
{
int a;
Func(out a);
}
를
private void Start()
{
Func(out int a);
}
이렇게 함축시킬 수도 있다.
'C# 기초' 카테고리의 다른 글
[C#] Static 정적 키워드와 확장 메서드 (1) | 2023.10.25 |
---|---|
[C#] Collections (0) | 2023.10.24 |
[C#] 값 형식과 참조 형식 (1) | 2023.10.23 |
[C#] 일반화 프로그래밍 (제네릭/Generic) (1) | 2023.10.20 |
[C#] 모노 싱글톤 (0) | 2023.10.19 |