해결된 질문
작성
·
253
4
정적 배열의 길이는 미리 초기화 해야 사용하며 길이를 변경할수 없지만 그래도 억지로 하고 싶으면 기존 배열 내용물을 복사 하고서 다시 자기가 원하는 배열의 크기로 인스턴스를 초기화하고 붙여놓는 것을 알게 되었습니다. 그래서 강의를 보다가 문득 더 알고 싶어서 개인적으로 아래와 같이 코드를 작성 했는데요.
class Board
{
int[] data = new int[5] { 0, 1, 2, 3, 4 };
int[] data2 = new int[2] { 5, 6 };
int[] data3 = new int[10] { 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
public void Initialize()
{
Console.WriteLine($"data의 길이 {data.Length}");
Console.Write("data의 내용물 : ");
foreach (int i in data)
Console.Write($"{i} ");
Console.WriteLine("\n");
data = data2;
Console.WriteLine($"data2를 복사한 data의 길이 {data.Length}");
Console.Write("data의 내용물 : ");
foreach (int i in data)
Console.Write($"{i} ");
Console.WriteLine("\n");
data = data3;
Console.WriteLine($"data3을 복사한 data의 길이 {data.Length}");
Console.Write("data의 내용물 : ");
foreach (int i in data)
Console.Write($"{i} ");
Console.WriteLine("\n");
}
}
빌드 한 결과 아래와 같이 나왔습니다.
data의 길이 5
data의 내용물 : 0 1 2 3 4
data2를 복사한 data의 길이 2
data의 내용물 : 5 6
data3을 복사한 data의 길이 10
data의 내용물 : 7 8 9 10 11 12 13 14 15 16
이를 통해 배열의 내용물은 빼고 단순히 길이 변경 가능하다는 것을 알게 되었는데 그렇다면 data의 주소는 어떻게 되는걸까요?
처음의 data의 길이가 data[0]의 주소번으로 시작해서 data[4]의 주소번으로 끝날턴데 data의 길이를 새롭게 정의하면 data의 첫주소가 바뀌어버리는 것인지, 아니면 data의 첫주소는 그대로 사용되고 그 기점으로 늘리고 줄어드는 것인지 알고 싶습니다.
답변 2
3
초기상태
data = data2 적용 후
data = data3 적용 후
길이를 빼고 내용물을 복사한 것이 아니라,
정말 가리키는 참조 대상만 교체한 것입니다.
위 그림에서 원래 data가 가리키고 있던 0x100번 메모리는
언젠가 GC에 의해 회수되어 날라가겠고,
data 바구니와 data3 바구니가 같은 데이터를 참조하고 있는 상태가 되겠네요.
정말 억지로 data의 데이터를 새로운 마음으로 다시 만들고 싶다면
data = data2가 아니라 data = new int[10] 식으로 새로 생성해줘야 합니다.
물론 이 경우에도 기존에 가리키던 메모리는 주인을 잃고 날라가겠죠.
0