StatefulWidget과 StatelessWidget의 차이점은 무엇인가요?

질문

StatefulWidget과 StatelessWidget의 차이점은 무엇인가요?

답변

Flutter에서 StatefulWidget과 StatelessWidget은 위젯의 두 가지 기본 유형으로, 상태(state) 관리 방식에 따라 구분됩니다.

StatelessWidget

StatelessWidget은 변경 불가능한(immutable) 위젯으로, 한 번 생성되면 그 속성이나 상태가 변경되지 않습니다.

특징:

  • 불변성: 생성 후 속성이 변경되지 않음
  • 가벼움: 상태를 저장하지 않아 리소스 사용이 적음
  • 단순함: 구현이 간단하고 직관적임
  • 재사용성: 동일한 속성으로 여러 곳에서 재사용 가능

적합한 사용 사례:

  • 정적 콘텐츠 표시
  • 부모 위젯으로부터 받은 데이터만 표시
  • 사용자 상호작용이 필요 없는 UI 요소

예제 코드:

class GreetingCard extends StatelessWidget {
  final String name;

  const GreetingCard({Key? key, required this.name}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Text('안녕하세요, $name님!'),
    );
  }
}

StatefulWidget

StatefulWidget은 변경 가능한(mutable) 위젯으로, 수명 주기 동안 상태가 변경될 수 있습니다.

특징:

  • 가변성: 위젯의 수명 주기 동안 상태 변경 가능
  • State 객체: 별도의 State 클래스를 통해 상태 관리
  • 동적 UI: 사용자 상호작용이나 데이터 변경에 따라 UI 업데이트 가능
  • 생명주기 메서드: initState(), dispose() 등 다양한 생명주기 메서드 제공

적합한 사용 사례:

  • 사용자 입력을 처리하는 폼
  • 애니메이션이 필요한 UI
  • 데이터 변경에 따라 UI가 변경되어야 하는 경우
  • 타이머, 스트림 등 시간이 지남에 따라 변경되는 데이터 표시

예제 코드:

class Counter extends StatefulWidget {
  const Counter({Key? key}) : super(key: key);

  @override
  _CounterState createState() => _CounterState();
}

class _CounterState extends State<Counter> {
  int _count = 0;

  void _increment() {
    setState(() {
      _count++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text('카운트: $_count'),
        ElevatedButton(
          onPressed: _increment,
          child: Text('증가'),
        ),
      ],
    );
  }
}

주요 차이점 요약

특징 StatelessWidget StatefulWidget
상태 없음 (불변) 있음 (가변)
구조 단일 클래스 위젯 클래스 + 상태 클래스
성능 상대적으로 가벼움 상대적으로 무거움
리빌드 부모가 리빌드될 때만 setState() 호출 시 또는 부모가 리빌드될 때
생명주기 단순함 복잡함 (다양한 생명주기 메서드)
사용 사례 정적 UI 동적 UI, 사용자 상호작용

선택 기준

  • UI가 정적이고 변경되지 않으면 StatelessWidget 사용
  • UI가 동적이며 시간이 지남에 따라 변경되면 StatefulWidget 사용
  • 성능 최적화를 위해 가능한 한 StatelessWidget 사용을 권장

results matching ""

    No results matching ""