Dart 학습: 객체 지향 프로그래밍 (OOP)
객체 지향 프로그래밍(OOP)은 프로그램을 객체 단위로 구성하여 재사용성과 유지보수성을 높이는 프로그래밍 패러다임입니다. 이번 글에서는 클래스와 객체, 생성자와 소멸자, 상속, 다형성, 캡슐화에 대해 알아보겠습니다.
1. 클래스와 객체: 클래스 정의, 객체 생성
클래스는 객체의 설계도입니다. Dart에서 클래스를 정의하고 객체를 생성하는 방법을 살펴보겠습니다.
클래스 정의:
String name;
int age;
void greet() {
print('Hello, my name is $name and I am $age years old.');
}
}
위의 예제에서 Person 클래스는 name과 age라는 두 개의 속성을 가지며, greet 메서드를 정의합니다.
객체 생성:
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에서는 기본 생성자와 네임드 생성자를 사용할 수 있습니다.
기본 생성자:
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 속성을 초기화합니다.
네임드 생성자:
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. 상속: 클래스 상속
상속은 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받는 기능입니다. 이를 통해 코드의 재사용성을 높일 수 있습니다.
상속 예제:
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. 다형성: 메서드 오버라이딩
다형성은 동일한 인터페이스를 통해 서로 다른 데이터 타입의 객체를 다룰 수 있는 기능입니다. 메서드 오버라이딩은 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것입니다.
메서드 오버라이딩 예제:
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은 언더스코어(_)를 사용하여 표시합니다.
캡슐화 예제:
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!
'프로그래밍 > 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 |