본문 바로가기
c#/깨달음

List(참조형의 특징)

by mynote6590 2024. 12. 17.

입력받은 요소를 리스트에 저장하는 코드를 작성하게 되었는데 모든 요소들이 마지막에 추가한 요소들로 바뀌는 문제점이 발견되었습니다.  

 

코드

클래스

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