팀프로젝트 발표중 튜터님께서 어떤 코드를 보고 깊은 참조와 얕은 참조에 대해 이해하고 사용한 부분이 인상적이라고 하셨는데, 해당 부분은 잘 모르는 부분이라 메모해두었다가 공부를 하게 되었다.
우선 해당 내용은 객체 복사 방식과관련된 개념이다.
우선 얕은참조는 객체의 주소값을 복사해서 사용하는 방식이다.
그러니까 데이터를 담는곳이 같은곳이라는 뜻이다.
원본이 A 복사본이 B 라는 가정에하에
A가 바뀌면 B가 바뀌고 B가 바뀌면 A가 바뀐다.
아래의 예제코드를 보면 이해가 쉽다.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
// person1 생성
Person person1 = new Person { Name = "LeeJongJong", Age = 18 };
// 얕은 참조
Person person2 = person1;
// person2의 데이터를 수정
person2.Name = "LeeJongGeun";
person2.Age = 28;
// person1,2 의 결과 출력
Console.WriteLine($"Person1: {person1.Name}, {person1.Age}"); //출력: LeeJongGeun, 28
Console.WriteLine($"Person2: {person2.Name}, {person2.Age}"); //출력: LeeJongGeun, 28
}
}
다음은 깊은 참조이다.
깊은 참조는 객체의 데이터를 새롭게 복사하는 방식이다.
즉 독립적인 데이터를따로 만드는것이다.
당연하게도 얕은참조와 반대로 한객체를 변경해도 다른객체에는 영향이 없다.
이 내용도 아래의 예제코드를 보면 이해가 매우 쉽다.
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
// 깊은 참조메서드
public Person Clone()
{
return new Person { Name = this.Name, Age = this.Age };
}
}
class Program
{
static void Main()
{
// person1 객체 생성
Person person1 = new Person { Name = "LeeJongJong", Age = 18 };
// 깊은참조
Person person2 = person1.Clone();
// person2의 데이터를 수정
person2.Name = "LeeJongGeun";
person2.Age = 28;
// person1,2의 결과 출력
Console.WriteLine($"Person1: {person1.Name}, {person1.Age}"); //출력: LeeJongJong, 18
Console.WriteLine($"Person2: {person2.Name}, {person2.Age}"); //출력: LeeJongGeun, 28
}
}
요약하자면
얕은 참조 : 객체의 참조만 복사하고 같은 메모리 주소를 사용한다.
깊은 참조 : 새로운 객체를 생성하고 복사하여 독립적으로 사용이 가능하다.
라고 할 수 있다.
얕은참조와 깊은참조가 어떤 상황에 사용되는지도 찾아보았다.
나는 게임개발을 배우고있기에 게임개발에 사용되는 예시를 설명해보겠다.
예시를 찾아보며 알게되었는데 다수의 상황이 얕은참조를 사용하게 되는 것 같다.
얕은참조
1. 설정파일(그래픽,사운드 등의 설정)
2. 싱글톤패턴(이전 TIL게시글을 보면 알겠지만 싱글톤 패턴도 얕은참조를 이용하여 사용하고 있었다.)
3. 스프라이트 혹은 모델(성능최적화에 중요한 부분이다. 여러 캐릭터 혹은 UI가 동일한 스프라이트 혹은 모델을 공유할때 얕은 복사를 사용하여 메모리 사용량을 줄이고 성능을 최적화 할 수 있다고 한다.)
깊은참조
1. 아이템시스템(아이템을 획득했을때 아이템의 상태나 속성이 달라질 수 있는 경우)
2. 데이터 저장 및 불러오기(게임저장 및 불러오기를 할때 새로운게임을 하더라도 이전에 저장된 상태와 독립적으로 플레이가 가능하게 하기)
끗