ShovelingLife
A Game Programmer
ShovelingLife
전체 방문자
오늘
어제
  • 분류 전체보기 (1072)
    • 그래픽스 (57)
      • 공통 (19)
      • 수학 물리 (22)
      • OpenGL & Vulkan (1)
      • DirectX (14)
    • 게임엔진 (183)
      • Unreal (69)
      • Unity (103)
      • Cocos2D-X (3)
      • 개인 플젝 (8)
    • 코딩테스트 (221)
      • 공통 (7)
      • 프로그래머스 (22)
      • 백준 (162)
      • LeetCode (19)
      • HackerRank (2)
      • 코딩테스트 알고리즘 (8)
    • CS (235)
      • 공통 (21)
      • 네트워크 (44)
      • OS & 하드웨어 (55)
      • 자료구조 & 알고리즘 (98)
      • 디자인패턴 (6)
      • UML (4)
      • 데이터베이스 (7)
    • 프로그래밍 언어 (348)
      • C++ (167)
      • C# (90)
      • Java (9)
      • Python (33)
      • SQL (30)
      • JavaScript (8)
      • React (7)
    • 그 외 (9)
      • Math (5)
      • 일상 (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Source Code 좌측 상단에 복사 버튼 추가 완료
  • 언리얼 엔진 C++ 빌드시간 단축 꿀팁
  • 게임 업계 코딩테스트 관련
  • 1인칭 시점으로 써내려가는 글들

인기 글

태그

  • c#
  • C
  • 유니티
  • 파이썬
  • 프로그래머스
  • C++
  • 배열
  • 백준
  • 함수
  • 클래스
  • 문자열
  • string
  • 언리얼
  • 포인터
  • 그래픽스
  • Unity
  • SQL
  • 알고리즘
  • 티스토리챌린지
  • 오블완

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ShovelingLife

A Game Programmer

프로그래밍 언어/C#

C# 복사본 만들기

2023. 6. 13. 17:47

일반적으로 원본 개체에 영향을 주지 않고 복사본을 수정하거나 이동하기 위해 수행된다.

1. Object.MemberwiseClone() 방법

그만큼 Object.MemberwiseClone() 메서드를 사용하여 현재 개체의 얕은 복사본을 만들 수 있다. 참조 딥 카피를 구현하려면 MemberwiseClone() 방법.

using System;
 
public class X
{
    public string str;
 
    public object Clone() {
        return this.MemberwiseClone();
    }
}
 
public class Example
{
    public static void Main()
    {
        X obj = new X();
        obj.str = "Hello!";
 
        X copy = (X) obj.Clone();
        Console.WriteLine(copy.str);
    }
}
 
/*
    결과: Hello!
*/

2. 복사 생성자

복사 생성자는 동일한 클래스의 다른 인스턴스를 가져와서 개체를 복사할 때 컴파일러의 동작을 정의한다. 복사 생성자 구현은 새 개체를 만들고 변경할 수 없는 형식의 값을 복사하여 클래스의 모든 참조 개체에 대해 전체 복사를 수행해야 한다.

using System;
 
public class X
{
    public string str;
 
    public X() {}
 
    // 복사 생성자
    public X(X other) {
        this.str = other.str;
    }
 
    // 팩토리 복사
    public static X GetInstance(X x) {
        return new X(x);
    }
}
 
public class Example
{
    public static void Main()
    {
        X obj = new X();
        obj.str = "Hello!";
 
        X copy1 = new X(obj);
        Console.WriteLine(copy1.str);
 
        X copy2 = X.GetInstance(obj);
        Console.WriteLine(copy2.str);
    }
}

3. 딥클론

다음 코드 예제는 BinaryFormatter를 통해 심층 복제를 구현하는 방법을 보여준다. Serialize() 그리고 Deserialize() 행동 양식. 이것이 작동하려면 클래스를 직렬화 가능으로 표시 해야한다. [Serializable].

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
 
[Serializable]
public class X {
    public string str;
}
 
public static class Extensions
{
    public static T DeepClone<T>(this T obj)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            BinaryFormatter formatter = new BinaryFormatter();
            formatter.Serialize(stream, obj);
            stream.Position = 0;
 
            return (T) formatter.Deserialize(stream);
        }
    }
}
 
public class Example
{
    public static void Main()
    {
        X obj = new X();
        obj.str = "Hello!";
 
        X copy = obj.DeepClone();
        Console.WriteLine(copy.str);
    }
}
 
/*
    결과: Hello!
*/

출처 : https://www.techiedelight.com/ko/copy-object-csharp/

저작자표시 (새창열림)

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# 문자열 배열을 int 배열로 변환  (1) 2023.06.16
C# Equals, ==, ReferenceEquals 비교  (0) 2023.06.14
C# 문자열 자르기(Split), 추출(Substring)  (0) 2023.06.13
C# 문자열 공백 기준으로 분할  (0) 2023.06.13
C# _ Discard (변수 무시)  (0) 2023.06.07
    '프로그래밍 언어/C#' 카테고리의 다른 글
    • C# 문자열 배열을 int 배열로 변환
    • C# Equals, ==, ReferenceEquals 비교
    • C# 문자열 자르기(Split), 추출(Substring)
    • C# 문자열 공백 기준으로 분할
    ShovelingLife
    ShovelingLife
    Main skill stack => Unity C# / Unreal C++ Studying Front / BackEnd, Java Python

    티스토리툴바