오늘은 C# 필수지식 ref, out 키워드에 대해 공부해요!
ref와 out은 참조 타입과 밀접한 관련이 있어요.
참조타입 값타입에 대해 가물가물하시다면 아래 글을 참고해주세요!
https://unityking.tistory.com/10
[C#] 값 타입 참조 타입 정리
오늘은 C#에서 필수 지식인 값 타입과 참조타입에 대해 공부해요! 간단하게 먼저 정리하자면값 형식(Value Type)은 변수가 값을 담고있는 형식이고참조 형식(Reference Type)은 변수가 값이 있는 위치
unityking.tistory.com
간단하게 먼저 정리해보면 ref 또는 out 키워드를 통해 참조 타입으로 메소드의 결과를 반환할 수 있어요.
왜 참조 타입으로 메소드의 결과를 반환하느냐??
예를 들어 아래 코드로 두개의 숫자를 바꾸는 함수 Swap을 실행한다면
x, y의 값이 실제로 바뀌어 있을까요?
using System;
namespace RefOutStudy
{
class Program
{
public static void Swap(int a, int b)
{
int temp = b;
b = a;
a = temp;
}
static void Main(string[] args)
{
int x = 3;
int y = 4;
Console.WriteLine($"x : {x} y : {y}");
Swap(x, y);
Console.WriteLine($"x : {x} y : {y}");
}
}
}
해당 코드를 실행시켜보면 x, y 값은 서로 바뀌지 않고 그대로랍니다!
그 이유는 Swap 함수가 값타입을 매개변수로 갖기 때문이에요
값타입을 매개변수로 갖는 메소드의 경우 복사를 통해 새로운 변수를 생성하여
새로운 변수에 대해 메소드가 실행되기 때문에
원래 값에는 영향을 미치지 못한답니다.
그래서 필요한것이 참조에 의한 매개변수에요!
참조타입은 해당 값을 가리키는 주소값을 넘겨주기때문에
메소드에서 매개변수로 받아도 해당 주소의 값에 대해 메소드가 실행된답니다!
따라서 기존의 값을 변화시킬 수 있어요!
자 그럼 참조에 의한 매개변수로 코드를 바꿔볼게요
using System;
namespace RefOutStudy
{
class Program
{
public static void Swap(ref int a, ref int b)
{
int temp = b;
b = a;
a = temp;
}
static void Main(string[] args)
{
int x = 3;
int y = 4;
Console.WriteLine($"x : {x} y : {y}");
Swap(ref x, ref y);
Console.WriteLine($"x : {x} y : {y}");
}
}
}
ref 키워드를 매개변수에 붙여주고
메소드를 호출할 때도 매개변수 앞에 ref 키워드를 붙여주면 된답니다!
이렇게 하면 Swap 메소드가 실행된 후에
x, y의 값이 서로 바뀌어 있어요
C++을 배우신 분이라면 & 키워드와 같은 맥락이라고 이해하시면 편할 듯 합니다.
자 그럼 out 키워드는 뭘까요?
out 키워드도 ref 키워드와 비슷해요
하지만 ref 키워드와 차이가 있으니까 따로 out 키워드를 쓰겠죠?
out 키워드가 ref와 다른 점을 설명드릴게요
ref 키워드로 선언된 변수의 경우에는 메소드 안에서
값이 저장되지 않아도 따로 경고나 에러가 발생하지 않아요!
즉, 메소드가 실행된 후 아무값도 저장되지 않은 변수가 있을 수 있다는 것이죠
정말 끔찍하죠?
그래서 out 키워드를 씁니다!
out 키워드로 선언된 변수는 메소드 안에서 반드시 값이 저장되어야 해요.
만약 out 키워드로 선언된 변수에 값을 저장하지 않는다면
컴파일러가 에러 메세지를 출력한답니다.
따라서 실수로 인한 에러를 미리 잡을 수 있는
out 키워드를 사용하면 좋겠죠?
namespace UsingOut
{
class MainApp
{
static void Divide(int a, int b, out int quotient, out int remainder)
{
quotient = a / b;
remainder = a % b;
}
static void Main(string[] args)
{
int a = 20;
int b = 20;
//int c;
//int d;
Divide(a, b, out int c, out int d);
Console.WriteLine($"a:{a}, b:{b}, a/b:{c}, a%b:{d}");
}
}
}
out 키워드의 경우에는 초기화되지 않은 변수에 지역 변수를 매개변수로 넘길 수 있게 해줘요
컴파일러가 메소드에서 지역변수를 할당할 것을 보장하기때문에!!
또한, out 키워드의 경우에는 미리 선언할 필요 없이
메소드 호출 코드에서 바로 선언해도 된답니다!
out 키워드는 주로 반환값이 여러개인 메소드를 위해 사용된답니다.
이런 out 키워드는 "출력 전용 매개변수"라고 해요!
'C#' 카테고리의 다른 글
| [C#] 배열 (0) | 2024.10.07 |
|---|---|
| [C#] 프로퍼티 (1) | 2024.10.06 |
| [C#] 얕은 복사와 깊은 복사 - 설명 및 예제 코드 (0) | 2024.10.05 |
| [C#] 박싱과 언박싱 (0) | 2024.10.01 |
| [C#] 값 타입 참조 타입 정리 (2) | 2024.10.01 |