오늘은 Swift의 객체지향 프로그래밍(OOP) 개념과 의존성 역전 원칙(DIP) 을 적용하여 계산기 클래스를 개선하는 과정을 학습했다.
이전 단계에서는 Calculator 클래스가 특정 연산 클래스(AddOperation, SubtractOperation 등)에 직접 의존하고 있었다.
이렇게 되면 새로운 연산을 추가할 때마다 Calculator 코드를 수정해야 하는 문제가 발생한다.
class Calculator {
let addOperation = AddOperation()
func calculate(_ num1: Double, _ num2: Double) -> Double {
return addOperation.calculation(num1, num2) // 특정 클래스에 강하게 의존!
}
}
✅ 문제점 정리
Calculator가 특정 연산 클래스에 강한 결합(High Coupling) 을 가지고 있음 Calculator를 수정해야 함 (OCP 위반) ✅ 의존성을 낮추기 위해 프로토콜을 활용하여 추상화된 AbstractOperation을 만들었다.
✅ Calculator는 구체적인 연산 클래스가 아닌, 추상적인 AbstractOperation에 의존하도록 변경했다.
// ✅ 1. 추상화된 프로토콜 정의
protocol AbstractOperation {
func calculation(_ num1: Double, _ num2: Double) -> Double?
}
// ✅ 2. 연산 클래스들이 프로토콜을 채택
class AddOperation: AbstractOperation {
func calculation(_ num1: Double, _ num2: Double) -> Double? {
return num1 + num2
}
}
class SubtractOperation: AbstractOperation {
func calculation(_ num1: Double, _ num2: Double) -> Double? {
return num1 - num2
}
}
class MultiplyOperation: AbstractOperation {
func calculation(_ num1: Double, _ num2: Double) -> Double? {
return num1 * num2
}
}
class DivideOperation: AbstractOperation {
func calculation(_ num1: Double, _ num2: Double) -> Double? {
guard num2 != 0 else {
print("Error: 0으로 나눌 수 없습니다.")
return nil
}
return num1 / num2
}
}
// ✅ 3. Calculator가 "추상화(프로토콜)"에 의존하도록 변경
class Calculator {
func calculation(_ operation: AbstractOperation, _ num1: Double, _ num2: Double) -> Double? {
return operation.calculation(num1, num2)
}
// ✅ 4. 실행 예시
let calc = Calculator()
// 옵셔널 언래핑
if let addRetult = calc.calculation(AddOperation(), 10, 20) {
print(addRetult)
}
if let subRetult = calc.calculation(SubstractOperation(), 10, 20) {
print(subRetult)
}
if let mutiRetult = calc.calculation(MultiplyOperation(), 10, 20) {
print(mutiRetult)
}
if let divRetult = calc.calculation(DivideOperation(), 10, 20) {
print(divRetult)
}
| ❌ 기존 문제 (Lv3) | ✅ 개선된 코드 (Lv4) |
|---|---|
Calculator가 특정 연산 클래스에 의존 | Calculator가 추상화된 AbstractOperation에 의존 |
새로운 연산을 추가하려면 Calculator 수정 필요 | 새로운 연산 클래스를 만들어도 Calculator 수정 불필요 |
| OCP(개방-폐쇄 원칙) 위반 | OCP 준수 → 유지보수 용이 |
| 클래스 간 결합도 높음 (High Coupling) | 결합도 낮아짐 (Low Coupling) |
📂 Calculator/ # 프로젝트 루트 디렉토리
├── 📂 Lv3-OperationClass/ # Lv3 연산 기능 클래스 저장
│ ├── AddOperation.swift
│ ├── DivideOperation.swift
│ ├── MultiplyOperation.swift
│ ├── SubstractOperation.swift
├── 📂 Lv4-AbstractOperation/ # Lv4 추상화 프로토콜 저장
│ ├── AbstractOperation.swift
├── 📄 Calculator.swift # Calculator 클래스 코드 저장
├── 📄 main.swift # 메인 코드
├── 📄 README.md # 프로젝트 소개 및 실행 방법 설명

Expressions are not allowed at the top level 오류가 발생main.swift 파일 이름을 Calculator.swift 로 변경하니, 오류가 발생1️⃣ DIP(의존성 역전 원칙)는 "구체적인 클래스"가 아닌 "추상화(프로토콜)"에 의존하라는 원칙을 배웠다.
2️⃣ 클래스 간의 결합도를 낮추면 유지보수성과 확장성이 좋아진다.
3️⃣ Swift에서 프로토콜을 활용하면 OOP 원칙을 잘 적용할 수 있다.
👉 앞으로도 객체지향 원칙과 디자인 패턴을 고려하면서 코드 설계하는 습관을 길러야겠다. 🚀