본문 바로가기
플러터(Flutter) 레이아웃 강좌

Row와 Column 위젯 완벽 가이드

by everythingdev 2024. 8. 15.
반응형

Row와 Column 위젯 마스터하기를 시작합니다.

  • 플러터(Flutter) 시작을 위한 다트(Dart) 강좌는 19강 단위 테스트 강좌를 끝으로 종료가 되었습니다.
  • 플러터(Flutter) 프로젝트 시작 전 디자인을 위한 레이아웃 강좌를 지속적으로 연재 중입니다.

Flutter의 Row와 Column 위젯 완벽 가이드

  • Flutter 앱 개발에서 레이아웃은 매우 중요한 요소입니다.
  • 사용자 인터페이스를 구성하는 데 있어 핵심적인 역할을 하는 두 가지 위젯이 바로 Row와 Column입니다.
  • 이번 포스팅에서는 Row와 Column 위젯의 특성과 사용법, 그리고 실제 개발 시 유용한 팁들을 살펴 보도록 하겠습니다.

Row와 Column 위젯의 기본 개념

  • Row와 Column 위젯은 Flutter에서 가장 기본적이면서도 강력한 레이아웃 위젯입니다. 이 둘의 주요 차이점은 자식 위젯들을 배치하는 방향에 있습니다.
  • Row: 자식 위젯들을 수평 방향으로 배치합니다.
  • Column: 자식 위젯들을 수직 방향으로 배치합니다.
  • 이 두 위젯은 Linear 레이아웃을 구성하는 데 사용되며, 복잡한 UI를 만드는 데 필수적인 요소입니다.

Row 위젯 깊이 파헤치기

  • Row 위젯은 자식 위젯들을 왼쪽에서 오른쪽으로 배치합니다. 기본적인 사용법은 다음과 같습니다:
Row(
  children: <Widget>[
    Text('첫 번째 항목'),
    Text('두 번째 항목'),
    Text('세 번째 항목'),
  ],
)

Row의 주요 속성

  • mainAxisAlignment: 주축(가로축)을 따라 자식 위젯들을 어떻게 배치할지 결정합니다.
    • MainAxisAlignment.start: 시작 부분에 정렬 (기본값)
    • MainAxisAlignment.center: 중앙 정렬
    • MainAxisAlignment.end: 끝 부분에 정렬
    • MainAxisAlignment.spaceBetween: 첫 번째와 마지막 자식은 양 끝에, 나머지는 균등 분배
    • MainAxisAlignment.spaceAround: 모든 자식 주변에 균등한 여백 배치
    • MainAxisAlignment.spaceEvenly: 모든 자식 사이에 균등한 간격 배치
  • crossAxisAlignment: 교차축(세로축)을 따라 자식 위젯들을 어떻게 배치할지 결정합니다.
    • CrossAxisAlignment.start: 시작 부분에 정렬
    • CrossAxisAlignment.center: 중앙 정렬 (기본값)
    • CrossAxisAlignment.end: 끝 부분에 정렬
    • CrossAxisAlignment.stretch: 교차축을 채우도록 늘림
  • mainAxisSize: Row의 주축 크기를 결정합니다.
    • MainAxisSize.max: 가능한 최대 크기 (기본값)
    • MainAxisSize.min: 자식들이 필요로 하는 최소 크기

Column 위젯 자세히 알아보기

  • Column 위젯은 자식 위젯들을 위에서 아래로 배치합니다. 기본 사용법은 다음과 같습니다:
Column(
  children: <Widget>[
    Text('첫 번째 항목'),
    Text('두 번째 항목'),
    Text('세 번째 항목'),
  ],
)

Column의 주요 속성

  • Column 위젯의 속성들은 Row와 매우 유사하지만, 주축과 교차축의 방향이 바뀝니다.
  1. mainAxisAlignment: 주축(세로축)을 따라 자식 위젯들을 배치합니다.
  2. crossAxisAlignment: 교차축(가로축)을 따라 자식 위젯들을 배치합니다.
  3. mainAxisSize: Column의 주축 크기를 결정합니다.

Row와 Column을 활용한 고급 레이아웃 기법

1. 중첩 사용

  • Row와 Column을 중첩하여 사용하면 복잡한 레이아웃을 쉽게 구현할 수 있습니다.
Row(
  children: <Widget>[
    Column(
      children: <Widget>[
        Icon(Icons.star),
        Text('Rating'),
      ],
    ),
    Column(
      children: <Widget>[
        Icon(Icons.description),
        Text('Description'),
      ],
    ),
  ],
)

2. Expanded 위젯과 함께 사용

  • Expanded 위젯을 사용하면 자식 위젯이 사용 가능한 공간을 모두 차지하도록 할 수 있습니다.
Row(
  children: <Widget>[
    Expanded(
      flex: 2,
      child: Container(color: Colors.red),
    ),
    Expanded(
      flex: 1,
      child: Container(color: Colors.blue),
    ),
  ],
)

  • 여기서 flex 속성은 각 Expanded 위젯이 차지할 공간의 비율을 정합니다.

3. Flexible 위젯 활용

  • Flexible 위젯은 Expanded와 유사하지만, 자식 위젯의 원래 크기를 유지하면서 남은 공간을 분배합니다.
Row(
  children: <Widget>[
    Flexible(
      flex: 2,
      child: Container(width: 100, color: Colors.red),
    ),
    Flexible(
      flex: 1,
      child: Container(width: 100, color: Colors.blue),
    ),
  ],
)

Row와 Column 사용 시 주의사항

  • 오버플로우 방지: 자식 위젯들의 총 크기가 Row나 Column의 크기를 초과하면 오버플로우가 발생합니다. 이를 방지하기 위해 Expanded, Flexible, 또는 Wrap 위젯을 사용할 수 있습니다.
  • 성능 최적화: 너무 많은 자식 위젯을 포함하면 성능 저하가 발생할 수 있습니다. 필요한 경우 ListViewGridView를 사용하여 최적화할 수 있습니다.
  • 반응형 디자인: 다양한 화면 크기에 대응하기 위해 LayoutBuilderMediaQuery를 활용하여 동적으로 레이아웃을 조정할 수 있습니다.

실전 예제: 프로필 카드 만들기

  • Row와 Column을 조합하여 간단한 프로필 카드를 만들어 보겠습니다.
Card(
  child: Padding(
    padding: EdgeInsets.all(16.0),
    child: Column(
      children: <Widget>[
        Row(
          children: <Widget>[
            CircleAvatar(
              backgroundImage: NetworkImage('https://example.com/avatar.jpg'),
              radius: 30,
            ),
            SizedBox(width: 16),
            Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text('홍길동', style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold)),
                Text('Flutter 개발자', style: TextStyle(color: Colors.grey)),
              ],
            ),
          ],
        ),
        SizedBox(height: 16),
        Text('Flutter를 사용하여 다양한 모바일 앱을 개발하고 있습니다. UI/UX 디자인에 관심이 많으며, 사용자 경험을 개선하는 것을 좋아합니다.'),
        SizedBox(height: 16),
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            Column(
              children: <Widget>[
                Icon(Icons.thumb_up),
                Text('1.2k'),
              ],
            ),
            Column(
              children: <Widget>[
                Icon(Icons.comment),
                Text('384'),
              ],
            ),
            Column(
              children: <Widget>[
                Icon(Icons.share),
                Text('57'),
              ],
            ),
          ],
        ),
      ],
    ),
  ),
)

  • 이 예제에서는 Row와 Column을 조합하여 프로필 이미지, 이름, 직업, 소개글, 그리고 상호작용 버튼들을 포함하는 복잡한 레이아웃을 구현했습니다.

맺음말

  • Flutter의 Row와 Column 위젯은 앱 UI 구성의 기본 요소입니다. 이들을 잘 이해하고 활용하면 복잡한 레이아웃도 쉽게 구현할 수 있습니다. 또한, Expanded, Flexible 등의 보조 위젯들과 함께 사용하면 더욱 유연하고 반응형인 UI를 만들 수 있습니다.
  • 개발자로서 Row와 Column의 특성을 충분히 이해하고, 다양한 상황에서 적절히 활용하는 능력을 기르는 것이 중요합니다. 실제 프로젝트에서 다양한 레이아웃을 구현해보며 경험을 쌓아가세요. Flutter의 공식 문서와 커뮤니티 자료들을 참고하면 더 많은 고급 기법들을 배울 수 있을 것입니다.
  • 다음 포스팅에서는 Expanded와 Flexible 위젯으로 공간 분배하기 강좌로 돌아오도록 하겠습니다.
반응형