c#/깨달음
List(참조형의 특징)
mynote6590
2024. 12. 17. 09:27
입력받은 요소를 리스트에 저장하는 코드를 작성하게 되었는데 모든 요소들이 마지막에 추가한 요소들로 바뀌는 문제점이 발견되었습니다.
코드
클래스
class Item
{
public string name;
}
메인
static void Main(string[] args)
{
// 리스트 생성
List<Item> items = new List<Item>();
// Item클래스 생성
Item item = new Item();
// 현재 반복 횟수를 나타내는 count
int count = 1;
while (true)
{
// items 리스트에 item 추가
Console.Write($"{count} 번째 요소를 입력해 주세요 : ");
items.Add(item);
item.name = Console.ReadLine();
if(count >= 3)
{
break;
}
count++;
}
// List요소 출력
for (int i = 0; i < items.Count; i++)
{
Console.WriteLine( i+ "번째 요소 : " + items[i].name);
}
}
해결방법
Item클래스 생성문을 While문안에 집어넣으니 해결되었다.
원인
Item 클래스는 참조형이기 때문에 힙 공간에 공간을 만들고 item변수는 주소를 들고 있는다. 내 코드는 While문 밖에서 Item 클래스 생성을 한번 해주었기 때문에 item은 항상 같은 주소를 들고있게된다. 따라서 내 코드는 계속 같은 주소를 들고 있는 item의 name에 입력값을 추가 해주었기 때문에 모든 요소들이 마지막으로 입력한 요소들로 바뀌었던 것이다