0Pricing
C# Academy · 강의

실전 목록 사용

항목을 추가하고 삭제하고 검색해 보세요.

실전 목록 사용은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

List<T>를 사용하는 이유

List<T>는 C#에서 일상적으로 사용하는 동적 배열입니다. System.Collections.Generic에 있으며 항목을 추가하면 자동으로 커집니다.

일반 배열과 달리 처음부터 고정된 크기를 설정할 필요가 없습니다. 형식이 안전하므로 List<int>에는 int 값만 저장할 수 있으며, 이 문제는 컴파일 시점에 발견됩니다.

using System.Collections.Generic;

List<int> scores = new List<int>();
scores.Add(90);
scores.Add(85);

생성 및 초기화

컬렉션 초기화 구문을 사용하면 목록을 바로 채울 수 있습니다. 간결하고 읽기 쉽습니다.

컴파일러는 내부적으로 각 항목을 Add 호출로 변환하므로, 항목을 하나씩 추가한 것과 결과가 같습니다.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var fruits = new List<string> { "apple", "pear", "plum" };
        Console.WriteLine(fruits.Count);
    }
}

인덱스로 접근하기와 Count

배열과 마찬가지로 0부터 시작하는 인덱스로 요소에 접근합니다. list[0]은 첫 번째 항목입니다.

목록에 몇 개의 항목이 있는지 확인하려면 Length가 아니라 Count를 사용합니다. 인덱스로 읽거나 쓰는 작업은 O(1) 상수 시간에 수행됩니다.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 10, 20, 30 };
        Console.WriteLine(nums[1]);
        Console.WriteLine(nums.Count);
    }
}

추가와 삽입

Add는 상각 O(1) 시간에 끝에 항목을 추가합니다. AddRange는 여러 항목을 한 번에 끝에 추가합니다.

Insert(index, item)은 지정한 위치에 항목을 배치하고 그 뒤의 모든 항목을 이동시킵니다. 이 이동 때문에 앞쪽에 Insert를 사용하면 O(n)이 되므로, 가능하면 끝에 추가하는 편이 좋습니다.

var list = new List<string> { "b", "c" };
list.Insert(0, "a");
list.AddRange(new[] { "d", "e" });
// list is now a, b, c, d, e

항목 삭제

Remove(item)은 일치하는 첫 번째 값을 삭제하고, 찾았으면 true를 반환합니다. RemoveAt(index)은 위치를 기준으로 삭제합니다.

두 작업 모두 뒤에 있는 요소를 왼쪽으로 이동시키므로 중간에서 삭제하면 O(n)이 됩니다. RemoveAll은 조건식을 받아 일치하는 모든 항목을 한 번에 삭제합니다.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 1, 2, 3, 4, 5 };
        nums.RemoveAll(n => n % 2 == 0);
        Console.WriteLine(string.Join(",", nums));
    }
}

목록 검색

Contains는 값이 존재하는지 알려 주고, IndexOf는 해당 위치를 반환하거나 -1을 반환합니다. 두 작업 모두 선형으로 검색하므로 O(n)입니다.

큰 목록에서 값을 반복해서 검색하게 된다면 이 선형 비용이 누적됩니다. HashSet이나 Dictionary가 더 적합할 수 있습니다.

var names = new List<string> { "Ann", "Bob", "Cy" };
bool hasBob = names.Contains("Bob");   // true
int pos = names.IndexOf("Cy");          // 2

순회

foreach 반복문은 모든 요소를 읽는 가장 명확한 방법입니다. 인덱스가 필요할 때는 일반적인 for 반복문을 사용할 수도 있습니다.

같은 목록을 순회하는 foreach 안에서 항목을 추가하거나 삭제하지 마십시오. InvalidOperationException이 발생합니다.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var colors = new List<string> { "red", "green", "blue" };
        foreach (var c in colors)
            Console.WriteLine(c);
    }
}

정렬

Sort()는 기본 비교기를 사용해 목록 자체의 순서를 정렬합니다. 사용자 지정 순서가 필요하면 비교 대리자를 전달합니다.

정렬에는 O(n log n)이 걸립니다. 원본을 변경하지 않고 정렬된 복사본을 얻으려면 LINQ의 OrderBy를 사용합니다. 이 메서드는 새로운 시퀀스를 반환합니다.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 4, 1, 3, 2 };
        nums.Sort();
        Console.WriteLine(string.Join(",", nums));
    }
}

용량과 항목 수 비교

Count는 현재 존재하는 항목 수이고, Capacity는 내부 배열을 다시 할당하기 전까지 담을 수 있는 항목 수입니다.

목록이 용량을 초과하면 더 큰 배열을 할당하고 항목을 복사하며, 크기는 대략 두 배가 됩니다. 최종 크기를 알고 있다면 반복되는 복사를 피하도록 생성자에 전달하십시오.

var list = new List<int>(1000); // reserve capacity
for (int i = 0; i < 1000; i++)
    list.Add(i);
// no intermediate reallocations

메서드 인수로서의 List

List<T>는 참조 형식입니다. 메서드에 전달하면 참조가 전달되므로 메서드 내부의 변경 사항이 호출자의 목록에 영향을 줍니다.

메서드가 읽기만 한다면 수정하지 않는다는 의도를 나타내도록 IEnumerable<T> 또는 IReadOnlyList<T>를 받으십시오.

using System;
using System.Collections.Generic;

class Program {
    static void AddOne(List<int> xs) => xs.Add(1);
    static void Main() {
        var nums = new List<int>();
        AddOne(nums);
        Console.WriteLine(nums.Count); // 1
    }
}

변환 및 복사

ToArray()는 고정 크기 배열을 만들고, new List<T>(other)는 다른 시퀀스의 얕은 복사본을 만듭니다.

얕은 복사는 목록 구조만 복제하고 동일한 요소 참조를 공유하므로, 포함된 객체를 변경하면 두 목록 모두에서 그 변경이 보입니다.

var original = new List<int> { 1, 2, 3 };
int[] arr = original.ToArray();
var copy = new List<int>(original);

빠른 확인

비용이 특히 두드러지는 작업을 고르십시오.

복습

List<T>는 크기가 커질 수 있는 형식 안전 배열입니다. 인덱스 접근과 Count는 O(1)이고, 끝에 Add하는 작업은 상각 O(1)입니다.

중간에 삽입하거나 삭제하거나 값으로 검색하는 작업은 이동 또는 검색 때문에 O(n)입니다. 크기를 알고 있다면 재할당을 피하도록 용량을 미리 확보하십시오.

자주 묻는 질문

“실전 목록 사용” 강의는 무료인가요?

네 — “실전 목록 사용” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“실전 목록 사용”에서 뭘 배우나요?

항목을 추가하고 삭제하고 검색해 보세요. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“실전 목록 사용” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 실전 목록 사용
  2. 사전 조회
  3. HashSet과 고유성
  4. 컬렉션 선택하기
← C# Academy(으)로 돌아가기