[TIL] OOP와 아이스크림의 상관관계

Eden·2024년 11월 15일
6

TIL

목록 보기
42/92

같은 건 없어. 그냥 아이스크림이 먹고 싶었을 뿐이야

객체지향 프로그래밍(OOP)이란?

OOP는 프로그램을 '객체'라는 작은 단위로 나누어서 개발하는 방법이야. 각 객체들은 서로 메시지를 주고받으며 상호작용하지. 현실 세계의 사물들이 각자 역할을 가지고 상호작용하는 것처럼 프로그램을 만들어가는 방식이라고 생각하면 돼. 🌍

아이스크림으로 보는 OOP의 핵심 개념

1. 클래스(Class) 📝

  • 정의: 클래스는 객체를 만들기 위한 청사진이야.
  • 예시: IceCream 🍨이라는 클래스를 만들 수 있어.
    • 속성(Attributes): 맛, 크기, 가격
    • 행동(Methods): 녹다, 먹다
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) 아이스크림을 먹고 있어요! 🍴")
    }
}

2. 객체(Object) 🍦

  • 정의: 클래스에서 만들어낸 실제 사례가 바로 객체야.
  • 예시: chocoIceCreamstrawberryIceCreamIceCream 클래스에서 만들어진 객체야.
let chocoIceCream = IceCream(flavor: "초코", size: "중간", price: 3000)
let strawberryIceCream = IceCream(flavor: "딸기", size: "작은", price: 2500)

chocoIceCream.melt()  // 초코 아이스크림이 녹고 있어요! ☀️
strawberryIceCream.eat()  // 딸기 아이스크림을 먹고 있어요! 🍴

3. 속성(Attributes) 🎨

  • 정의: 객체의 상태나 특성을 나타내는 것들이야.
  • 예시: 아이스크림의 속성은 맛, 색깔, 가격 같은 것들이 될 수 있어.
print(chocoIceCream.flavor)  // 초코
print(chocoIceCream.size)  // 중간
print(chocoIceCream.price)  // 3000

4. 메서드(Methods) 💪

  • 정의: 객체가 할 수 있는 행동이야.
  • 예시: melt() 메서드는 아이스크림이 따뜻한 날씨에 녹는 행동을 정의한 거야.
    • 아이스크림은 녹거나, 누군가가 먹을 수 있어.
chocoIceCream.melt()  // 초코 아이스크림이 녹고 있어요! ☀️
chocoIceCream.eat()  // 초코 아이스크림을 먹고 있어요! 🍴

5. 캡슐화(Encapsulation) 📦

  • 정의: 객체의 속성과 메서드를 하나의 단위로 묶어 관리하는 것을 말해.
  • 예시: 초코맛 아이스크림의 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) 아이스크림이 녹고 있어요! ☀️")
    }
}

6. 상속(Inheritance) 🍧

  • 정의: 기존 클래스의 특성을 물려받아 새로운 클래스를 만드는 거야.
  • 예시: 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)과 함께 먹고 있어요! 🍦")
    }
}

7. 다형성(Polymorphism) 🤹

  • 정의: 같은 이름의 메서드가 상황에 따라 다르게 동작하는 것을 말해.
  • 예시: eat() 메서드가 ConeIceCreamCupIceCream에서 다르게 구현될 수 있어.
    • 콘 아이스크림: 손으로 잡고 먹는 방식 🍦
    • 컵 아이스크림: 숟가락으로 떠먹는 방식 🥄
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()  // 딸기 아이스크림을 중 컵에 떠먹고 있어요! 🥄

정리 📋

  • 클래스(Class): 🍨 아이스크림을 만들기 위한 설계도.
  • 객체(Object): 🍦 초코맛, 딸기맛 같은 실제 아이스크림.
  • 속성(Attributes): 🍓 맛, 크기, 가격 같은 특성.
  • 메서드(Methods): ☀️ 녹거나 🍴 먹히는 행동.
  • 캡슐화(Encapsulation): 📦 속성과 행동을 하나로 묶어 관리.
  • 상속(Inheritance): 🍧🍨 기존 아이스크림 클래스에서 새로운 아이스크림을 만드는 것.
  • 다형성(Polymorphism): 🤹 같은 행동(먹기)이 다른 방식으로 구현되는 것.
profile
Frontend🌐 and iOS

4개의 댓글

comment-user-thumbnail
2024년 11월 15일

이렇게 맛있는 객체지향 설명이 또 있을가....

1개의 답글
comment-user-thumbnail
2024년 11월 16일

정리 야무지다..! 까먹을때마다 와서 읽어야지.. 저장저장

1개의 답글