본문 바로가기
프로그래밍/Dart

[Dart] 4. Dart의 "객체 지향 프로그래밍 (OOP)"

by iwbap 2024. 6. 19.
728x90

Dart 학습: 객체 지향 프로그래밍 (OOP)

객체 지향 프로그래밍(OOP)은 프로그램을 객체 단위로 구성하여 재사용성과 유지보수성을 높이는 프로그래밍 패러다임입니다. 이번 글에서는 클래스와 객체, 생성자와 소멸자, 상속, 다형성, 캡슐화에 대해 알아보겠습니다.


1. 클래스와 객체: 클래스 정의, 객체 생성

클래스는 객체의 설계도입니다. Dart에서 클래스를 정의하고 객체를 생성하는 방법을 살펴보겠습니다.

 

클래스 정의:

[dart]
 
class Person {
  String name;
  int age;

  void greet() {
    print('Hello, my name is $name and I am $age years old.');
  }
}
 

위의 예제에서 Person 클래스는 name과 age라는 두 개의 속성을 가지며, greet 메서드를 정의합니다.

 

 

객체 생성:

[dart]
 
void main() {
  Person person = Person();
  person.name = 'Alice';
  person.age = 25;
  person.greet();  // Hello, my name is Alice and I am 25 years old. 출력
}
 

위의 예제에서 Person 클래스로부터 person 객체를 생성하고, 속성을 설정한 후 greet 메서드를 호출합니다.


2. 생성자와 소멸자: 기본 생성자, 네임드 생성자

생성자는 객체가 생성될 때 호출되는 특별한 메서드입니다. Dart에서는 기본 생성자와 네임드 생성자를 사용할 수 있습니다.

 

기본 생성자:

[dart]
 
class Person {
  String name;
  int age;

  Person(this.name, this.age);

  void greet() {
    print('Hello, my name is $name and I am $age years old.');
  }
}

void main() {
  Person person = Person('Bob', 30);
  person.greet();  // Hello, my name is Bob and I am 30 years old. 출력
}
 

위의 예제에서 Person 클래스는 기본 생성자를 정의하여 name과 age 속성을 초기화합니다.

 

 

네임드 생성자:

[dart]
 
class Person {
  String name;
  int age;

  Person(this.name, this.age);

  Person.named({this.name = 'Unknown', this.age = 0});

  void greet() {
    print('Hello, my name is $name and I am $age years old.');
  }
}

void main() {
  Person person1 = Person('Charlie', 35);
  person1.greet();  // Hello, my name is Charlie and I am 35 years old. 출력

  Person person2 = Person.named(age: 40);
  person2.greet();  // Hello, my name is Unknown and I am 40 years old. 출력
}
 

위의 예제에서 Person 클래스는 네임드 생성자를 정의하여 선택적인 매개변수를 사용할 수 있습니다.


3. 상속: 클래스 상속

상속은 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받는 기능입니다. 이를 통해 코드의 재사용성을 높일 수 있습니다.

 

상속 예제:

[dart]
 
class Animal {
  void makeSound() {
    print('Animal makes a sound.');
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('Dog barks.');
  }
}

void main() {
  Dog dog = Dog();
  dog.makeSound();  // Dog barks. 출력
}
 

위의 예제에서 Dog 클래스는 Animal 클래스를 상속받고, makeSound 메서드를 오버라이딩하여 재정의합니다.


4. 다형성: 메서드 오버라이딩

다형성은 동일한 인터페이스를 통해 서로 다른 데이터 타입의 객체를 다룰 수 있는 기능입니다. 메서드 오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것입니다.

 

메서드 오버라이딩 예제:

[dart]
 
class Shape {
  void draw() {
    print('Drawing a shape.');
  }
}

class Circle extends Shape {
  @override
  void draw() {
    print('Drawing a circle.');
  }
}

class Square extends Shape {
  @override
  void draw() {
    print('Drawing a square.');
  }
}

void main() {
  Shape shape1 = Circle();
  Shape shape2 = Square();

  shape1.draw();  // Drawing a circle. 출력
  shape2.draw();  // Drawing a square. 출력
}
 

위의 예제에서 Circle과 Square 클래스는 Shape 클래스를 상속받고, draw 메서드를 오버라이딩하여 각각의 도형을 그리는 동작을 재정의합니다.


5. 캡슐화: 접근 지정자 (public, private, protected)

캡슐화는 객체의 내부 상태를 보호하고, 외부로부터의 직접 접근을 제한하는 원칙입니다. Dart에서는 접근 지정자를 사용하여 캡슐화를 구현할 수 있습니다. Dart에서 public과 private 접근 지정자를 지원하며, private은 언더스코어(_)를 사용하여 표시합니다.

 

캡슐화 예제:

[dart]
 
class Person {
  String _name;  // private 변수
  int _age;      // private 변수

  Person(this._name, this._age);

  // public 메서드
  void greet() {
    print('Hello, my name is $_name and I am $_age years old.');
  }

  // getter와 setter
  String get name => _name;
  set name(String name) => _name = name;

  int get age => _age;
  set age(int age) => _age = age;
}

void main() {
  Person person = Person('Dave', 45);
  person.greet();  // Hello, my name is Dave and I am 45 years old. 출력

  person.name = 'Eve';
  person.age = 50;
  person.greet();  // Hello, my name is Eve and I am 50 years old. 출력
}
 

위의 예제에서 Person 클래스는 _name과 _age라는 private 변수를 가지며, public 메서드와 getter, setter를 통해 접근할 수 있습니다.


이 글에서는 Dart의 객체 지향 프로그래밍(OOP)에 대해 알아보았습니다. 클래스와 객체, 생성자와 소멸자, 상속, 다형성, 캡슐화를 이해하고 활용하면 더 구조적이고 유지보수하기 쉬운 코드를 작성할 수 있습니다. 다음 단계에서는 컬렉션에 대해 학습해보세요. Happy Coding!

728x90

'프로그래밍 > Dart' 카테고리의 다른 글

[Dart] 6. Dart의 "예외 처리"  (0) 2024.06.19
[Dart] 5. Dart의 "컬렉션"  (0) 2024.06.19
[Dart] 3. Dart의 "기본 문법"  (0) 2024.06.19
[Dart] 2. Dart의 "기본 문법"  (0) 2024.06.19
[Dart] 1. Dart의 "기초 개념"  (0) 2024.06.19