▣ 배열 복사
: 일반적인 객체처럼 배열 또한 참조값이기 때문에 복사를 해도 참조값만 복사되는 문제가 있다. 배열의 메모리 차원에서의 복사를 위해 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 |