같은 건 없어. 그냥 아이스크림이 먹고 싶었을 뿐이야
OOP는 프로그램을 '객체'라는 작은 단위로 나누어서 개발하는 방법이야. 각 객체들은 서로 메시지를 주고받으며 상호작용하지. 현실 세계의 사물들이 각자 역할을 가지고 상호작용하는 것처럼 프로그램을 만들어가는 방식이라고 생각하면 돼. 🌍
IceCream
🍨이라는 클래스를 만들 수 있어.class IceCream {
var flavor: String
var size: String
var price: Int
init(flavor: String, size: String, price: Int) {
self.flavor = flavor
self.size = size
self.price = price
}
func melt() {
print("\(flavor) 아이스크림이 녹고 있어요! ☀️")
}
func eat() {
print("\(flavor) 아이스크림을 먹고 있어요! 🍴")
}
}
chocoIceCream
과 strawberryIceCream
은 IceCream
클래스에서 만들어진 객체야.let chocoIceCream = IceCream(flavor: "초코", size: "중간", price: 3000)
let strawberryIceCream = IceCream(flavor: "딸기", size: "작은", price: 2500)
chocoIceCream.melt() // 초코 아이스크림이 녹고 있어요! ☀️
strawberryIceCream.eat() // 딸기 아이스크림을 먹고 있어요! 🍴
print(chocoIceCream.flavor) // 초코
print(chocoIceCream.size) // 중간
print(chocoIceCream.price) // 3000
melt()
메서드는 아이스크림이 따뜻한 날씨에 녹는 행동을 정의한 거야.chocoIceCream.melt() // 초코 아이스크림이 녹고 있어요! ☀️
chocoIceCream.eat() // 초코 아이스크림을 먹고 있어요! 🍴
flavor
속성과 melt()
메서드는 하나의 단위로 묶여 있어. 이렇게 하면 객체 내부의 데이터가 외부에서 무분별하게 접근되지 않도록 보호할 수 있어.class IceCream {
private var flavor: String // 캡슐화된 속성
private var size: String
private var price: Int
init(flavor: String, size: String, price: Int) {
self.flavor = flavor
self.size = size
self.price = price
}
func getFlavor() -> String {
return flavor
}
func setFlavor(flavor: String) {
self.flavor = flavor
}
func melt() {
print("\(flavor) 아이스크림이 녹고 있어요! ☀️")
}
}
IceCream
클래스를 상속받아 ConeIceCream
🍦과 CupIceCream
🍧 클래스를 만들 수 있어.class ConeIceCream: IceCream {
var coneType: String
init(flavor: String, size: String, price: Int, coneType: String) {
self.coneType = coneType
super.init(flavor: flavor, size: size, price: price)
}
override func eat() {
print("\(flavor) 아이스크림을 \(coneType)과 함께 먹고 있어요! 🍦")
}
}
eat()
메서드가 ConeIceCream
과 CupIceCream
에서 다르게 구현될 수 있어.class CupIceCream: IceCream {
var cupSize: String
init(flavor: String, size: String, price: Int, cupSize: String) {
self.cupSize = cupSize
super.init(flavor: flavor, size: size, price: price)
}
override func eat() {
print("\(flavor) 아이스크림을 \(cupSize) 컵에 떠먹고 있어요! 🥄")
}
}
let coneIceCream = ConeIceCream(flavor: "바닐라", size: "큰", price: 3500, coneType: "와플콘")
let cupIceCream = CupIceCream(flavor: "딸기", size: "중간", price: 3000, cupSize: "중")
coneIceCream.eat() // 바닐라 아이스크림을 와플콘과 함께 먹고 있어요! 🍦
cupIceCream.eat() // 딸기 아이스크림을 중 컵에 떠먹고 있어요! 🥄
이렇게 맛있는 객체지향 설명이 또 있을가....