푸터 콘텐츠로 바로가기
Iron Academy Logo
C# 배우기
C# 배우기

다른 카테고리

C# 목록 이해하기

Layla Porter
14분 6초

C#의 List 클래스는 다양한 용도로 활용 가능한 컬렉션 타입입니다. 이 시스템은 내부 데이터 구조로 동적 배열을 기반으로 하여 요소를 효율적으로 조작할 수 있습니다. 리스트를 생성할 때 기본 초기 용량을 지정하여 처음부터 메모리 사용량을 최적화할 수 있습니다. 이 용량은 메모리를 재할당하지 않고 목록이 처음에 저장할 수 있는 요소의 개수입니다.

레이라 포터의 비디오 " C# 초보자를 위한 7부 - LINQ를 사용한 데이터 쿼리 "에서 그녀는 C# 리스트의 기능에 대해 자세히 살펴보고 LINQ(언어 통합 쿼리)를 활용하여 데이터를 효율적으로 쿼리하는 방법을 보여줍니다. 이 글에서는 레이라의 영상에 나온 핵심 개념과 예시를 분석하여 C# 리스트를 처음 접하는 초보자도 쉽게 이해할 수 있도록 구성했습니다.

C# 리스트 소개

Layla가 영상 시작 부분(0:03)에서 언급했듯이, C# 리스트는 개발자가 요소 모음을 저장하고 조작할 수 있도록 해주는 다재다능한 데이터 구조입니다. 배열과 달리 리스트는 크기를 동적으로 조절할 수 있으므로 요소 개수를 미리 알 수 없는 상황에 이상적입니다.

리스트를 사용하는 것은 간단합니다. Add 메서드를 사용하여 요소를 추가할 수 있습니다. 이 메서드는 지정된 객체를 리스트의 끝에 추가합니다. 리스트는 0부터 시작하는 인덱스를 사용하므로 첫 번째 요소는 인덱스 0에서 접근할 수 있습니다. 대괄호([]) 표기법을 사용하여 특정 인덱스로 요소에 접근할 수도 있습니다.

리스트를 순회하려면 foreach 루프를 사용할 수 있습니다. foreach 루프는 요소가 나타나는 순서대로 각 요소를 순회합니다. 특정 요소의 첫 번째 발생 위치를 찾아야 하는 경우, 지정된 조건을 기준으로 검색하는 술어와 함께 IndexOf와 같은 메서드를 사용할 수 있습니다.

리스트는 특정 타입(T)의 객체만 저장할 수 있다는 점에서 강력한 타입 지정을 지원합니다. 이는 타입 안정성을 보장하고 지정된 객체 타입에서 정의된 메서드와 속성을 사용할 수 있도록 합니다. 기본적으로 List는 기본 해시 함수를 사용하여 요소를 효율적으로 구성합니다.

레이라가 영상에서 보여준 것처럼 List와 List 클래스 메서드의 작동 방식을 자세히 살펴보겠습니다.

목록 만들기

C#에서 리스트를 생성할 때, 내부 데이터 구조를 최적화하기 위해 초기 용량을 지정할 수 있습니다. 리스트는 활용도가 높으며, 지정된 요소 모음으로 초기화할 수 있습니다. 리스트의 항목은 정수 인덱스를 사용하여 접근할 수 있으며, foreach 루프를 사용하여 순회할 수 있습니다. 딕셔너리와 달리 리스트는 기본 해시 함수에 의존하지 않으며, 강력한 형식의 객체를 저장하여 데이터 관리에서 타입 안정성과 일관성을 보장합니다.

(0:44)에서 Layla는 치즈 목록을 생성하여 목록을 초기화하고 채우는 방법을 보여줍니다. C#에서는 List 클래스를 사용하여 목록을 생성할 수 있으며, 여기서 T는 목록에 포함된 요소의 유형을 나타냅니다.

List<Cheese> cheeseList = new List<Cheese>
{
    new Cheese(1, "Stilton", 3.0m, 5),
    new Cheese(2, "Cheddar", 2.25m, 3),
    new Cheese(3, "Pineapple", 3.5m, 1),
    new Cheese(4, "Brie", 5.5m, 2),
    new Cheese(5, "Roquefort", 3.5m, 5),
};
List<Cheese> cheeseList = new List<Cheese>
{
    new Cheese(1, "Stilton", 3.0m, 5),
    new Cheese(2, "Cheddar", 2.25m, 3),
    new Cheese(3, "Pineapple", 3.5m, 1),
    new Cheese(4, "Brie", 5.5m, 2),
    new Cheese(5, "Roquefort", 3.5m, 5),
};

위 예제에서 Layla는 컬렉션 초기화 구문을 사용하여 목록을 정의하고 List<Cheese> 객체로 목록을 채우는 Cheese을 생성합니다. 그녀는 Cheese 클래스에 해당하는 각 치즈 객체에 대해 ID, 이름, 가격, 강도와 같은 속성을 지정하여 C#에서 리스트를 생성하고 초기화하는 방법을 보여줍니다.

치즈 목록을 순회하며 ID와 이름을 출력합니다.

Layla Porter는 foreach 루프를 사용하여 cheeseList를 반복하고 각 치즈의 ID와 이름만 출력하는 법을 보여줍니다. 다음은 코드와 설명입니다.

foreach (var cheese in cheeseList)
{
    Console.WriteLine($"ID: {cheese.ID}, Name: {cheese.Name}");
}
foreach (var cheese in cheeseList)
{
    Console.WriteLine($"ID: {cheese.ID}, Name: {cheese.Name}");
}

위 코드에서 Layla는 foreach 루프를 사용하여 cheeseList를 순회합니다. 이는 목록의 모든 요소를 출력합니다. 루프는 목록의 각 Cheese 객체를 반복합니다. 각 반복에서 변수 cheese는 지정된 인덱스의 현재 Cheese 객체를 보유합니다. 그녀는 Console.WriteLine를 사용하여 각 치즈 요소의 ID와 이름 속성을 출력하며, C#에서 목록에서 특정 요소에 액세스하고 표시하는 방법을 보여줍니다.

LINQ 쿼리를 사용하여 치즈 검색하기

영상 2분 45초에서 Layla Porter는 LINQ를 사용하여 사용자 입력에 따라 특정 치즈를 검색하는 방법을 보여줍니다. 그녀는 사용자로부터 치즈 이름을 받기 위해 ReadLine 메서드를 사용합니다:

string cheeseName = Console.ReadLine();
string cheeseName = Console.ReadLine();

Layla는 리스트에서 항목을 검색하는 동안 2분 51초에 매우 중요한 핵심 사항을 강조합니다. 그녀는 LINQ를 사용하지 않았다면 사용자 입력과 일치하는 이름을 찾기 위해 컬렉션에 있는 각 치즈를 수동으로 순회해야 했을 것이라고 말합니다. 하지만 LINQ의 도우미 라이브러리가 이 과정을 내부적으로 처리해 주기 때문에 매우 효율적입니다. 다음 코드 조각은 Layla(3:40)가 for 루프를 사용하지 않고 LINQ 쿼리 구문만 사용하여 목록 요소를 순회하는 방법을 보여줍니다.

if (cheeseList.Any(cheese => cheese.Name == cheeseName))
{
    Cheese cheese = cheeseList.FirstOrDefault(c => c.Name == cheeseName);

    Console.WriteLine($"{cheese.Name} cheese costs £{cheese.Price.ToString()} and has a strength of {cheese.Strength}.");
}
else
{
    Console.WriteLine("I'm sorry, we don't have that cheese.");
}
if (cheeseList.Any(cheese => cheese.Name == cheeseName))
{
    Cheese cheese = cheeseList.FirstOrDefault(c => c.Name == cheeseName);

    Console.WriteLine($"{cheese.Name} cheese costs £{cheese.Price.ToString()} and has a strength of {cheese.Strength}.");
}
else
{
    Console.WriteLine("I'm sorry, we don't have that cheese.");
}

위 코드에서:

  • 레일라는 목록을 수동으로 순회하는 대신 LINQ를 사용하여 더 효율적인 검색을 할 수 있다고 설명합니다. Any 메서드는 목록의 어떤 치즈가 사용자 입력된 이름과 일치하는지 확인합니다.

  • 일치 항목이 발견되면 요소가 존재한다는 의미이며, FirstOrDefault 메서드는 입력 이름과 일치하는 첫 번째 치즈를 검색합니다. 이 메서드는 일치하는 항목이 없으면 null을 반환하므로 잠재적인 오류를 방지하여 안전합니다.

  • 치즈를 찾으면 이름, 가격, 그리고 풍미가 인쇄됩니다. 그렇지 않으면 치즈를 찾을 수 없다는 메시지가 표시됩니다.

이 접근 방식은 C#에서 LINQ를 사용하여 컬렉션을 검색하는 효율성과 단순성을 보여줍니다. 해당 코드 조각의 출력 결과는 7분 19초에 표시됩니다. (아래 이미지보다 더 나은 이미지가 있을까요?)

예제 출력

검색 시 대소문자 구분 처리

문자열을 사용할 때, 오전 8시에 기억할 것은 대소문자를 구분하는 것이 중요하다는 것입니다. 우리 치즈 이름 비교가 대소문자를 구분하지 않도록 하려면, .ToLower() 메서드를 사용하여 사용자의 입력과 목록의 치즈 이름을 모두 소문자로 변환해야 합니다. 이를 통해 사용자는 어떤 대소문자를 입력하더라도 저희 코드는 정확하게 일치하는 치즈를 찾아낼 수 있습니다. 문자열의 대소문자를 구분하는 것은 까다로울 수 있으므로 올바르게 처리하는 것이 중요하다는 점을 명심하십시오.

실제 사례: 강도별 치즈 검색

(8:50)에서 Layla는 사용자가 강도별로 치즈를 필터링할 수 있는 실용적인 예제를 만들어 사용자 입력과 LINQ 쿼리를 결합하는 방법을 보여줍니다.

1. 사용자 입력 프롬프트 및 읽기

Console.WriteLine("What strength cheese are you interested in - choose between 1 and 5");
string strengthString = Console.ReadLine();
Console.WriteLine("What strength cheese are you interested in - choose between 1 and 5");
string strengthString = Console.ReadLine();

Layla는 오전 9시 5분에 사용자에게 1에서 5 사이의 강도 값을 선택하도록 요청합니다. 이는 간단한 Console.WriteLine로 입력을 요청하고, 이어서 그들이 입력한 것을 얻기 위한 Console.ReadLine()이 뒤따릅니다.

2. 입력값을 정수로 변환

bool isInt = int.TryParse(strengthString, out int strength);
bool isInt = int.TryParse(strengthString, out int strength);

다음으로, 9시 16분에 그녀는 그들이 입력한 값이 실제 숫자인지 확인합니다. 그녀는 그 작업에 int.TryParse을 사용하는 것을 권장합니다. 입력값이 올바르고 정수로 성공적으로 변환되면 좋습니다! 그렇지 않더라도, 저희는 그 상황을 잘 처리할 수 있습니다.

3. 치즈의 강도에 따른 분류

List<Cheese> cheeseByStrength = cheeseList.Where(c => c.Strength == strength).ToList();
List<Cheese> cheeseByStrength = cheeseList.Where(c => c.Strength == strength).ToList();

이제 Layla의 비디오에서 오전 10시 25분에 재미있는 부분이 시작됩니다. 여기서 그녀는 LINQ를 사용하여 치즈 목록을 필터링하는 방법을 보여줍니다. 즉, cheeseList입니다. LINQ의 Where 메서드와 빠른 람다 표현식 (c => c.Strength == strength)을 사용하여 사용자가 선택한 강도와 일치하는 치즈만 추출합니다. 이로 인해 새로운 목록 cheeseByStrength가 생깁니다.

4. 필터링된 치즈 출력

foreach (var cheese in cheeseByStrength)
{
    Console.WriteLine($"Name: {cheese.Name} cheese");
}
foreach (var cheese in cheeseByStrength)
{
    Console.WriteLine($"Name: {cheese.Name} cheese");
}

마지막으로 오전 12시 3분에 모든 것을 정리하기 위해 Layla는 foreach 루프를 사용하여 cheeseByStrength을 순회합니다. 해당 목록의 각 치즈에 대해 그녀는 Console.WriteLine에 지정된 술어를 사용하여 그 이름을 출력합니다. 간단하고 효과적입니다!

12시 17분에 프로그램을 실행하면, 레이라는 사용자가 강도 값을 입력하면 해당 강도의 치즈만 표시되도록 목록이 필터링되는 방식을 보여줍니다. 아래는 샘플 출력 결과입니다. (더 나은 이미지를 만들 수 있을까요?)

예제 출력

결론

레이라의 영상은 C# 리스트의 개념과 LINQ를 사용하여 리스트를 쿼리하는 방법을 효과적으로 소개합니다. 그녀의 예시와 설명을 따라가면 초보자들은 C#에서 리스트를 다루고 데이터를 쿼리하는 데 탄탄한 기초를 다질 수 있습니다. 더 자세한 내용과 실시간 코딩 세션을 보려면 Layla의 YouTube 채널을 방문하고 라이브 스트림에 참여하세요.

목록을 효과적으로 조작하는 이해도와 능력을 높이기 위해 Count 속성, Insert 메서드, 술어 함수 등 List 클래스의 다양한 메서드와 속성을 탐색하는 것을 잊지 마십시오.

Hero Worlddot related to C# 목록 이해하기
Hero Affiliate related to C# 목록 이해하기

사랑하는 것을 공유하여 더 많은 수익을 얻으세요

당신은 .NET, C#, Java, Python, 또는 Node.js를 다루는 개발자를 위한 콘텐츠를 만드나요? 당신의 전문성을 추가 수입으로 전환하세요!

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해