본문 바로가기
스파르타 코딩 클럽 내일배움캠프 6기/[Flutter 트랙] 앱개발 종합반

[Flutter 트랙] 앱개발 종합반 1-14 - 클래스 객체

by 앱 창업 부트캠프 2025. 3. 4.

Flutter 클래스 및 객체 개념 정리

이번 포스팅에서는 Flutter에서 클래스(Class)와 객체(Object)의 개념을 배우고, 이를 활용하여 게임 프로젝트를 리팩토링하는 방법을 설명합니다.


1. 클래스(Class)란?

클래스는 객체(Object)를 만들기 위한 설계도입니다. Flutter에서 UI 요소뿐만 아니라 게임 캐릭터, 사용자 정보, 설정 값 등을 클래스로 정의할 수 있습니다.

📌 클래스 기본 구조


class 클래스명 {
    // 멤버 변수 (속성)
    타입 변수명;

    // 생성자
    클래스명(this.변수명);

    // 메서드 (기능)
    void 함수명() {
        // 실행할 코드
    }
}

📌 클래스 예제: 인간(Human) 객체 만들기


class Human {
    final String id;
    final String name;
    int age;
    final String gender;

    // 생성자
    Human(this.id, this.name, this.age, this.gender);

    // 나이를 증가시키는 메서드
    void addAge() {
        age++;
    }
}

2. 객체(Object) 생성 및 활용

클래스는 직접 사용할 수 없고, 객체(Instance)로 만들어야 합니다.

📌 객체 생성 예제


void main() {
    // Human 객체 생성
    Human person = Human("860303-1234567", "김성덕", 39, "남성");

    // 나이 증가시키기
    person.addAge();
    print("${person.name}의 나이는 ${person.age}살입니다.");
}

이 코드를 실행하면 다음과 같은 결과가 출력됩니다.


김성덕의 나이는 40살입니다.

3. 클래스와 객체를 활용한 카드 게임 리팩토링

이제 카드 게임 프로젝트에서 클래스를 활용하여 코드를 정리(Refactoring)하는 방법을 설명합니다.

📌 1) 카드 모델(Card Model) 클래스 생성


class CardModel {
    final int index;    // 카드 위치
    final int value;    // 카드 값
    bool isFlipped;     // 카드가 뒤집혔는지 여부

    // 생성자
    CardModel({required this.index, required this.value, this.isFlipped = false});

    // 카드 상태 변경 메서드
    void setFlipped(bool flipped) {
        isFlipped = flipped;
    }
}

이제 카드 정보를 객체로 관리할 수 있습니다.

📌 2) 카드 리스트(Card List) 생성 및 셔플


List generateCards() {
    List cardValues = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6];
    cardValues.shuffle(); // 카드 섞기

    return List.generate(12, (index) => CardModel(index: index, value: cardValues[index]));
}

📌 3) 기존 코드에서 카드 정보를 CardModel로 변경


class CardBoard extends StatefulWidget {
    @override
    _CardBoardState createState() => _CardBoardState();
}

class _CardBoardState extends State {
    late List cards; // 카드 리스트

    @override
    void initState() {
        super.initState();
        cards = generateCards(); // 카드 초기화
    }

    // 카드 클릭 이벤트
    void onCardTapped(int index) {
        setState(() {
            cards[index].setFlipped(!cards[index].isFlipped);
        });
    }

    @override
    Widget build(BuildContext context) {
        return GridView.builder(
            itemCount: cards.length,
            gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
            itemBuilder: (context, index) {
                return GestureDetector(
                    onTap: () => onCardTapped(index),
                    child: Card(
                        child: Center(child: Text(cards[index].isFlipped ? "${cards[index].value}" : "?"))
                    ),
                );
            },
        );
    }
}

4. 리팩토링(Refactoring) 개념

리팩토링(Refactoring)이란 기능을 변경하지 않으면서 코드의 구조를 개선하는 것입니다.

📌 리팩토링의 목적

  • 코드를 더 읽기 쉽게 만들고 유지보수를 쉽게 함
  • 반복되는 코드를 줄여 재사용성을 높임
  • UI/로직을 분리하여 코드의 확장성을 증가

📌 리팩토링 적용 전 vs 후

기존 코드 리팩토링 코드

List cardValues = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6];
List cardFlipped = List.filled(12, false);
            

List cards = generateCards();
            

위처럼 데이터를 하나의 클래스(CardModel)로 묶어서 관리하면 코드가 간결해지고 확장성이 높아집니다.


5. 결론

  • Flutter에서 클래스(Class)를 활용하면 데이터와 기능을 객체화하여 관리 가능
  • 객체(Object)를 생성하고 메서드를 통해 데이터를 조작할 수 있음
  • 게임 프로젝트에서 클래스를 활용하면 코드가 더 깔끔하고 유지보수가 쉬움
  • 리팩토링(Refactoring)을 통해 가독성과 확장성을 개선

다음 시간에는 게임 점수 관리 및 최종 기능 개선을 진행하겠습니다. 🚀