TIL 25.02.10 - 얕은 복사, 깊은 복사

강진규·2025년 2월 10일

Today I Learned

목록 보기
9/34
post-thumbnail

오늘 과제를 진행하던 중 문제가 발생하여 튜터님을 찾아갔는데, 얕은 복사와 깊은 복사에 대해
언급해주셨고, 그것을 한번 찾아보고 문제를 해결해보는 것을 추천하셨다.
정말 다행히도 문제는 해결 되었고, 그 내용에 대해 한번 정리해보았다.


[ 얕은 복사 ]

  • 복사하려는 원본에 대한 새로운 객체를 생성하는데, 이 객체는 원본 객체를 참조
  • 생성된 복사본은 원본 객체가 가리키는 주소와 같은 곳을 가리키게 됨
  • 복사본은 원본 객체에 종속적
class Number()
{
    public int a;
    public int b;
}
static void Main(string[] args)
{
    Number number1 = new Number();
    Number number2 = number1;

    number1.a = 1;
    Console.WriteLine($"number1 int a = {number1.a}");
    Console.WriteLine($"number2 int a = {number2.a}");
}

위 코드에서 number1.a만 1로 변경하려고 했지만, number1, number2는 같은 주소를
가리키고 있기 때문에 number2.a도 1로 변경된다.


[ 깊은 복사 ]

  • 얕은 복사와 같이 원본에 대한 복사본을 생성하는데,
    인스턴스화할 수 있는 모든 요소
    (내부의 클래스 변수, 메서드, 인스턴스 값 등)를 모조리 복사
  • 원본 객체로부터 완전히 독립적인 객체를 생성
  • 생성된 복사본은 원본 객체에 종속적이지 않고 독립적
class Number()
{
	public int a;
    public int b;

    public Number Copy()
    {
		Number number = new Number();
        number.a = a;
        number.b = b;
        return number;
	}
}
static void Main(string[] args)
{
	Number number1 = new Number();
	Number number2 = number1.Copy();

	number1.a = 1;
	Console.WriteLine($"number1 int a = {number1.a}");
	Console.WriteLine($"number2 int a = {number2.a}");
}

위의 코드에서는 Copy라는 메서드를 통해 새로 생성된 인스턴스에 있던 값들을 그대로 복사해준다.
이렇게 되면 number1 값이 바뀌더라도 number2의 값은 유지가 된다.


[ 문제 해결 ]

팀 과제 관련 글에서 작성했듯이 몬스터가 중복되어 타격되는 문제가 생겼는데,
(킹갓)염예찬 튜터님의 조언을 받고 문제를 해결하게 되었다.

Monster newMonster = new Monster(monsters[stageMonster].Level,
                      monsters[stageMonster].Name, 
                      monsters[stageMonster].Hp, 
                      monsters[stageMonster].Attack, 
                      false);

새로 객체를 생성하여 그전에 있던 값을 넣어주었고, 발생했던 문제점은 단번에 해결되었다.
이 문제로 팀원들과 내 정수리가 많이 뜨거웠었는데 다행히도 해결되어 속이 뻥 뚫렸다.

0개의 댓글