🏆 Swift 객체지향 프로그래밍(OOP) 심화
– 클래스, 구조체의 고급 활용과 OOP 3대 원칙 완전 정복!
안녕하세요! 😊 지난 시간에 우리는 Swift에서 객체(Object)가 무엇인지,
Class 와 Struct 를 사용해 객체를 정의하고 활용하는 방법을 배웠어요.
이제 한 단계 더 성장해서, 객체지향 프로그래밍(OOP)의 진짜 개념과 실전 활용법을 배워볼 시간입니다!
🚀 객체지향 프로그래밍(OOP)란?
OOP(Object-Oriented Programming)는 “데이터(속성)와 기능(메서드)“을 하나의 객체로 묶어서
프로그램을 설계하고 개발하는 방식이에요.
OOP의 핵심 목표는:
-
✅ 코드 재사용성 (Reuse)
-
✅ 유지보수 용이 (Maintenance)
-
✅ 확장성 (Scalability)
이를 위해 OOP는 3가지 중요한 원칙을 가지고 있어요.
🎯 OOP의 3대 원칙
원칙 |
설명 |
---|---|
상속 (Inheritance) |
부모 클래스의 속성과 기능을 자식 클래스가 물려받기 |
캡슐화 (Encapsulation) |
데이터 보호, 외부에서 직접 접근하지 못하게 감추기 |
다형성 (Polymorphism) |
같은 이름의 메서드가 상황에 따라 다르게 동작 |
Swift에서는 이 세 가지를 Class 를 통해 구현할 수 있어요!
1️⃣ 상속 (Inheritance) – 코드 재사용의 시작
상속은 기존 클래스를 확장해서 새로운 클래스를 만들 수 있게 해줘요.
예제: 동물 클래스 상속하기
class Animal {
func sound() {
print("소리를 낸다")
}
}
class Dog: Animal {
func bark() {
print("멍멍!")
}
}
let puppy = Dog()
puppy.sound() // 소리를 낸다 (부모 클래스 메서드)
puppy.bark() // 멍멍!
-
Dog 클래스는 Animal 클래스를 상속받아서 사용 가능!
-
중복 코드 없이 확장성 UP
2️⃣ 캡슐화 (Encapsulation) – 데이터 보호
객체 내부의 데이터를 직접 접근하지 못하게 막고,
필요한 기능만 공개하는 것이 캡슐화에요.
예제: 은행 계좌 클래스
class BankAccount {
private var balance: Int = 0
func deposit(amount: Int) {
balance += amount
print("입금 완료. 현재 잔액: \(balance)원")
}
func getBalance() -> Int {
return balance
}
}
let account = BankAccount()
account.deposit(amount: 5000)
print(account.getBalance()) // 5000
-
balance는 private 으로 외부 접근 차단
-
메서드를 통해서만 안전하게 조작 가능
3️⃣ 다형성 (Polymorphism) – 같은 이름, 다른 동작
다형성은 같은 메서드 이름이라도,
상황(클래스나 타입)에 따라 다르게 동작하도록 만드는 기술이에요.
예제: 메서드 오버라이딩
class Animal {
func sound() {
print("동물이 소리를 낸다")
}
}
class Cat: Animal {
override func sound() {
print("야옹~")
}
}
let myCat = Cat()
myCat.sound() // 야옹~
-
부모 클래스의 메서드를 override로 재정의!
-
같은 sound() 호출이지만, 클래스에 따라 다르게 동작
🔧 클래스 vs 구조체 심화
구분 |
클래스 (Class) |
구조체 (Struct) |
---|---|---|
타입 |
참조 타입 |
값 타입 |
상속 |
✅ 가능 |
❌ 불가능 |
사용 목적 |
복잡한 데이터 모델 |
간단한 데이터 |
예시 |
사용자 계정, 게임 캐릭터 |
좌표, 크기, 설정값 |
Struct 는 OOP의 상속, 다형성 개념은 없지만,
가볍고 빠른 데이터 처리를 위해 많이 사용돼요.
🧪 심화 실습 예제
실습 1: 상속을 활용한 교통수단 클래스 만들기
-
부모 클래스: Transport (이동 메서드)
-
자식 클래스: Car, Bicycle (각자 다른 이동 방식 출력)
실습 2: 캡슐화를 적용한 비밀번호 관리 시스템
-
비밀번호는 private 속성으로 설정
-
메서드를 통해 비밀번호 변경 및 확인
실습 3: 다형성을 활용한 알림 시스템
-
부모 클래스: Notification (알림 메서드)
-
자식 클래스: EmailNotification, SMSNotification
각 클래스마다 다른 방식으로 알림 출력
✨ 실습 1: 상속을 활용한 교통수단 클래스 만들기
// 부모 클래스
class Transport {
func move() {
print("이동합니다.")
}
}
// 자식 클래스: 자동차
class Car: Transport {
override func move() {
print("🚗 자동차가 도로를 달립니다.")
}
}
// 자식 클래스: 자전거
class Bicycle: Transport {
override func move() {
print("🚲 자전거가 페달을 밟으며 이동합니다.")
}
}
// 사용 예시
let myCar = Car()
myCar.move() // 🚗 자동차가 도로를 달립니다.
let myBike = Bicycle()
myBike.move() // 🚲 자전거가 페달을 밟으며 이동합니다.
✨ 실습 2: 캡슐화를 적용한 비밀번호 관리 시스템
class PasswordManager {
// private로 직접 접근 막기
private var password: String = "1234"
// 비밀번호 변경 메서드
func changePassword(oldPassword: String, newPassword: String) -> Bool {
if oldPassword == password {
password = newPassword
print("✅ 비밀번호가 성공적으로 변경되었습니다.")
return true
} else {
print("❌ 기존 비밀번호가 일치하지 않습니다.")
return false
}
}
// 비밀번호 확인 메서드 (실제 프로젝트에서는 이렇게 하지 않습니다. 예제용)
func isPasswordCorrect(input: String) -> Bool {
return input == password
}
}
// 사용 예시
let manager = PasswordManager()
manager.changePassword(oldPassword: "1234", newPassword: "5678") // ✅ 성공
print(manager.isPasswordCorrect(input: "5678")) // true
✨ 실습 3: 다형성을 활용한 알림 시스템
// 부모 클래스
class Notification {
func send() {
print("📢 알림을 보냅니다.")
}
}
// 자식 클래스: 이메일 알림
class EmailNotification: Notification {
override func send() {
print("📧 이메일 알림을 전송합니다.")
}
}
// 자식 클래스: 문자메시지 알림
class SMSNotification: Notification {
override func send() {
print("📩 SMS 알림을 전송합니다.")
}
}
// 사용 예시
let notifications: [Notification] = [EmailNotification(), SMSNotification(), Notification()]
for notice in notifications {
notice.send()
}
/*
출력 결과:
📧 이메일 알림을 전송합니다.
📩 SMS 알림을 전송합니다.
📢 알림을 보냅니다.
*/
✨ 마무리하며
이제 여러분은 Swift에서 단순히 객체를 만드는 단계를 넘어서,
객체지향 프로그래밍(OOP)의 핵심 원칙을 이해하게 되었어요!
-
상속으로 코드 재사용을 늘리고
-
캡슐화로 안전한 코드를 작성하며
-
다형성으로 유연한 프로그램을 만들 수 있습니다.
댓글 쓰기