📚 학습 기록/Dart & Flutter 기초

# Flutter 실무 핵심 5가지 개념 총정리: Map, 문자열 정규화, 메서드 분리, 조건 메서드, 팩토리 생성자

zenjoydev 2025. 7. 16. 23:41

---

## 개요

Flutter로 앱 개발을 하다 보면 반복적으로 마주치는 공통 기능들이 있습니다.  
이번 포스팅에서는 실무에서 자주 사용되는 **5가지 필수 개념**을 **예제 코드 중심**으로 정리합니다.

**목표**:  
- 초보자 → 중급자 도약  
- 실무 로직 → 더 깔끔하고 안전하게 관리  
- 반복 로직 → 함수화로 테스트와 재사용 가능

---

## 목차

1. [Map 생성 및 관리](#map-생성-및-관리)  
2. [문자열 정규화 및 비교](#문자열-정규화-및-비교)  
3. [로직 메서드 분리](#로직-메서드-분리)  
4. [리스트/Set 조건 메서드 활용](#리스트set-조건-메서드-활용)  
5. [팩토리 생성자](#팩토리-생성자)  
6. [실무 활용 가이드](#실무-활용-가이드)  
7. [문제 예방 팁](#문제-예방-팁)  
8. [참고 자료](#참고-자료)

---

## Map 생성 및 관리

### 🧠 개념 요약  
- `Map`은 키-값 쌍으로 데이터를 저장하며, 데이터 구조화 및 빠른 조회에 강점  
- API 응답 데이터 정리 및 캐시 처리에도 적합

### 🧪 예시 코드

Map<String, int> scores = {
  'math': 90,
  'english': 85,
};

scores['science'] = 95;
print(scores['math']); // 90

if (scores.containsKey('history')) {
  print('과목 있음');
}

문자열 정규화 및 비교

🧠 개념 요약

  • 사용자 입력 비교 시 대소문자 무시특수문자 제거는 필수
  • toLowerCase() + RegExp를 조합하여 정규화 처리

🧪 예시 코드

String normalize(String input) {
  return input.toLowerCase().replaceAll(RegExp(r'\s+|[^a-z0-9]'), '');
}

bool isEqualNormalized(String a, String b) {
  return normalize(a) == normalize(b);
}

print(isEqualNormalized("Hello!", " hello")); // true

로직 메서드 분리

🧠 개념 요약

  • UI와 비즈니스 로직을 분리하여 유지보수성과 테스트 용이성 확보
  • 공통 검증 로직은 utils, services 디렉토리로 모듈화

🧪 예시 코드

bool isValidScore(int score) => score >= 0 && score <= 100;

int userScore = 85;
if (isValidScore(userScore)) {
  print("유효한 점수입니다.");
}

리스트/Set 조건 메서드 활용

🧠 개념 요약

  • 반복문 대신 조건 메서드(any, every, where, contains)를 사용하면 코드 간결화
  • 중복 제거에는 Set 활용이 필수

🧪 예시 코드

List<String> tags = ['flutter', 'dart', 'mobile'];
bool hasFlutter = tags.any((tag) => tag.contains('flutter'));

Set<int> uniqueScores = {100, 90, 80};
bool allAbove70 = uniqueScores.every((score) => score > 70);

print(hasFlutter); // true
print(allAbove70); // true

팩토리 생성자

🧠 개념 요약

  • 생성 로직을 제어할 수 있는 특별한 생성자
  • JSON 파싱, 싱글톤 인스턴스, 조건 기반 인스턴스 반환 등에 활용됨

🧪 예시 코드

class User {
  final String name;
  final int age;

  User._(this.name, this.age); // private constructor

  factory User.fromJson(Map<String, dynamic> json) {
    return User._(
      json['name'] ?? 'Unknown',
      json['age'] ?? 0,
    );
  }
}

Map<String, dynamic> jsonData = {'name': 'John', 'age': 30};
User user = User.fromJson(jsonData);

실무 활용 가이드

활용 기능추천 개념예시
사용자 검색 필터 문자열 정규화 normalize() 후 비교
API 응답 처리 팩토리 생성자 JSON → 객체 생성
입력값 검증 로직 분리 점수, 이메일 유효성 등
중복 검사 Set 조건 메서드 unique + any()
설정 저장 Map 키-값 저장 구조로 정리
 

문제 예방 팁

개념흔한 실수예방 방법
Map 없는 키 접근 → null 반환 containsKey() 사전 체크
정규화 불완전한 비교 RegExp 필수 적용
메서드 분리 UI 내부에 if-else 혼재 로직 함수화 + 별도 분리
조건 메서드 for문 남용 any, every, where 사용
팩토리 생성자 일반 생성자와 혼용 private + factory 조합 설계
 

참고 자료


📌 관련 태그: Flutter, Dart, 팩토리생성자, JSON파싱, 조건필터, 로직분리, 앱개발, 실무패턴, 정규표현식, 모바일개발


질문과 토론

이 포스트가 도움이 되셨나요?
아래 댓글로 자유롭게 의견 남겨주세요!

  • 팩토리 생성자 말고 다른 JSON 처리 방식 써보신 적 있나요?
  • 조건 메서드 중 어떤 걸 가장 자주 쓰시나요?
  • 실제 팀 프로젝트에서는 이 중 어떤 개념이 가장 자주 쓰였나요?

이 글이 유익하셨다면 구독과 공유 부탁드립니다! 🙏
지속적으로 실무 개발자를 위한 Flutter 콘텐츠를 다룰 예정입니다

 

📌 관련 태그: Flutter, Dart, 팩토리생성자, JSON파싱, 조건필터, 로직분리, 앱개발, 실무패턴, 정규표현식, 모바일개발