class Movie {
public string? Title {get;set;}
}
class Program {
static void Main() {
var movie = new Movie { Title = "Movie 1" }
ChangeMovieTitle(movie);
Console.WriteLine(movie.Title);
// Title 변경됨.
AllocateNewMovie(movie);
Console.WriteLine(movie.Title);
// Title 변경안됨.
}
static void ChangeMovieTitle ( Movie movie ) {
movie.Title = "Changed Movie";
}
static void AllocateNewMovie ( Movie movie ) {
movie = new Movie { Title = "New Movie" }
}
}
와 저는 개념을 다시 잡아야겠네요;;; 당연히 기존 변수 movie를 참조로 전달해서 재성생했기 때문에 main의 movie 주소값은 변경이 없어 재생성되는지 알았는데 ;; 만약 AllocateNewMovie에 movie에 this를 추가하여 new 키워드로 재생성하면 값은 변경이 되는건가…
일반적으로 새로 값을 할당하는 경우가 아닌 이상 이런 문제를 겪을 일이 없다보니 간과하기 쉬운데, Pass by reference라고 생각하지만 Pass a reference type by value입니다. 값 타입 변수든 참조 타입 변수든 기본적으로는 값 복사로 전달됩니다. 다만 값 타입 변수는 변수에 저장된 값이 복사되고, 참조 타입 변수는 해당 변수가 참조하는 주소가 복사되는 점이 다릅니다.
Foo()의 person1과 Bar(Person person)의 person2는 같은 메모리 주소를 참조하는 다른 변수입니다. c 계열의 포인터처럼 person2가 person1을 가리키는 게 아닙니다. 즉 Bar에서 person2에 새 객체를 할당하여 변수가 가리키는 주소값을 수정하면 person1과 person2가 서로 다른 주소를 참조하게 됩니다.
다른 분들 말씀처럼 ref 키워드를 붙여 Pass by reference로 동작하게 해주면 person2이 person1을 참조하기 때문에 person2에 새 객체를 할당하면 person1에 수정사항이 반영됩니다.