List 안에 있는 내용을 피셔 에이츠를 이용해 셔플하고 싶었다.
그래서 Util 이란 Class 를 하나 생성해서 따로 관리하려고 한다.
private static void shuffle<T>(??? list)
그런데 매개변수로 List<T> 을 적게되면,
예시로 List<string> 을 적게되면 딱 List<string> 타입만 받을수 있고
string[ ] (배열) 같은건 받을수 없게 되는데,
다른 것도 받고 싶으면 어떻게 입력해야 되지?
IList<T>
IList<T> 는 C# 의 제네릭 컬렉션 인터페이스 중 하나
인덱스로 접근 가능한 리스트형 자료구조의 표준 규약 ( 약속 )을 정의한 인터페이스
즉, List<T> , T[ ], OvservableColloction<T> 같은 리스트 계열 클래스들이
이 인터페이스를 구현 ( implement )해서 동일한 방식으로 다룰수 있게 된다.
문법
using System.Collections.Generic;
// 선언
IList<T> 변수명;
IList<int> numbers = new List<int>();
<T>는 제네릭 타입 매개변수
IList<string> , IList<float> , IList<myClass> 처럼 어떤 타입이든 가능하다.
예시 코드
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
// IList 인터페이스로 List 인스턴스를 참조
IList<string> fruits = new List<string>();
// 데이터 추가
fruits.Add("Apple");
fruits.Add("Banana");
fruits.Add("Cherry");
// 인덱스로 접근
Console.WriteLine(fruits[0]); // Apple
// 요소 수정
fruits[1] = "Blueberry";
// 반복문 출력
for (int i = 0; i < fruits.Count; i++)
Console.WriteLine($"{i}: {fruits[i]}");
}
}
주의할 점
- IList 는 인터페이스라 인스턴스 생성 불가
└ 반드시 구현체 사용해야한다. ( 예: new List<int>() ) - IList 는 기능이 제한적이다
└ List 고유 기능 ( sort(), Reverse() 등 ) 은 사용 불가 - IList 는 약속이므로 구현체마다 내부 동작이 다를수 있다
- 매개변수로 받을 때 유용하지만 반환 타입으로는 신중하게 사용 ( 반환 시 구체 타입 ( List<T> )을 명시하는게 나을수 있다
헷갈리는 점
IList<string> fruits = new List<string>();
List<string> fruits = new List<string>();
▲기능적으로는 차이점이 없는걸?
겉으로 보면 똑같이 작동하지만 왜 둘다 존재할까?
두 변수 다 Add , Remove , Count , Index 접근 등 다 된다.
지금 당장 사용할 때는 차이가 없다.
이건 구체적인 타입 ( List ) 를 사용할지 , 아니면 상위 개념의 인터페이스 ( IList ) 를 사용할지의 차이이다.
타입 선언 방식의 목적이 다르다
| 선언 방식 | 의미 |
| List<string> | List만 사용한다. → List 고유 기능까지 마음껏 사용 가능 |
| IList<string> | List 처럼 동작하는 객체면 된다. 구체 타입은 몰라도 된다. → 유연한 코드 설계 가능 |
▲IList 는 범용적이고 , List 는 구체적이다.
비유
List<string> → 현대자동차 아반떼를 직접 운전하겠다.
IList<string> → 자동차라면 뭐든 상관없이 운전할 수 있다. 현대건 기아건 상관없다.
- 지금은 아반떼 ( List ) 를 사용하고 있지만
- 나중에 다른 자동차 ( string [ ] , BindingList 등 )로 바꿔도
└ 인터페이스 타입으로 선언되어있으면 코드 수정 없이 바로 교체 가능
List 선언
List<string> fruits = new List<string>();
fruits.Add("Apple");
fruits.Sort();
Sort() , Reverse() 같은 List 전용 기능 사용 가능
하지만 타입을 바꿀 수 없다
IList 선언
IList<string> fruits = new List<string>();
fruits.Add("Apple");
IList 는 인터페이스라서 Sort() 정의 없다
대신 나중에 구현제를 교체하기 쉽다
| 항목 | List<T> | IList<T> |
| 선언 목적 | 구체적인 리스트 사용 | 리스트 계열 전반 지원 |
| 기능 | List 고유 기능 ( Sort , Reverse ) 사용 가능 | 인터페이스 공통 기능만 사용 가능 |
| 유연성 | 낮음 ( 타입 고정 ) | 높음 ( 다른 구현제 교체 용이하다 ) |
| 사용 예시 | 단순 데이터 저장용 | 인터페이스 기반 설계 , DI , 테스트 코드 |
정리
List<T> 는 구체적인 구현체
IList<T> 는 리스트처럼 동작하는 타입의 약속
유연한 코드 설계를 위해 인터페이스로 선언하는 게 좋다.
참고 자료
https://learn.microsoft.com/ko-kr/dotnet/api/system.collections.ilist?view=net-9.0
'⭐C Sharp > 00. 문법' 카테고리의 다른 글
| goto 문법 (0) | 2025.10.08 |
|---|---|
| C# 콘솔 색상 제어 ( Console Color Control ) (0) | 2025.10.06 |
| 생략 ( 언더바 " _ " ) (0) | 2025.10.04 |
| Console.Title (0) | 2025.10.02 |
| 명명된 매개변수 ( Named Parameters ) (0) | 2025.09.29 |