입력받은 요소를 리스트에 저장하는 코드를 작성하게 되었는데 모든 요소들이 마지막에 추가한 요소들로 바뀌는 문제점이 발견되었습니다.
코드
클래스
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에 입력값을 추가 해주었기 때문에 모든 요소들이 마지막으로 입력한 요소들로 바뀌었던 것이다
'c# > 깨달음' 카테고리의 다른 글
최적화 (3의 배수와 5의 배수의 합 구하기) (0) | 2024.12.02 |
---|