중급

제네릭

제네릭은 타입을 매개변수처럼 받아 재사용 가능한 코드를 안전하게 만듭니다.

개념 먼저 보기

제네릭의 기본 개념부터 잡기

제네릭 문서는 먼저 용어의 뜻을 잡고, 그 다음 Flutter 코드에서 어디에 쓰이는지 연결해서 읽는 것이 좋습니다.

아래 항목들은 이 문서에서 다루는 내용을 작은 단위로 나눈 것입니다. 각 항목을 읽은 뒤 예제를 보면 코드가 훨씬 덜 추상적으로 느껴집니다.

종류별로 하나씩

제네릭에서 나눠 볼 핵심 요소

왜 필요한가

List<String>처럼 컬렉션 안의 타입을 명확하게 표현합니다.

언제 쓰나: API 응답, 상태 객체, 결과 타입을 재사용 가능한 형태로 만들 수 있습니다.

Flutter에서: dynamic 사용을 줄여 컴파일 단계에서 오류를 더 빨리 발견합니다.

// 제네릭 예제입니다.
// 먼저 코드의 큰 흐름을 보고, 주석을 따라 각 줄의 역할을 확인하세요.
class ApiResult<T> {
  const ApiResult.success(this.data) : error = null;
  const ApiResult.failure(this.error) : data = null;

  final T? data;
  final Object? error;
}

실무 패턴

Result<T>는 성공 값과 실패 정보를 함께 표현할 때 유용합니다.

언제 쓰나: Repository<T>처럼 같은 작업 구조를 여러 모델에 적용할 수 있습니다.

Flutter에서: 타입 제약을 사용하면 특정 부모 타입만 허용할 수 있습니다.

// 제네릭 예제입니다.
// 먼저 코드의 큰 흐름을 보고, 주석을 따라 각 줄의 역할을 확인하세요.
class ApiResult<T> {
  const ApiResult.success(this.data) : error = null;
  const ApiResult.failure(this.error) : data = null;

  final T? data;
  final Object? error;
}

부연 설명

왜 필요한가

  • List<String>처럼 컬렉션 안의 타입을 명확하게 표현합니다.
  • API 응답, 상태 객체, 결과 타입을 재사용 가능한 형태로 만들 수 있습니다.
  • dynamic 사용을 줄여 컴파일 단계에서 오류를 더 빨리 발견합니다.

부연 설명

실무 패턴

  • Result<T>는 성공 값과 실패 정보를 함께 표현할 때 유용합니다.
  • Repository<T>처럼 같은 작업 구조를 여러 모델에 적용할 수 있습니다.
  • 타입 제약을 사용하면 특정 부모 타입만 허용할 수 있습니다.

깊게 이해하기

제네릭 문서는 Flutter 앱을 만들 때 반복해서 마주치는 개념을 독립적으로 정리한 페이지입니다. 먼저 용어의 의미를 잡고, 그 다음 실제 코드에서 어디에 배치되는지 연결해 보면 학습 속도가 빨라집니다.

이 주제는 단독으로 외우기보다 앞뒤 문서와 함께 보는 것이 좋습니다. 예를 들어 문법 주제는 위젯 코드에서 어떻게 드러나는지, 배포 주제는 실제 앱 운영 흐름에서 어떤 결정을 요구하는지 함께 확인하세요.

상세 예제

아래 예제는 이 문서의 핵심 개념을 실제 프로젝트에서 작은 단위로 적용하는 형태입니다.

class ApiResult<T> {
  const ApiResult.success(this.data) : error = null;
  const ApiResult.failure(this.error) : data = null;

  final T? data;
  final Object? error;
}

실무에서 주의할 점

  • 처음에는 가장 단순한 구현으로 시작하고, 반복되는 시점에 구조를 정리하세요.
  • 예제 코드를 그대로 외우기보다 입력, 출력, 책임을 나누어 읽어 보세요.
  • 새 문서를 추가할 때는 같은 형식으로 요약, 핵심 설명, 예제, 체크리스트를 유지하세요.

실습 체크리스트

List<T> 읽기제네릭 클래스 만들기dynamic 대체하기