Flutter의 Expanded vs Flexible 위젯 사용법 - 차이를 알아보자

Flutter의 Expanded vs Flexible 위젯 사용법 - 차이를 알아보자
Cozy CodingPosted On Jun 21, 20249 min read

플러터 레이아웃 내에서 공간을 효율적으로 관리하는 것은 시각적으로 매력적이고 반응이 뛰어난 사용자 인터페이스를 만드는 데 필수적인 요소입니다. 우리 플러터 개발자로서는 종종 사용 가능한 공간을 다양한 위젯과 구성 요소 사이에 분배하는 도전에 직면하곤 합니다. 이럴 때 공간 할당을 어떻게 제어하는지 이해하는 것이 원하는 디자인과 사용자 경험을 달성하는 데 중요합니다.

플러터 세계에서 두 가지 강력한 위젯이 우리를 돕습니다: 확장 위젯(Expanded widget)과 유연한 위젯(Flexible widget). 이러한 도구들은 사용 가능한 공간의 분배를 정밀하게 제어할 수 있는 수단을 제공하여 UI 구성 요소가 의도한 대로 표시되도록 보장합니다.

이 글에서는 확장 위젯과 유연한 위젯의 세세한 차이를 파헤치고, 각각을 언제 사용해야 하는지를 도와드릴 것입니다. 이 탐구를 마치면, 이 위젯들을 효과적으로 활용하여 동적이고 반응성 있는 플러터 레이아웃을 만드는 방법에 대해 명확하게 이해하게 될 것입니다.

확장 위젯 이해하기

Expanded 위젯은 Flutter에서 행과 열 내에서 공간을 관리하는 데 중요한 요소입니다. 주요 역할은 자식 위젯이 행 또는 열의 주축을 따라 가능한 한 많은 공간을 차지할 수 있도록 하는 것입니다. 다시 말하면, Expanded 위젯은 자식이 부모 위젯 내의 남은 공간을 채우도록 확장하는 역할을 합니다.

Columns와 Rows에서 Expanded가 작동하는 방식

Column이나 Row 내에서 사용될 때, Expanded 위젯은 레이아웃 과정 중에 작용합니다. 주축을 따라 사용 가능한 공간을 검사하고 해당 공간을 자식 위젯에게 flex 팩터를 기준으로 할당합니다. Flex 팩터는 다른 flex 팩터를 갖는 다른 자식들에 비해 자식 위젯이 차지해야 할 공간을 결정합니다.

간단히 설명하면 다음과 같습니다:

  • Column이나 Row의 주축을 따라 사용 가능한 전체 공간이 결정됩니다.
  • 각각의 Expanded 위젯을 갖는 자식은 flex 팩터에 따라 이 공간의 일부를 할당받습니다.
  • 남은 공간이 있다면, Expanded 위젯 없는 자식들 사이에 분배됩니다.

확장 위젯을 사용한 예시

이 예시에서는 세 개의 자식을 가진 열이 있습니다. 중간 자식은 확장 위젯을 사용하여 가능한 수직 공간을 모두 채우도록 보장하고, 다른 자식들은 원래 높이를 유지합니다.

확장 위젯 사용 시기

확장 위젯은 다음 시나리오에서 특히 유용합니다:

  1. 동등한 분배: 특정 자식에게 행이나 열 내에서 가능한 공간을 동등하게 분배하고 싶을 때.
  2. 반응형 레이아웃: 반응형 레이아웃을 구축할 때, 확장을 사용하면 위젯이 화면 크기에 따라 적절하게 확장 또는 축소될 수 있습니다.
  3. 유동적 UI: 콘텐츠나 가능한 공간에 따라 크기를 동적으로 조정해야 하는 특정 위젯을 사용하여 유동적인 사용자 인터페이스를 만드는 경우.

확장 위젯이 작동하는 방식과 적절한 사용 사례를 이해하면 Flutter 레이아웃을 유연하게 만들고 시각적으로 매력적으로 만들 수 있습니다.

유연한 위젯 이해

Flexible 위젯은 확장 위젯과 유사한 목적을 가진 Flutter 레이아웃에서 또 다른 가치 있는 도구입니다. 그러나 보다 유연성과 공간 분배를 제어하는 능력을 제공합니다. 주요 목적은 행과 열 내에서 사용 가능한 공간을 자식 위젯에 할당하는 방식을 제어하는 것입니다.

유연 위젯이 Flex 팩터와 함께 작동하는 방법

유연한 위젯은 각 자식에게 유연한 요인을 할당함으로써 작동합니다. 이 유연한 요인은 다른 유연한 요인을 갖는 다른 자식과 비교하여 각 자식이 차지해야 할 공간을 결정합니다. 더 높은 유연한 요인은 해당 자식이 사용 가능한 공간의 더 많은 부분을 받게 됨을 의미합니다.

다음은 유연 위젯이 유연한 요인과 함께 작동하는 방식입니다:

  • 행 또는 열의 주요 축을 따라 사용 가능한 총 공간이 계산됩니다.
  • 유연한 위젯을 갖는 각 자식에게 유연한 요인에 기반한 공간이 할당됩니다.
  • 남은 공간이 있는 경우 각 자식에 대해 해당하는 유연한 요인에 비례하여 나누어져 나머지 공간이 배분됩니다.

유연 위젯을 사용하는 예시

이 예시에서는 서로 다른 유연한 요인을 가진 세 개의 자식을 포함한 행이 있습니다. 유연한 위젯으로 래핑된 각 자식은 다른 자식보다 더 많은 공간을 차지하는 3의 유연한 요인을 가진 자식이 있으며, 따라서 공간이 비례적으로 분배됩니다.

유연한 위젯을 사용하는 시점

특정 상황에서 Expanded 위젯 대신 유연한 위젯을 선호하는 경우가 있습니다:

  1. 세밀한 제어: 서로 다른 플렉스 팩터를 가진 자식 요소들 사이에서 공간 분배에 더 정확한 제어가 필요한 경우. 유연한 위젯을 사용하면 공간 배분의 정확한 비율을 지정할 수 있습니다.
  2. 동적 레이아웃: 다양한 조건이나 사용자 상호작용에 따라 공간 분배가 조정되는 동적 레이아웃을 만들고 싶을 때.
  3. 혼합 레이아웃: 균일하게 확장되어야 하는 위젯과 비례적으로 확장되어야 하는 다른 위젯이 혼합된 경우, 유연한 위젯은 유연한 선택지입니다.

요약하면, 유연한 위젯은 각 자식 요소마다 개별적인 플렉스 팩터를 설정하여 공간 분배를 보다 세밀하게 제어할 수 있게 해줍니다. 플러터 레이아웃에 정확하고 유연한 제어가 필요한 경우 특히 유용하며, 특정 상황에서 Expanded 위젯에 대한 강력한 대안이 됩니다.

주요 차이점

남은 공간 다루기:

확장 위젯:

  • 확장 위젯은 가진 모든 자식들 사이에 남은 공간을 균등하게 분배합니다.
  • 각 자식이 남은 공간의 동일한 비율을 받도록 보장하며, 그들의 유연성 요소에 관계없이 동등한 비율을 부여합니다.

유연 위젯:

  • 유연 위젯은 자식들의 유연성 요소에 따라 남은 공간을 분배합니다.
  • 더 높은 유연성 요소를 가진 자식은 사용 가능한 공간의 더 많은 부분을 받고, 유연성 요소가 낮은 자식은 더 적은 공간을 받습니다.

사용 사례:

확장 가능한 위젯:

  • 자식들 사이에 남은 공간을 고르게 분배하고 싶을 때 사용합니다.
  • 반응형 레이아웃을 만들 때 요소를 균일하게 조정해야 하는 상황에 적합합니다.

유연한 위젯:

  • 서로 다른 유연성 요소를 갖는 자식들 사이에서 공간을 정밀하게 제어해야 할 때 사용합니다.
  • 다양한 조건에 적응하거나 균일하고 비례적인 분배를 필요로 하는 혼합 레이아웃에 이상적입니다.

성능 고려사항:

성능 면에서, 확장 가능한(Expanded)과 유연한(Flexible) 위젯은 효율적이며 앱의 성능에 큰 영향을 미치지 않습니다. 그러나 이러한 위젯을 분별적으로 사용하는 것이 중요합니다. 이러한 위젯을 과도하게 사용하면 복잡한 레이아웃이 되어 관리하고 디버깅하기 어려울 수 있습니다. 코드 작성 시 항상 간결함과 유지보수성을 지향해야 합니다.

요약하자면, Expanded와 Flexible의 주요 차이점은 남은 공간 처리 방식과 제공하는 제어 수준에 있습니다. 두 가지 중 어떤 것을 선택할지는 구체적인 레이아웃 요구 사항에 따라 달라지며, 동등 분배(Expanded) 또는 정확한 비례 제어(Flexible)가 필요한지에 따라 다릅니다. 이러한 차이를 이해하면 Flutter 레이아웃을 설계하고 성능을 최적화하는데 도움이 됩니다.

Expanded를 사용해야 하는 경우

Expanded 위젯은 Flutter 레이아웃에서 균일한 공간 분배가 필요한 다양한 시나리오에 특히 적합한 유용한 도구입니다. 다음은 Expanded 사용이 권장되는 몇 가지 구체적인 사용 사례와 실제 예시입니다:

  1. Row 내의 동일한 크기의 버튼들

예시: 화면 하단에 내비게이션 버튼 행이 있는 앱을 고려해보세요. 각 버튼에 Expanded 위젯을 사용하면 사용 가능한 수평 공간의 동일한 부분을 차지하여 시각적으로 일관된 사용자 친화적 레이아웃이 생성됩니다.

  1. 유연한 폼 필드

예시: 등록 폼에서 Expanded 위젯을 사용하여 입력 필드가 화면 크기나 방향에 관계없이 사용 가능한 너비를 균일하게 채우도록 할 수 있습니다. 이렇게 하면 깔끔하고 일관된 폼 레이아웃이 만들어집니다.

이러한 시나리오에서 Expanded 위젯을 사용하면 자식 요소 간 공간을 동일하게 분배하여 시각적으로 매력적이고 반응형인 플러터 레이아웃을 달성하는 간단하고 효과적인 방법을 제공합니다.

Flexible 사용 시기

Flexible 위젯은 서로 다른 flex 팩터를 가진 자식 요소들 사이의 공간 할당을 정밀하게 제어해야 할 때 다재다능한 선택지입니다. 다음은 Flexible 사용 시 Expanded와 비교했을 때 더 나은 선택인 경우를 구체적으로 설명한 예시입니다:

  1. 행 내 비율적 크기 조정

예시: 음악 플레이어 앱을 고려해보겠습니다. 여러 재생 제어 요소를 행에 표시합니다. 재생 버튼을 이전 및 다음 버튼보다 크게 만들고 싶을 때가 있습니다. 서로 다른 flex 팩터를 사용하여, Flexible를 사용하여 이 비균일한 공간 분배를 달성할 수 있습니다.

Image 1

  1. Dynamic Layouts

Example: Imagine a weather app where you display weather information for different cities. You want the temperature widget to expand or shrink based on the length of the city name, providing a balanced and visually pleasing layout. Flexible, with its flex factor, allows you to achieve this dynamic behavior.

Image 2

  1. 혼합 레이아웃

예시: 전자 상거래 앱의 제품 목록에서 제품 이미지의 크기를 동일하게 유지하고 제품 설명은 콘텐츠에 따라 너비가 다양하게 달라져야 할 때가 있습니다. 이미지에 대해서는 Expanded를, 설명에 대해서는 Flexible를 사용하여 이러한 혼합 레이아웃을 구현할 수 있습니다.

이미지

이러한 상황에서 Flexible 위젯은 다른 플렉스 요소를 가진 자식들 간의 공간 분배에 대한 정밀한 제어를 제공하여 뛰어납니다. 비례 크기 조정, 동적 레이아웃 또는 두 가지를 혼합할 필요가 있을 때, 요구 사항을 충족하지 못하는 경우에는 Flexible이 더 나은 선택입니다. 이를 통해 적응 가능하고 시각적으로 매력적인 Flutter 레이아웃을 만들 수 있습니다.

Best Practices

Flutter 레이아웃에서 Expanded 및 Flexible 위젯을 사용할 때 효과적이고 효율적인 사용을 보장하기 위해 가이드 라인을 따르는 것이 중요합니다. 여기 몇 가지 주요 권장 사항이 있습니다:

  1. 성능 최적화:

    • 위젯 깊이 제한: Expanded 또는 Flexible 위젯을 지나치게 사용하면 깊은 위젯 트리가 생성되어 성능에 영향을 줄 수 있습니다. 가능하다면 이러한 위젯을 적게 사용하여 위젯 트리를 얕게 유지하십시오.
    • 앱 프로파일링: Flutter의 내장 성능 프로파일링 도구를 사용하여 레이아웃 및 렌더링 병목 현상을 식별하십시오. 이를 통해 성능을 개선할 수 있는 UI를 최적화할 수 있습니다.
  1. 콘텐츠에 유의하세요:
  • 적합한 콘텐츠 확인: 확장 가능 또는 유연한 위젯 내의 콘텐츠가 다양한 공간에 적응할 수 있는지 확인하세요. 예를 들어, 유연한 위젯에 긴 텍스트가 적절하게 처리되지 않으면 오버플로우할 수 있습니다.
  • 최소 및 최대 크기 고려: 과도한 확장 또는 수축을 방지하기 위해 위젯의 최소 및 최대 크기를 설정하기 위해 Container, ConstrainedBox, 또는 IntrinsicWidth/Height 위젯을 사용하세요.
  1. MainAxisAlignment와 CrossAxisAlignment 사용하기:
  • MainAxisAlignment와 CrossAxisAlignment 활용: 행과 열의 mainAxisAlignmentcrossAxisAlignment 속성을 활용하여 위젯의 정렬을 미세 조정하세요. 이를 통해 사용 가능한 공간 내에서 위젯의 위치를 조절할 수 있습니다.
  1. 다양한 기기에서 테스트하기:
  • 다양한 화면 크기에서 테스트: 다양한 화면 크기와 방향에서 레이아웃을 테스트하여 다양한 기기에 잘 적응되는지 확인합니다.
  • 에뮬레이터 및 실제 기기 사용: 에뮬레이터와 실제 기기는 다르게 작동할 수 있습니다. 둘 다 테스트하여 레이아웃 문제를 식별하고 해결하는 데 도움이 됩니다.
  1. 접근성 고려사항:
  • 접근성 확보: 레이아웃을 디자인할 때 접근성을 염두에 두세요. 앱을 스크린 리더로 테스트하여 모든 사용자가 접근할 수 있도록 보장하고, 특히 Flex 위젯을 사용할 때의 접근성을 확인하세요.
  1. 레이아웃 설명서 작성하기:
  • 복잡한 레이아웃에 주석 추가하기: 레이아웃이 복잡해지면 특정 확장 또는 유연한 위젯의 목적과 의도를 설명하는 주석을 추가하는 것을 고려해보세요. 이는 코드를 작성 중인 여러분과 다른 개발자들에게 매우 도움이 될 수 있습니다.
  1. 경험을 통해 배우기:
  • 실습과 실험: Expanded 및 Flexible 위젯을 능숙하게 사용하는 가장 좋은 방법은 실습하고 실험해보는 것입니다. 다양한 레이아웃을 시도하고 결과로부터 배우세요.

이러한 모범 사례를 따르면 가독성이 좋고 성능이 우수한 플러터 레이아웃을 유지하면서 Expanded 및 Flexible 위젯을 효과적으로 사용할 수 있습니다. Expanded와 Flexible 중 어떤 것을 선택해야 하는지는 구체적인 레이아웃 요구 사항을 기반으로 결정되어야 하며, 이러한 위젯의 세부 사항을 이해하면 정보에 기반한 결정을 내릴 수 있을 것입니다.

결론

이미지

본 문서에서는 Flutter 레이아웃의 맥락에서 Expanded 및 Flexible라는 두 가지 중요한 위젯을 탐색했습니다. 이 위젯들 간의 주요 차이점과 공간 분배에서의 역할을 강조했으며, 이를 효과적으로 사용하기 위한 예시를 제공했습니다. 또한 한 위젯이 다른 것보다 적합한 시나리오를 논의하고 가독성이 좋고 성능이 우수한 레이아웃을 유지하기 위한 모범 사례를 강조했습니다.

​Expanded와 Flexible를 언제 사용해야 하는지 이해하는 것은 유연하고 반응형이며 시각적으로 매력적인 Flutter 레이아웃을 만드는 데 중요합니다. 여기 주요 사항을 요약해 드리겠습니다:

  • Expanded 대 Flexible: Expanded는 자식들 사이에 공간을 동등하게 분배하는 반면, Flexible은 유연한 flex 요소에 따른 정확한 비율 제어를 허용합니다.
  • 사용 사례: Expanded는 공간의 동등 분배가 필요한 시나리오에 이상적이며, Flexible은 다양한 flex 요소를 통해 공간 할당을 제어해야 하는 상황에서 뛰어납니다.
  • 최상의 실천 사항: 가독성 유지, 성능 최적화, 콘텐츠 고려, 접근성 염두에 둔다면 Expanded와 Flexible 위젯을 다룰 때 꼭 지켜야 할 최선의 실천 사항이 됩니다.

마지막으로, Flutter 프로젝트에서 Expanded와 Flexible 위젯을 함께 실험하고 실습할 것을 권장합니다. 능숙함은 실무 경험을 통해 오게 되므로, 다양한 레이아웃에서 이 위젯들의 능력을 탐험하는 데 주저하지 마십시오. 이들의 사용법을 능숙히 다루어 Flutter 애플리케이션에서 다재다능하고 동적인 사용자 인터페이스를 만들어보세요.