[Flutter] 객체지향 프로그래밍(OOP)

2025. 5. 14. 01:19Dart & Flutter

Flutter를 배우다 보면 자주 마주치는 단어가 있습니다. 바로 객체지향 프로그래밍(Object-Oriented Programming), 줄여서 OOP입니다. 많은 Flutter 초보자들이 이 개념을 처음 접할 때 헷갈려하곤 하죠. 이 글에서는 객체지향 프로그래밍이 무엇인지, Flutter에서는 어떻게 활용되는지, 그리고 실전 예제까지 살펴보도록 하겠습니다.


객체지향 프로그래밍이란?

객체지향 프로그래밍(OOP)은 현실 세계를 코드로 표현하는 방식입니다. 사물(객체)이 가진 속성(변수)과 행동(함수)을 코드로 표현하고, 이러한 객체들이 서로 상호작용하며 프로그램을 구성합니다.
 

핵심 개념 4가지
 

1. 클래스(Class)
객체를 만들기 위한 청사진(설계도)입니다.
2. 객체(Object)
클래스를 기반으로 만들어진 실체입니다. 예를 들어 class Person으로 설계하고, Person('성은')처럼 실체화하면 그것이 객체입니다.
3. 상속(Inheritance)
기존 클래스의 기능을 물려받아 확장하거나 변경할 수 있는 기능입니다.
4. 캡슐화(Encapsulation)
객체의 내부 상태를 보호하고, 외부에서는 필요한 기능만 접근할 수 있도록 하는 기법입니다.
5. 다형성(Polymorphism)
같은 함수나 클래스가 다양한 방식으로 동작할 수 있게 만드는 개념입니다.


Flutter에서의 OOP는 왜 중요할까?

Flutter는 Dart 언어로 개발되며, Dart는 완전한 객체지향 언어입니다. Flutter에서 우리가 만드는 위젯도 모두 클래스입니다!

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('객체지향 Flutter')),
      body: Center(child: Text('안녕하세요, 병자성은님!')),
    );
  }
}

 
위 코드에서 MyHomePage는 StatelessWidget을 상속(Inheritance) 받은 클래스(Class) 이고, build() 함수는 이 클래스의 행동(Method) 입니다. Flutter의 핵심 위젯 구조 자체가 OOP 개념을 바탕으로 설계되어 있죠.


객체지향 개념별 Flutter 예제

1. 클래스와 객체

class Person {
  String name;
  int age;

  Person(this.name, this.age);

  void sayHello() {
    print('안녕하세요, 저는 $name이고, $age살입니다.');
  }
}

void main() {
  Person me = Person('성은', 22);
  me.sayHello();  // 출력: 안녕하세요, 저는 성은이고, 22살입니다.
}

 
• Person은 클래스
• me는 Person 클래스에서 만든 객체


2. 상속

class Animal {
  void move() => print('움직입니다.');
}

class Dog extends Animal {
  void bark() => print('멍멍!');
}

void main() {
  Dog dog = Dog();
  dog.move(); // 상속된 기능
  dog.bark(); // 자신의 기능
}

 
• Dog는 Animal을 상속하여 move() 기능을 그대로 사용하고, bark()는 자체 정의했습니다.


3. 캡슐화

class BankAccount {
  double _balance = 0;

  void deposit(double amount) {
    if (amount > 0) _balance += amount;
  }

  double get balance => _balance;
}

void main() {
  BankAccount account = BankAccount();
  account.deposit(100);
  print(account.balance); // 100 출력
}

 
• _balance는 외부에서 직접 접근할 수 없고, get을 통해서만 읽을 수 있어 캡슐화가 잘 이루어졌습니다.


4. 다형성

abstract class Shape {
  double getArea();
}

class Circle extends Shape {
  final double radius;
  Circle(this.radius);

  @override
  double getArea() => 3.14 * radius * radius;
}

class Rectangle extends Shape {
  final double width, height;
  Rectangle(this.width, this.height);

  @override
  double getArea() => width * height;
}

void main() {
  List<Shape> shapes = [
    Circle(3),
    Rectangle(4, 5),
  ];

  for (var shape in shapes) {
    print('면적: ${shape.getArea()}');
  }
}

 
• Shape은 추상 클래스
• Circle, Rectangle은 Shape를 상속하고 각각의 방식으로 getArea()를 구현했습니다.
• 이는 다형성의 대표 예입니다.


Flutter 앱 구조와 OOP

Flutter에서는 다음과 같이 OOP가 앱 구조 전반에 녹아 있습니다:
 
클래스: StatelessWidget, StatefulWidget 등
상속: MyApp extends StatelessWidget
캡슐화: 상태(State) 및 private 변수 사용
다형성: 위젯 트리에서 다양한 위젯을 같은 타입(Widget)으로 처리


정리

객체지향 프로그래밍은 Flutter 앱을 더 깔끔하고 유지보수하기 쉬운 구조로 만들 수 있게 해 줍니다. Flutter의 대부분은 OOP 위에서 동작하므로, 이 개념을 이해하면 앱 개발이 훨씬 쉬워지고, 더 큰 규모의 프로젝트도 자신 있게 도전할 수 있습니다.