[TIL] C# - 얕은 복사, 깊은 복사 - day 33

뭉크의 개발·2023년 9월 1일
0

C# - Camp

목록 보기
17/18
post-thumbnail

🐧 들어가기 앞서

팀 과제가 마무리 됐다.

우여곡절 깃허브 충돌도 났었고, 여러가지 이슈도 있었지만

행복하게 잘 마무리 했다!

이제는 주말동안 공부도 하고, 잘 쉬면서

다음주에 있을 유니티를 준비해보자..

그전에, 남들은 다 알지만 나만 잘 모르는 복사에 대해 추가 공부를 진행했다.


🐧 오늘 배운 것

  • 깊은 복사, 얕은 복사

  • 인터페이스, 추상 클래스 차이


🐧 기억할 것 & 진행

참조 형식

변수의 값 대신 값이 있는 곳의 위치를 담는 데이터 형식이다.

  • 힙 메모리 영역에 할당된다.

힙 영역은 동적으로 할당된 데이터, 힙 메모리를 저장하는데 사용된다.
개발자가 직접 메모리를 할당하고 해제할 수 있는 영역이다.
객체, 배열 및 구조체와 같은 동적으로 이루어진 데이터를 주로 저장한다.

데이터의 수명은 개발자가 관리하며, 힙에 할당된 데이터는 프로그램이 끝날 때 까지 유지된다.
즉, 할당된 메모리를 명시적으로 해제하지 않으면 메모리 누수가 발생할 수 있다.

동적으로 크거나 긴 수명을 가진 데이터 구조를 저장하는데 사용된다.

값 형식

변수의 값을 담는 데이터 형식이다.

  • 스택 메모리 영역에 할당된다.

스택 영역은 지역 변수와 함수 호출 스택 프레임에 대한 메모리를 관리한다.
LIFO(Last-In-First-Out) 방식으로 데이터를 저장하며, 지역 변수가 함수 호출 위치와 동일하다.
스택은 작고 빠른 메모리 영역이다.

변수 범위가 블록 또는 함수 호출 내에서 제한되며, 해당 블록 또는 함수가 실행을 완료하면
해당 데이터가 자동으로 소멸된다.

상대적으로 데이터 크기가 작고, 수명이 짧은 경우 적합하다.

얕은 복사 (Shallow Copy)

객체를 복사할 때 참조만 복사하는 것이다.

쉽게 설명하면, 두 개의 상자(객체)를 생각해보자.
첫 번째 상자 -> 책
두 번째 상자 -> ?

첫 번째 상자를 가리키는 화살표를 그리면, 두 번째 상자는 첫 번째 상자와 똑같은 책을 가리키는 화살표다.

두 상자는 같은 책을 공유하게 된다. 만약 한 상자에서 책을 바꾸면, 다른 상자에서도 책이 바뀐다.

깊은 복사 (Deep Copy)

객체를 복사할 때 별도의 힙 메모리 영역에 할당하는 것이다.

두 개의 상자(객체)를 생각해보자.
첫 번째 상자 -> 책
두 번째 상자 -> ?

두 번째 상자에 새로운 책을 넣는다. 두 상자는 서로 다른 책을 가지고 있다.

만약 한 상자에서 책을 바꿔도, 다른 상자의 책은 변하지 않는다.

정리

얕은 복사는 두 상자가 같은 것을 가리키고 있어서 한 상자를 바꾸면, 다른 상자도 바뀌고

깊은 복사는 두 상자가 다른 것을 가지고 있어 한 상자를 바꿔도, 다른 상자가 바뀌지 않는다.

인터페이스 & 추상 클래스

튜터님의 팀 과제 회고 중, 캠프의 한 분께서 말씀해주셨다.

인터페이스는 행동을 요구하고 추상클래스는 개념을 요구한다는 느낌으로 전 받아들여요
인터페이스는 필드가 없고 추상클래스는 필드도 존재할 수 있기 때문이죠

  • 인터페이스는 주로 클래스가 어떤 특정 행동(메서드)를 반드시 따르도록 강제하는데 사용된다.
    인터페이스는 클래스의 행동을 요구하는 역할을 한다.
    -> 어떻게 행동해야 하는가?

  • 추상 클래스는 클래스들 간에 공유하려는 공통된 개념을 나타내기 위해 사용된다.
    추상 클래스는 클래스가 가질 수 있는 모든 멤버를 가질 수 있다.
    -> 무엇인가?


🐧 게임에 구현한다면?

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 얕은 복사 예제
        List<int> originalList = new List<int> { 1, 2, 3 };
        List<int> shallowCopy = originalList;

        shallowCopy.Add(4);  // 얕은 복사된 리스트 수정

        Console.WriteLine("Original List:");
        foreach (int item in originalList)
        {
            Console.Write(item + " ");
        }

        Console.WriteLine("\nShallow Copy:");
        foreach (int item in shallowCopy)
        {
            Console.Write(item + " ");
        }

        Console.WriteLine("\n\n");

        // 깊은 복사 예제
        List<int> originalList2 = new List<int> { 1, 2, 3 };
        List<int> deepCopy = new List<int>(originalList2);

        deepCopy.Add(4);  // 깊은 복사된 리스트 수정

        Console.WriteLine("Original List 2:");
        foreach (int item in originalList2)
        {
            Console.Write(item + " ");
        }

        Console.WriteLine("\nDeep Copy:");
        foreach (int item in deepCopy)
        {
            Console.Write(item + " ");
        }
    }
}
Original List:
1 2 3 4
Shallow Copy:
1 2 3 4

Original List 2:
1 2 3
Deep Copy:
1 2 3 4

🐧 내일 할 일

  1. 벌초
  2. 코딩테스트 강의 듣기
  3. 개인 공부

Reference

0개의 댓글