[Flutter] ListView vs ListView.builder vs SingleChildScrollView: 언제 어떤 걸 쓸까?

📌 ListView
- 모든 자식 위젯을 스크롤 가능한 목록 형태로 표시하는 위젯이다.
children 속성에 위젯들을 넣으면 끝이다
🔎 특징
- 스크롤하지 않아도 보이지 않는 위젯까지 전부 메모리에 생성한다.
- 아이템이 많아지면 성능 저하 발생한다.
✅ 사용 예시
- 아이템 개수가 적고 간단한 정적 리스트를 표현할 때 사용한다.
📌 ListView.builder
ListView의 한 종류로 긴 목록을 효율적으로 만드는 방식이다.
itemBuilder 함수를 사용하여 화면에 보이는 아이템만 생성한다. (Lazy building)
- 보이지 않는 아이템은 미리 만들지 않는다.
👍 장점
- 성능 최적화에 좋다.
- 많은 개수의 아이템 또는 무한 스크롤 구현에 적합하다.
👎 단점
- 아이템 수가 적고 고정된 경우엔 코드가 불필요하게 길어질 수 있다.
✅ 사용 예시
- 데이터 개수가 많거나 무한 스크롤이 필요한 경우에 사용한다.
- 성능/ 메모리 최적화가 중요한 경우에 사용한다.
- 리스트 아이템이 아니라 자유로운 레이아웃에 스크롤이 필요할 때 사용한다.
SingleChildScrollView는 하나의 자식만 스크롤 가능하여 그 안에 Column을 넣어 여러 위젯을 세로로 나열한다.
🔎 특징
- 보이지 않는 위젯까지 모두 한 번에 빌드 및 메모리 로드한다.
- 자식 개수가 많아지면 성능 저하와 높은 메모리 사용이 발생한다.
Column 안에서는 Expanded를 사용할 수 없는 레이아웃 제약이 있다.
✅ 사용 예시
- 자식 개수가 적거나 중간 정도일 때 사용한다.
- 입력 폼, 섹션이 나뉜 페이지, 복잡한 화면 레이아웃에 스크롤이 필요할 때 사용한다.