C#에서 Stack<T>의 모든 요소를 기존 배열로 복사하려면 CopyTo() 메서드를 사용합니다. 이 메서드는 지정한 시작 인덱스부터 스택의 요소들을 1차원 배열에 순서대로 복사해 줍니다.
CopyTo() 메서드는 두 개의 매개변수를 받습니다. 첫 번째는 복사 대상이 되는 배열이고, 두 번째는 복사가 시작될 배열의 인덱스입니다.
예제 1: 인덱스 0부터 복사하기
다음 예제는 정수형 스택을 만들고 여러 값을 Push한 뒤, CopyTo() 메서드로 배열의 첫 번째 위치(인덱스 0)부터 복사하는 코드입니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(){
Stack<int> stack = new Stack<int>();
stack.Push(10);
stack.Push(20);
stack.Push(30);
stack.Push(40);
stack.Push(50);
stack.Push(60);
stack.Push(70);
stack.Push(80);
stack.Push(90);
stack.Push(100);
Console.WriteLine("스택 출력...");
foreach(int val in stack){
Console.WriteLine(val);
}
int[] intArr = new int[stack.Count];
stack.CopyTo(intArr, 0);
Console.WriteLine("배열 출력...");
foreach(int val in intArr){
Console.WriteLine(val);
}
}
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
스택 출력... 100 90 80 70 60 50 40 30 20 10 배열 출력... 100 90 80 70 60 50 40 30 20 10
코드 설명
스택은 LIFO(Last In First Out, 후입선출) 구조이기 때문에 가장 마지막에 Push한 값인 100이 먼저 출력됩니다. CopyTo() 메서드도 스택의 열거 순서 그대로 배열에 복사하므로, 배열 역시 100부터 10까지 동일한 순서로 저장된 것을 확인할 수 있습니다.
또한 new int[stack.Count]처럼 스택의 요소 개수와 같은 크기의 배열을 생성하면, 인덱스 0부터 복사했을 때 남는 공간 없이 모든 요소가 채워집니다.
예제 2: 특정 인덱스부터 복사하기
CopyTo() 메서드의 두 번째 매개변수에 원하는 시작 인덱스를 지정하면, 해당 위치부터 요소가 복사되고 나머지 공간은 기본값(정수의 경우 0)으로 유지됩니다.
using System;
using System.Collections.Generic;
public class Demo {
public static void Main(){
Stack<int> stack = new Stack<int>();
stack.Push(10);
stack.Push(20);
stack.Push(30);
stack.Push(40);
stack.Push(50);
Console.WriteLine("스택 출력...");
foreach(int val in stack){
Console.WriteLine(val);
}
int[] intArr = new int[10];
stack.CopyTo(intArr, 2);
Console.WriteLine("배열 출력...");
foreach(int val in intArr){
Console.WriteLine(val);
}
}
}출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
스택 출력... 50 40 30 20 10 배열 출력... 0 0 50 40 30 20 10 0 0 0
코드 설명
이번에는 크기가 10인 배열을 생성하고, 인덱스 2부터 스택의 요소를 복사했습니다. 따라서 배열의 앞쪽 두 칸(인덱스 0, 1)에는 기본값인 0이 그대로 남아 있고, 인덱스 2부터 6까지 스택의 요소인 50, 40, 30, 20, 10이 순서대로 저장된 것을 볼 수 있습니다.
이처럼 CopyTo() 메서드를 활용하면 스택의 데이터를 손쉽게 배열로 변환할 수 있으며, 시작 인덱스를 조절해 원하는 위치에 데이터를 배치할 수 있습니다.