본문 바로가기

C#

[C#] 배열 복사

▣ 배열 복사

: 일반적인 객체처럼 배열 또한 참조값이기 때문에 복사를 해도 참조값만 복사되는 문제가 있다. 배열의 메모리 차원에서의 복사를 위해 C#에서는 다음과 같이 두가지 복사 방법을 제공하고 있다.


□ 배열을 복사하는 2가지 방법

-. Array.Copy() 함수를 이용한 부분 배열 복사

-. Clone() 함수를 이용한 배열 통복사


Array.Copy() 함수는 배열의 일정 부분을 다른 배열의 특정 위치로 복사할 때 사용한다. 쉽게 부분 배열 복사라고 말할 수 있다. 물론 전체를 복사할 수도 있다. Array.Clone() 함수는 배열의 전체를 한꺼번에 복사하는 함수이다. 통째로 복사되는 의미에서 복사보다는 복제가 더 어울리는 표현이다.


□  Array.Copy() 함수를 이용한 부분 배열 복사

-. 배열의 일부분 복사(부분 배열 복사)


□ Clone() 함수를 이용하는 방법

-. Clone() 함수를 이용한 배열 통복사


Copy() 함수는 두가지 형태의 오버로딩 함수를 지원하고 있다. 메모리를 보유하고 있는 source 배열과 target 배열이 있다고 가정하면 다음과 같이 Copy() 함수를 사용해서 배열을 복사할 수 있다.


□ Array.Copy(source, target, 2)

-. source 배열을 target 배열로 source 배열의 첫 부분부터 2개만 값복사


□ Array.Copy(source, 0, target, 2, 3)

-. source 배열의 0번째부터, target 배열의 2번째의 인덱스에, 3개를 값복사


Copy() 함수를 사용할 때에는 두개의 배열이 필요하다. 하나는 원본 배열이며, 또 하나는 복사될 배열이다.


public class ArrayCopyTest

{

static void Main()

{

int[] myoriginal = new int[] { -1, -3, -5, -7, -9 };

int[] mycopy = new int[] { 2, 4, 6, 8, 10 };

Array.Copy(myoriginal, 1, mycopy, 0, 3);


for ( int i = 0; i<mycopy.Length; i++ )

{

  Console.WriteLine("mycopy[" + i + "]=" +mycopy[i] + 't');

}

}

}



다음으로 배열을 메모리 차원에서 복사하기 위한 Clone()함수에 대해 알아보자. 위에서 사용한 Copy() 함수는 메모리가 생성되어 있는 배열에 값을 복사해주었지만 Clone() 함수를 사용하면 메모리를 통째로 복사할 수 있다. Clone() 함수가 어떻게 메모리를 통복사하는지 예제를 통해서 알아보자.


public class ArrayCloneTest

{

public static void Main()

{

int[] myoriginal = new int[] { -1,-3,-5,-7,-9};

//int[] mycopy = new int[] { 2, 4, 6, 8, 10 };

int[] mycopy = (int[])myoriginal.Clone();


for(int i=0; i<mycopy.Length; i++)

Console.Write("mycopy[" + i + "]:" + mycopy[i] + '\t');

}

}


위의 int[] mycopy는 선언은 했지만 new를 이용해서 메모리를 생성하는 것이 아니라 Clone() 함수로부터 넘겨받고 있다. Clone() 함수는 myOriginal의 메모리를 통째로 복사해서 mycopy에게 넘겨주고 있다. 하지만 Object형으로 반환되기 때문에 원래의 데이터 형인 int[]로 다운캐스팅 한 후 사용해야 한다.


□ Array.Copy() 함수

-. 원본과 복사본 배열이 존재해야 한다.

-. 주로 배열의 부분복사를 위해 사용된다.


□ 배열.Clone() 함수

-. 원본 배열의 메모리를 통째로 복사해준다.

-. Object형을 반환하기 때문에 다운캐스팅해서 사용해야 한다.

'C#' 카테고리의 다른 글

[C#] DB Connection Pooling  (0) 2018.07.25
[C#] 요점정리  (0) 2018.07.16
[C#] Thread(스레드)  (0) 2018.07.16
[C#] Naming 규칙  (0) 2018.07.16
[C#] MemberwiseClone() 함수  (0) 2018.07.16