728x90
반응형
1. 참조 타입과 매개 변수 전달
using System;
class Point {
public int x = 0;
public int y = 0;
public Point(int a, int b) { x = a; y = b; }
}
class Program {
public static void f1(Point p) { // Point p = p1
p.x = 2;
}
public static void Main() {
Point p1 = new Point(1, 1);
f1(p1);
Console.WriteLine(p1.x);
}
}
Point 클래스가 있고 메인함수에서 p1 객체를 만든 후 p1객체의 멤버변수인 x를 2로 바꾸고 출력해보는 코드이다.
앞선 int와 같은 값타입과 다르게 참조타입인 class는 인자를 전달해 줄때와 받을 때 ref를 붙이지 않아도 될까?
그림으로 먼저 살펴보자.
먼저 객체를 생성하면 위와 같은 그림이 된다.
여기서 16번째 라인의 f1(p1); 코드를 실행하면
인자를 전달받을 때 Point p = p1 과 같은 코드를 실행하고 복사본을 만들게 된다.
그런데 이 복사본은 값을 들고 있는게 아닌 p1과 같이 주소를 복사한다.
따라서 이 주소는 같은 값을 바라보게 된다.
코드를 살짝 바꿔보자.
using System;
class Point {
public int x = 0;
public int y = 0;
public Point(int a, int b) { x = a; y = b; }
}
class Program {
public static void f1(Point p) {
p.x = 2;
p = new Point(5, 5);
}
public static void Main() {
Point p1 = new Point(1, 1);
f1(p1);
Console.WriteLine(p1.x);
}
}
f1 메소드 안에 새로운 객체를 만드는 코드가 추가되었다.
그렇다면 결과값이 여전히 2로 나올까? 아니면 새로운 객체를 만들었으니 5로 나올까?
이것도 그림으로 먼저 보면 쉽다.
새로운 객체를 만들게 되지만 결국 p1이 가리키는건 변하지 않기에 결과값은 그대로 2로 나온다.
이번에는 ref를 붙여서 다른 예제를 보자.
using System;
class Point {
public int x = 0;
public int y = 0;
public Point(int a, int b) { x = a; y = b; }
}
class Program {
public static void f1(ref Point p) { // ref Point p = ref p1
p.x = 2;
p = new Point(5, 5);
}
public static void Main() {
Point p1 = new Point(1, 1);
f1(ref p1);
Console.WriteLine(p1.x);
}
}
전과 동일한 코드에서 ref를 붙였다.
위의 그림과 어떤 차이가 있을 지 그림으로 다시 살펴보자.
그림이 바뀐 부분은 p1의 복사본이 p가 되는게 아닌 p가 만들어지고 p1을 가리킨다는 점이다.
p의 값이 바뀌면 p가 가리키는 p1이 가리키는 값을 바꾸어 전과같이 x가 2로 바뀌게 된다.
이제 12번 라인의 코드가 실행됬을 때 어떻게 변하는지 보자.
p가 새로운 객체를 만들어 넣었는데 이 p가 가리키는게 p1이므로 결국 p1이 새로운 객체를 가리키게 된다.
따라서 결과값은 이제 2가 아닌 5가 나온다.
① 참조 타입을 값으로 전달하면 객체의 상태를 변경할 수 있지만 새로운 객체를 담아 올 수는 없다.
② 참조 타입을 ref로 전달하면 객체의 상태를 변경할 수 있고 새로운 객체도 담아 올 수 있다.
728x90
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] Named, Optional Parameter (0) | 2020.02.28 |
---|---|
[C#] 가변 길이 매개 변수 (params) (0) | 2020.02.26 |
[C#] 인자 전달 방식 (1) (0) | 2020.02.15 |
[C#] 다차원 배열, 가변 배열 (1) | 2020.02.14 |
[C#] 배열 기본 (0) | 2020.02.14 |