728x90
반응형
1. ref local variable
using System;
class Program {
public static void Main() {
int n1 = 10;
int n2 = n1;
n2 = 20;
Console.WriteLine($"{n1}, {n2}");
int n3 = 10;
ref int n4 = ref n3;
n4 = 20;
Console.WriteLine($"{n3}, {n4}");
}
}
C# 문법 중
ref int n4 = ref n3;
값 타입 앞에 ref 라고 붙이는 문법이 있다.
이렇게 만들면 정수형 변수를 만들지만 일반 변수가 아닌, 참조 변수로 만들겠다. 라는 뜻이다.
따라서 값을 직접 들지 않고 주소를 가지고 있다.
나중에 덩치가 큰 구조체를 만들었는데 코딩하며 복사본이 생기는 상황은 안 좋을텐데
그러한 상황에서 주소를 가지게 되면 효율적으로 사용할 수 있게된다.
2. 매개 변수 전달 방식 #1
using System;
class Program {
public static void inc1(int n) { ++n; }
// int n = n1
public static void Main() {
int n1 = 10;
inc1(n1);
Console.WriteLine(n1);
}
}
위의 코드는 정수를 전달하면 inc1 함수를 통해 1이 증가된 값을 출력해보는 코드이다.
처음 n1을 10으로 선언하고 inc1함수의 인자로 n1을 전달했다.
결과값은 11이 되야할 것 같지만 막상 실행해보면 여전히 결과는 10임을 볼 수 있다.
이는 인자를 전달하며 새로운 n이라는 객체가 만들어지고 그 객체가 증가하여
n1은 그대로인 상황이다. 그림으로 보면 아래와 같다.
그렇다면 위의 코드를 의도대로 돌게 하려면 어떻게 수정해야 할까?
using System;
class Program {
public static void inc1(ref int n) { ++n; }
public static void Main() {
int n1 = 10;
inc1(ref n1);
Console.WriteLine(n1);
}
}
3. 매개 변수 전달 방식 #2
using System;
class Program {
// 메소드로부터 2개의 결과 값을 반환 받고 싶다.
public static int prev_next_number1(int n) {
return n - 1;
}
public static void Main() {
int n1 = 10;
int result2 = 0;
int result1 = prev_next_number1(n1);
Console.WriteLine($"{result1}, {result2}");
}
}
위의 코드의 prev_next_number1 메소드를 통해 결과값을 result1, result2 두 개에 전달하고 싶다.
하지만 결과값 리턴은 하나만 가능하다. 어떻게 해야 할까?
using System;
class Program {
// 메소드로부터 2개의 결과 값을 반환 받고 싶다.
public static int prev_next_number1(int n, ref int r) {
r = n - 1;
return n - 1;
}
public static void Main() {
int n1 = 10;
int result2 = 0;
int result1 = prev_next_number1(n1, ref result2);
Console.WriteLine($"{result1}, {result2}");
}
}
위에서 result2는 뭔가를 전달하기보단 꺼내오려고 쓰고 있는데
이러한 인자를 out parameter라고 한다. 이럴 때는 아래와 같이 조금 더 낫게 고칠 수 있다.
using System;
class Program {
// 메소드로부터 2개의 결과 값을 반환 받고 싶다.
public static int prev_next_number1(int n, out int r) {
r = n - 1;
return n - 1;
}
public static void Main() {
int n1 = 10;
int result2 = 0;
int result1 = prev_next_number1(n1, out result2);
Console.WriteLine($"{result1}, {result2}");
}
}
위의 두 개의 코드에서 ref로 적는 것과 out으로 적는것의 차이점은 무엇일까?
728x90
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 가변 길이 매개 변수 (params) (0) | 2020.02.26 |
---|---|
[C#] 인자 전달 방식 (2) (0) | 2020.02.17 |
[C#] 다차원 배열, 가변 배열 (1) | 2020.02.14 |
[C#] 배열 기본 (0) | 2020.02.14 |
[C#] Boxing / Unboxing (3) (1) | 2020.02.11 |