C++에서는 "call by reference"와 "pass by reference"를 구분하여 사용하지 않고, 둘 다 "참조에 의한 호출(call by reference)"이라는 용어를 사용합니다.
C#에서는 "pass by reference"를 "참조에 의한 전달"이라는 용어로 사용하고, "call by reference"를 "참조에 의한 호출"이라는 용어로 사용합니다.
즉, C#에서는 "pass by reference"와 "call by reference"를 구분하여 사용합니다. 하지만 C++에서는 둘 다 "참조에 의한 호출"로 통용되며, 구분하여 사용하지 않습니다.
언어마다 쓰는 매개 변수 키워드가 다르다
- C++에서는 "call by reference"를 사용할 때 매개 변수 앞에 & 기호를 사용합니다.
- C#에서는 "pass by reference"를 사용할 때 매개 변수 앞에 ref 키워드를 사용합니다.
C++에서 "call by reference"를 사용하는 예시 코드:
#include <iostream>
void swap(int& a, int& b) { // &를 사용하여 call by reference 방식으로 매개변수를 전달
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 5, y = 10;
std::cout << "Before swap: x = " << x << ", y = " << y << std::endl;
swap(x, y); // call by reference로 x와 y를 swap 함수에 전달
std::cout << "After swap: x = " << x << ", y = " << y << std::endl;
return 0;
}
C#에서 "pass by reference"를 사용하는 예시 코드:
using System;
class Program {
static void Swap(ref int a, ref int b) { // ref 키워드를 사용하여 pass by reference 방식으로 매개변수를 전달
int temp = a;
a = b;
b = temp;
}
static void Main(string[] args) {
int x = 5, y = 10;
Console.WriteLine($"Before swap: x = {x}, y = {y}");
Swap(ref x, ref y); // pass by reference로 x와 y를 Swap 메서드에 전달
Console.WriteLine($"After swap: x = {x}, y = {y}");
}
}
추가:
C#에서 메소드 선언의 매개변수, 그리고 메소드 호출의 매개 변수 앞에 ref 기호를 붙이면 됩니다.다만 C#은 안정성을 위해 "입력 전용 매개 변수" in, "출력 전용 매개 변수" out 키워드를 많이 사용합니다. in과 out 모두 ref과 유사하지만 차이점이 있습니.
in 키워드는 매개변수를 읽기 전용으로 전달하고자 할 때 사용됩니다.
in 키워드를 사용하면 함수 내에서 해당 매개변수의 값을 변경할 수 없습니다.
in 키워드는 ref 키워드와 유사하지만, 함수 내에서 해당 매개변수를 초기화하지 않기 때문에 보다 안전하게 사용할 수 있습니다.
예를 들어, 다음과 같이 in 키워드를 사용하여 매개변수를 전달할 수 있습니다.
void Foo(in int x) {
// x = x + 1; // 오류: 읽기 전용 매개변수
Console.WriteLine(x);
}
int main() {
int a = 1;
Foo(in a);
}
out 키워드는 함수 내에서 새로운 값을 반환하고자 할 때 사용됩니다.
out 키워드를 사용하면 함수 내에서 해당 매개변수의 값을 변경할 수 있습니다.
out 키워드는 ref 키워드와 유사하지만, 함수 내에서 매개 변수에 값이 할당 안 되면 에러를 내뱉습니다.
void Bar(out int x) {
x = 2;
}
int main() {
int a;
Bar(out a);
Console.WriteLine(a); // 출력 결과: 2
}
'C# 프로그래밍' 카테고리의 다른 글
[C#] 컬렉션 초기화 (0) | 2023.02.24 |
---|---|
[C#] 일반화 컬렉션 (0) | 2023.02.23 |
[C#] 컬렉션 (1) | 2023.02.23 |
[C++][C#] 클래스 객체 인스턴스 생성 (0) | 2023.02.22 |
프로퍼티 (0) | 2022.10.31 |