본문 바로가기

[내배캠] 본 캠프 개발 학습/자세히 살펴보는 Q&A

C# for 문으로 상점 만들기

  • 문제 

    ItemDatabase 클래스에 게임 아이템 정보가 나열된 아이템 리스트를 만들었다.
    이 ItemDatabase 클래스를 Store 클래스로 불러오는 과정에서 발견된 문제. 
  public static void ShowStoreProduct(bool showPrice)
          {
          Console.WriteLine($"- 1. {ItemDatabase.item1.name} | 공격력 + {ItemDatabase.item1.attackPower} 방어력 + {ItemDatabase.item1.defense} | {ItemDatabase.item1.description} | {ItemDatabase.item1.gold}G");
          Console.WriteLine($"- 2. {ItemDatabase.item2.name} | 공격력 + {ItemDatabase.item2.attackPower} 방어력 + {ItemDatabase.item2.defense} | {ItemDatabase.item2.description} | {ItemDatabase.item2.gold}G");
          Console.WriteLine($"- 3. {ItemDatabase.item3.name} | 공격력 + {ItemDatabase.item3.attackPower} 방어력 + {ItemDatabase.item3.defense} | {ItemDatabase.item3.description} | {ItemDatabase.item3.gold}G");
          Console.WriteLine($"- 4. {ItemDatabase.item4.name} | 공격력 + {ItemDatabase.item4.attackPower} 방어력 + {ItemDatabase.item4.defense} | {ItemDatabase.item4.description} | {ItemDatabase.item4.gold}G");
          Console.WriteLine($"- 5. {ItemDatabase.item5.name} | 공격력 + {ItemDatabase.item5.attackPower} 방어력 + {ItemDatabase.item5.defense} | {ItemDatabase.item5.description} | {ItemDatabase.item5.gold}G");
          Console.WriteLine($"- 6. {ItemDatabase.item6.name} | 공격력 + {ItemDatabase.item6.attackPower} 방어력 + {ItemDatabase.item6.defense} | {ItemDatabase.item6.description} | {ItemDatabase.item6.gold}G");

 

     코드가 너무 길고, 만약 아이템 수가 월등히 많아질 경우 쓸 수 없다고 판단 되었다. 
     간결하게 바꿀 수 없을까? 

  • for 문

     해답은 for 문. 
     명령문을 반복해서 실행(루프문)한다는 개념 때문에 헷갈렸지만, 
     for 문을 쉽게 풀이하자면 다음과 같다. 

    "데이터를 순차적으로 처리하는 자동화된 기계"

 

무슨 말일까?

for (int i = 0; i < 10; i++) 
{
  Console.WriteLine(i);
}


    for 문의 기본 형식이다. 
   

    int i = 숫자 형식의 i
    int i = 0 i 는 0부터 시작해서 
    i < 10; 10보다 작을 때까지 이 루프문(for)을 반복해서 실행한다 

    i ++ 1씩 더하면서

   
   그리고 Console.WriteLine으로 i를 출력해보면 
   0, 1, 2, 3, 4 ... 9까지 출력이 된다. 그 다음부터는 10보다 작을 수 없으니까 이 명령문은 종료된다.

 

  • 여기서 i 가 숫자가 아니라 번호표가 붙여진 박스라고 생각해보면 어떨까?

거대한 물류 창고에서 0번부터 20번까지의 박스를 꺼내오고 싶다. 
직접 박스를 하나하나 찾아서 꺼내오는 것보다, 
박스를 번호로 분류해서 순차적으로 꺼내오는 자동화 기계를 만드는 것이 편리할 것이다.

 

  • 수정된 코드 
for (int i = 0; i < ItemDatabase.Items.Count; i++)
{
    Item item = ItemDatabase.Items[i];
    Console.WriteLine($"- {i + 1}. {item.name} | 공격력 + {item.attackPower} 방어력 + {item.defense} | {item.description} | {item.gold}G");
}

 

위의 비유를 이 코드에 적용시켜보면; 

i: 는 현재 몇 번째 박스를 꺼내오고 있는지 숫자로 나타낸다.
ItemDatabase.Items[i]: 데이터베이스라는 창고에서 i번째 박스를 가져온다.
Item item: 그 박스를 받아서 'item' 이라는 이름표를 붙이고 이름표에 아이템 정보를 작성한다.

이렇게 하면 코드가 훨씬 깔끔해지고
데이터베이스의 아이템 리스트을 늘리면 자동으로 상점 아이템에도 적용되어 출력이 된다.