본문 바로가기
강의노트/[코드팩토리] [초급] Flutter 3.0 앱 개발

2강 Dart 객체지향 프로그래밍(OOP)

by 오근성 2025. 3. 19.
728x90

Dart 객체지향 프로그래밍(OOP) 완벽 가이드 🚀

객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그래밍 패러다임 중 하나로, 코드의 재사용성과 유지보수성을 높이는 데 중요한 역할을 합니다. Dart는 객체지향 프로그래밍을 지원하며, 클래스(Class)와 객체(Object)를 중심으로 설계됩니다.

이번 글에서는 Dart의 객체지향 프로그래밍(OOP) 개념을 기초부터 심화 개념까지 코드 예제와 함께 자세히 알아보겠습니다.


1. 객체지향 프로그래밍(OOP)이란? 🤔

객체지향 프로그래밍(OOP)이란 객체(Object)를 중심으로 프로그램을 설계하는 방식입니다. 객체는 데이터(속성)와 해당 데이터를 조작하는 함수(메서드)를 포함하는 클래스(Class) 를 기반으로 생성됩니다.

Dart에서 객체를 생성하려면 클래스(Class) 를 먼저 정의해야 합니다.

✅ 클래스와 객체의 기본 구조

class Idol {
  String name;
  List<String> members;

  // 생성자(Constructor)
  Idol(this.name, this.members);

  // 메서드(Method)
  void sayHello() {
    print('안녕하세요, $name 입니다!');
  }

  void introduce() {
    print('멤버: ${members.join(', ')}');
  }
}

void main() {
  Idol blackpink = Idol('블랙핑크', ['지수', '제니', '로제', '리사']);
  blackpink.sayHello();
  blackpink.introduce();
}

🔹 Idol 클래스는 name과 members 속성을 가집니다.
🔹 Idol() 생성자를 사용해 객체를 초기화합니다.
🔹 sayHello(), introduce() 메서드를 통해 아이돌 정보를 출력할 수 있습니다.


2. 클래스 내부 변수 및 메서드 구분 🔍

클래스 내부에는 변수(속성, Fields)와 메서드(Methods) 가 존재합니다.

class Person {
  String name;  // 속성
  int age;

  Person(this.name, this.age);

  void introduce() {  // 메서드
    print('안녕하세요, 저는 $name, $age살 입니다.');
  }
}

변수는 객체의 상태(state)를 저장하며, 메서드는 행동(behavior) 을 정의합니다.


3. this 키워드 - 자기 자신 참조 👀

Dart에서 this 키워드는 클래스 내부에서 자기 자신(현재 객체) 을 참조하는데 사용됩니다.

class Animal {
  String name;

  Animal(String name) {
    this.name = name;
  }
}

✅ this.name = name;을 통해 생성자의 매개변수와 클래스의 속성을 구분합니다.


4. super 키워드 - 부모 클래스 호출 🎢

자식 클래스에서 부모 클래스의 속성이나 메서드를 호출할 때 super를 사용합니다.

class Animal {
  String name;
  Animal(this.name);
}

class Dog extends Animal {
  Dog(String name) : super(name);
}

✅ super(name);을 통해 부모 클래스의 생성자를 호출할 수 있습니다.


5. final과 const 차이 ⚡

  • final: 런타임 시 값이 결정되고 변경 불가능
  • const: 컴파일 타임에 값이 결정되어 변경 불가능
final int x = 10;  // 런타임에서 값 할당
const int y = 20;  // 컴파일 타임에서 값 할당

✅ const는 상수값이 변경될 가능성이 없을 때 사용합니다.


6. Static 변수와 메서드 📌

static 키워드는 클래스 자체에 속하는 변수 및 메서드를 정의할 때 사용됩니다.

class MathUtils {
  static double pi = 3.14;

  static double circleArea(double radius) {
    return pi * radius * radius;
  }
}

void main() {
  print(MathUtils.pi);
  print(MathUtils.circleArea(5));
}

✅ static 변수와 메서드는 객체를 생성하지 않아도 호출 가능합니다.


7. Getter & Setter 활용 🏗️

Dart에서는 getter와 setter를 사용해 객체의 데이터 보호 및 가공이 가능합니다.

class User {
  String _name;  // 프라이빗 변수

  User(this._name);

  String get name => _name;  // Getter
  set name(String newName) => _name = newName;  // Setter
}

✅ _name은 프라이빗(private) 변수로 직접 접근할 수 없고, getter와 setter를 통해 조작합니다.


8. 타입 비교 (is 연산자) 🧐

is 연산자를 사용하면 객체가 특정 클래스의 인스턴스인지 확인할 수 있습니다.

class Person {}
class Student extends Person {}

void main() {
  Person person = Student();
  print(person is Student);  // true
}

✅ is 연산자를 활용하면 객체의 타입을 안전하게 확인할 수 있습니다.


✨ 결론

Dart에서 객체지향 프로그래밍(OOP)을 활용하면 코드 재사용성 증가, 유지보수 용이성 등의 장점을 얻을 수 있습니다.

클래스와 객체생성자와 네임드 생성자상속과 오버라이딩인터페이스(implements) 활용제너릭(Generic) 활용Getter & Setter, Static 변수 활용this, super, final, const 개념 이해타입 비교 (is 연산자 활용)

앞으로 Flutter 개발에서도 OOP 개념을 적극 활용해보세요! 🚀

728x90

댓글