Unity/수업내용(C#)
[3.16] List 컬렉션 연습 1 - 수정(주석추가)
ljw4104
2021. 3. 16. 13:14
using System;
using System.Collections.Generic;
namespace Study07
{
public class App
{
private readonly Inventory inventory;
public App()
{
//Item 리스트 선언 및 할당
List<Item> items = new List<Item>
{
//요소 추가
new Item("장검", 20, eItemType.WEAPON),
new Item("단검", 10, eItemType.WEAPON),
new Item("투구", 15, eItemType.ARMOR)
};
inventory = new Inventory(items);
while (true)
{
int menu = PrintMenu();
switch (menu)
{
case 1:
InsertItem();
break;
case 2:
SearchItem();
break;
case 3:
DeleteItem();
break;
case 4:
ChangeItem();
break;
case 5:
PrintItem();
break;
case 6:
Gambling();
break;
case 7:
return;
default:
Console.WriteLine("다시 입력해주세요.\n");
break;
}
}
}
private int PrintMenu()
{
int menu;
Console.WriteLine("1: 삽입, 2: 검색, 3: 삭제, 4: 수정, 5: 출력, 6: 도박, 7: 종료");
Console.Write("숫자를 입력해주세요 : ");
//숫자 이외에 다른 값이 들어가는가?
try
{
menu = Convert.ToInt32(Console.ReadLine());
}
catch (FormatException e)
{
Console.WriteLine("에러발생 : {0}", e.Message);
menu = 9;
}
return menu;
}
private void InsertItem()
{
Console.Write("\n아이템 이름을 입력하세요 : ");
string itemName = Console.ReadLine();
Console.Write("아이템의 가격을 입력하세요 : ");
int itemPrice = Convert.ToInt32(Console.ReadLine());
Console.Write("아이템 타입을 입력하세요(WEAPON:0, ARMOR:1, ACCESSORY:2, POTION:3) : ");
int itemType = Convert.ToInt32(Console.ReadLine());
inventory.AddItem(new Item(itemName, itemPrice, (eItemType)itemType));
Console.WriteLine();
}
private void SearchItem()
{
Console.Write("\n아이템 이름을 입력하세요. : ");
string itemName = Console.ReadLine();
if (inventory.FindItem(itemName) != null)
{
Console.WriteLine("{0}은(는) 인벤토리 안에 있습니다.", itemName);
}
else
{
Console.WriteLine("{0}은(는) 인벤토리 안에 없습니다.", itemName);
}
Console.WriteLine();
}
private void DeleteItem()
{
Console.Write("\n아이템 이름을 입력하세요. : ");
string itemName = Console.ReadLine();
if (inventory.GetItem(itemName))
{
Console.WriteLine("{0}이(가) 삭제되었습니다.", itemName);
}
else
{
Console.WriteLine("존재하지 않는 아이템입니다.");
}
Console.WriteLine();
}
private void ChangeItem()
{
Console.Write("\n변경할 아이템 이름을 입력하세요.");
string oldItemName = Console.ReadLine();
Console.Write("새로운 아이템 이름을 입력하세요 : ");
string itemName = Console.ReadLine();
Console.Write("새로운 아이템의 가격을 입력하세요 : ");
int itemPrice = Convert.ToInt32(Console.ReadLine());
Console.Write("새로운 아이템 타입을 입력하세요(WEAPON:0, ARMOR:1, ACCESSORY:2, POTION:3) : ");
int itemType = Convert.ToInt32(Console.ReadLine());
if (inventory.ChangeItemValue(oldItemName, new Item(itemName, itemPrice, (eItemType)itemType)))
{
Console.WriteLine("변경이 완료되었습니다.");
}
else
{
Console.WriteLine("변경이 실패했습니다.");
}
Console.WriteLine();
}
private void PrintItem()
{
Console.WriteLine(inventory);
}
private void Gambling()
{
Random rnd = new Random();
int prob = rnd.Next(1, 101);
Console.Write("\n담보 아이템 이름을 입력해주세요 : ");
string itemName = Console.ReadLine();
Item item = inventory.FindItem(itemName);
if (item == null)
{
Console.WriteLine("없는 아이템입니다.");
return;
}
if (prob >= 50)
{
Console.WriteLine("도박 성공, 금액 : {0} => {1}", item.price, item.price * 30);
item.price *= 30;
}
else
{
inventory.GetItem(itemName);
Console.WriteLine("도박실패, 담보는 뺏겼습니다.");
}
Console.WriteLine();
}
}
}
using System;
using System.Collections.Generic;
namespace Study07
{
public class Inventory
{
private List<Item> items;
//기본생성자
public Inventory()
{
items = new List<Item>(); //기본생성자 : 새로운 List 인스턴스를 생성
}
//매개변수가 있는 생성자
public Inventory(List<Item> items)
{
this.items = items; //원래 있던 리스트를 대입
}
//List 맨 뒤에 아이템 추가하는 함수
public void AddItem(Item item)
{
if (item != null) //Item이 null이면 아무것도 안함
{
items.Add(item); //List의 맨마지막에 삽입
}
}
//List안에 있는 아이템을 성공적으로 뺐는가 여부를 반환하는 함수
public bool GetItem(string itemName)
{
Item item = FindItem(itemName); //itemName을 멤버변수로 가진 인스턴스를 찾음
return items.Remove(item); //위에서 찾은 인스턴스를 반환. 그런 이름이 없을 때에는 null을 반환
}
//List안에 해당 이름을 가진 아이템이 있는지 확인하고 반환하는 함수
public Item FindItem(string itemName)
{
Item item = items.Find(x => x.name == itemName); //x.name(현 인스턴스의 이름)과 itemName이 같은 인스턴스를 반환
return item; //찾은 인스턴스를 반환
}
//List 안에 있는 아이템을 새로운 아이템으로 교체하고 성공여부를 반환하는 함수
public bool ChangeItemValue(string oldItem, Item newItem)
{
int index = items.FindIndex(x => x.name == oldItem); //x.name(현 인스턴스의 이름)과 itemName이 같은 인스턴스의 List 안에서의 인덱스를 반환
items[index] = newItem; //위에서 반환받은 인덱스에 새로운 인스턴스를 대입. 원래것은 사라짐
return newItem.name == items[index].name; //제대로 교체 됐는가 여부를 반환
}
//ToString() 함수의 오버라이딩, 객체의 출력방식을 미리 정해놓음.
public override string ToString()
{
string s = String.Empty;
foreach(var i in items)
{
s += i.ToString() + '\n';
}
return '\n' + s;
}
}
}
using System;
namespace Study07
{
public enum eItemType
{
WEAPON,
ARMOR,
ACCESSORY,
POTION
}
public class Item
{
public string name;
public int price;
public eItemType itemType;
public Item()
{
}
public Item(string name, int price, eItemType itemType)
{
this.name = name;
this.price = price;
this.itemType = itemType;
}
public override string ToString()
{
return this.name + " => 가격 : " + this.price + " 타입 : " + this.itemType;
}
}
}
Inventory 클래스의 ToString() 메소드를 오버라이딩해서 Inventory 객체 자체를 출력하면 안에 있는 List를 출력할 수 있게 해놓았다.
* List.FindIndex (predicate <T>) : 매개변수의 조건에 만족하는 객체의 인덱스를 반환한다. 매개변수는 람다식이 들어감.
람다식 : docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/lambda-expressions