기초-중급

클래스

클래스는 데이터와 동작을 하나의 타입으로 묶는 Dart의 기본 단위입니다.

개념 먼저 보기

클래스는 데이터와 동작을 묶어 새로운 타입을 만듭니다

클래스는 앱에서 반복해서 등장하는 개념을 코드의 타입으로 만드는 방법입니다. 강의, 사용자, 장바구니, 화면 위젯 같은 대상을 클래스로 표현할 수 있습니다.

Flutter에서는 위젯도 클래스이고, API 모델도 클래스이며, 상태관리 객체도 대부분 클래스입니다.

종류별로 하나씩

클래스에서 읽어야 할 구성 요소

필드

객체가 가지고 있는 값입니다. Dart에서는 불변 모델을 만들기 위해 final 필드를 많이 사용합니다.

언제 쓰나: 객체가 기억해야 하는 속성을 표현할 때 사용합니다.

Flutter에서: StatelessWidget이 생성자로 받은 값을 final 필드에 저장합니다.

class Lesson {
  // 강의 제목을 저장하는 필드입니다.
  final String title;

  // 완료 여부를 저장하는 필드입니다.
  final bool done;

  const Lesson({required this.title, this.done = false});
}

메서드

클래스 안에 들어 있는 함수입니다. 객체의 값을 읽거나 객체와 관련된 행동을 표현합니다.

언제 쓰나: 데이터와 강하게 연결된 동작일 때 클래스 안에 둡니다.

Flutter에서: 모델의 copyWith, fromJson, toJson 같은 메서드가 대표적입니다.

class Lesson {
  const Lesson({required this.title, this.done = false});

  final String title;
  final bool done;

  // 기존 객체는 그대로 두고 완료 상태만 바꾼 새 객체를 만듭니다.
  Lesson complete() {
    return Lesson(title: title, done: true);
  }
}

부연 설명

필드와 생성자

  • 필드는 객체가 가지는 값입니다.
  • 생성자는 객체를 만들 때 필요한 값을 받습니다.
  • const 생성자는 불변 객체를 만들 때 Flutter 위젯과 모델에서 유용합니다.

부연 설명

메서드

  • 메서드는 클래스 안에 정의된 함수입니다.
  • 객체의 상태를 읽거나 새로운 객체를 반환하는 방식으로 사용합니다.
  • 불변 모델은 값을 직접 바꾸기보다 copyWith 같은 메서드로 새 값을 만듭니다.

깊게 이해하기

클래스는 앱에서 다루는 개념을 타입으로 고정하는 도구입니다. Map으로 흩어진 데이터보다 클래스 모델은 자동완성, 타입 검사, 리팩터링에서 훨씬 안전합니다.

Flutter 프로젝트에서는 화면 위젯, API 모델, 상태 객체, 저장소 클래스 등 대부분의 주요 구조가 클래스로 표현됩니다.

상세 예제

불변 모델과 copyWith를 함께 사용해 상태 변경을 안전하게 표현하는 예제입니다.

// 강의 하나를 표현하는 불변 모델입니다.
class Lesson {
  const Lesson({
    required this.id,
    required this.title,
    this.done = false,
  });

  // id는 서버나 로컬 DB에서 강의를 구분하는 고유값입니다.
  final String id;

  // title은 화면에 표시할 강의 제목입니다.
  final String title;

  // done은 완료 여부이며, 기본값은 false입니다.
  final bool done;

  // copyWith는 기존 객체를 직접 바꾸지 않고 새 객체를 만들어 줍니다.
  Lesson copyWith({String? title, bool? done}) {
    return Lesson(
      // id는 바꾸지 않으므로 기존 값을 그대로 사용합니다.
      id: id,
      // 새 title이 들어오면 새 값을 쓰고, 아니면 기존 값을 유지합니다.
      title: title ?? this.title,
      // 새 done이 들어오면 새 값을 쓰고, 아니면 기존 값을 유지합니다.
      done: done ?? this.done,
    );
  }
}

// 원본 객체입니다.
final lesson = Lesson(id: 'dart-1', title: '클래스');

// 완료 처리된 새 객체입니다. lesson 자체는 바뀌지 않습니다.
final completed = lesson.copyWith(done: true);

실무에서 주의할 점

  • 상태 모델은 가능하면 final 필드를 가진 불변 객체로 시작하세요.
  • copyWith는 일부 값만 바꾼 새 객체를 만들 때 유용합니다.
  • 생성자에서 required를 활용하면 잘못된 객체 생성을 줄일 수 있습니다.

실습 체크리스트

필드 정의생성자 작성메서드 추가