학습
Dart 객체 지향 프로그래밍 (OOP)
Dart 객체 지향 프로그래밍 (OOP) — 중급
객체 지향 프로그래밍 (OOP)
1. 도입 (왜 배워야 하는가)
객체 지향 프로그래밍(OOP)은 현대 소프트웨어 개발의 핵심 원칙 중 하나입니다. OOP는 코드의 재사용성과 유지보수성을 극대화하여, 복잡한 시스템을 효율적으로 관리할 수 있게 해줍니다. 실무에서 OOP를 사용하지 않으면 코드가 비효율적으로 길어지고, 변경 사항이 발생할 때마다 많은 부분을 수정해야 하는 문제가 생깁니다. 이러한 문제는 결국 개발 생산성을 저하시킬 뿐 아니라, 코드의 가독성도 떨어뜨리게 됩니다.
예를 들어, 대규모 애플리케이션에서 관리해야 할 기능이 많아질수록 OOP의 장점이 더욱 두드러집니다. 코드가 체계적으로 구조화되어 있어야만 팀원 간의 협업이 원활해지고, 새로운 기능 추가나 버그 수정이 용이해집니다.
2. 핵심 개념 설명
OOP의 주요 개념은 다음과 같습니다:
- 클래스(Class): 객체를 생성하기 위한 템플릿입니다. 실생활의 '설계도'와 같다고 할 수 있습니다.
- 객체(Object): 클래스를 기반으로 생성된 실체입니다. 예를 들어, '자동차' 클래스에서 '내 차'라는 특정 자동차가 객체에 해당합니다.
- 상속(Inheritance): 기존 클래스를 기반으로 새로운 클래스를 만드는 방법입니다. 부모 클래스의 속성과 메소드를 자식 클래스가 물려받습니다.
- 다형성(Polymorphism): 같은 메소드명이더라도 객체에 따라 다르게 동작할 수 있는 능력입니다.
| 용어 | 정의 | 비유 |
|---|---|---|
| 클래스 | 객체를 생성하기 위한 설계도 | 건축 설계도 |
| 객체 | 클래스에 기반한 실체 | 완성된 건물 |
| 상속 | 기존 클래스의 속성을 물려받는 것 | 부모의 재산 물려받기 |
| 다형성 | 같은 이름의 메소드가 다르게 작동 | 다양한 방식의 같은 요리 |
3. 기본 코드 예제
아래는 Dart에서 클래스를 정의하고 객체를 생성하는 기본적인 예제입니다.
class Car {
String color;
String model;
Car(this.color, this.model);
void displayInfo() {
print("차량 모델: $model, 색상: $color");
}
}
void main() {
Car myCar = Car("Red", "Tesla Model S");
myCar.displayInfo();
}
실행 결과:
차량 모델: Tesla Model S, 색상: Red
Car라는 클래스 정의 시작.color)과 모델(model)을 정의.main 함수에서 myCar라는 객체 생성.displayInfo 메소드를 호출하여 차량 정보를 출력.4. 실전 활용 예제
4.1. 쇼핑몰에서 장바구니 구현
장바구니를 관리하는 클래스를 만들어 보겠습니다. 여러 개의 상품을 담을 수 있는 기능을 제공합니다.
class Product {
String name;
double price;
Product(this.name, this.price);
}
class ShoppingCart {
List<Product> items = [];
void addProduct(Product product) {
items.add(product);
}
void displayCart() {
for (var item in items) {
print("${item.name}: \$${item.price}");
}
}
}
void main() {
ShoppingCart cart = ShoppingCart();
cart.addProduct(Product("Apple", 1.5));
cart.addProduct(Product("Banana", 0.8));
cart.displayCart();
}
실행 결과:
Apple: $1.5
Banana: $0.8
4.2. 상속을 이용한 차량 관리
차량의 기본 기능을 상속받아 전기차 클래스를 구현해보겠습니다.
class ElectricCar extends Car {
int batteryLife;
ElectricCar(String color, String model, this.batteryLife) : super(color, model);
void displayBattery() {
print("배터리 수명: $batteryLife 시간");
}
}
void main() {
ElectricCar myElectricCar = ElectricCar("Blue", "Tesla Model 3", 24);
myElectricCar.displayInfo();
myElectricCar.displayBattery();
}
실행 결과:
차량 모델: Tesla Model 3, 색상: Blue
배터리 수명: 24 시간
5. 흔한 실수와 주의사항
실수 1: 객체를 생성하지 않고 메소드 호출
class Car {
void displayInfo() {
print("차량 정보");
}
}
void main() {
Car.displayInfo(); // 오류 발생
}
올바른 코드:
Car myCar = Car();
myCar.displayInfo(); // 정상 작동
실수 2: 상속할 때 부모 클래스의 생성자를 호출하지 않음
class Vehicle {}
class Car extends Vehicle {
Car() { print("Car 생성!"); }
}
올바른 코드:
class Vehicle {
Vehicle() { print("Vehicle 생성!"); }
}
class Car extends Vehicle {
Car() : super(); // 부모 생성자 호출
}