[Swift Apple ] Swift 객체지향 프로그래밍(OOP) 심화

🏆 Swift 객체지향 프로그래밍(OOP) 심화

– 클래스, 구조체의 고급 활용과 OOP 3대 원칙 완전 정복!


안녕하세요! 😊 지난 시간에 우리는 Swift에서 객체(Object)가 무엇인지,

ClassStruct 를 사용해 객체를 정의하고 활용하는 방법을 배웠어요.

이제 한 단계 더 성장해서, 객체지향 프로그래밍(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



Swift Class 클래스 실습
Swift Class 클래스 실습




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

  • balanceprivate 으로 외부 접근 차단

  • 메서드를 통해서만 안전하게 조작 가능



Swift Class 클래스 실습
Swift Class 클래스 실습




3️⃣ 다형성 (Polymorphism) – 같은 이름, 다른 동작


다형성은 같은 메서드 이름이라도,

상황(클래스나 타입)에 따라 다르게 동작하도록 만드는 기술이에요.


예제: 메서드 오버라이딩

class Animal {
    func sound() {
        print("동물이 소리를 낸다")
    }
}

class Cat: Animal {
    override func sound() {
        print("야옹~")
    }
}

let myCat = Cat()
myCat.sound()   // 야옹~

  • 부모 클래스의 메서드를 override로 재정의!

  • 같은 sound() 호출이지만, 클래스에 따라 다르게 동작




Swift Class 클래스 실습
Swift Class 클래스 실습





🔧 클래스 vs 구조체 심화

구분

클래스 (Class)

구조체 (Struct)

타입

참조 타입

값 타입

상속

✅ 가능

❌ 불가능

사용 목적

복잡한 데이터 모델

간단한 데이터

예시

사용자 계정, 게임 캐릭터

좌표, 크기, 설정값

Struct 는 OOP의 상속, 다형성 개념은 없지만,
가볍고 빠른 데이터 처리를 위해 많이 사용돼요.



 

🧪 심화 실습 예제


실습 1: 상속을 활용한 교통수단 클래스 만들기

  • 부모 클래스: Transport (이동 메서드)

  • 자식 클래스: Car, Bicycle (각자 다른 이동 방식 출력)




실습 2: 캡슐화를 적용한 비밀번호 관리 시스템

  • 비밀번호는 private 속성으로 설정

  • 메서드를 통해 비밀번호 변경 및 확인




실습 3: 다형성을 활용한 알림 시스템

  • 부모 클래스: Notification (알림 메서드)

  • 자식 클래스: EmailNotification, SMSNotification

    각 클래스마다 다른 방식으로 알림 출력




실습 1, 2, 3에 대해 각각 Swift 클래스 


✨ 실습 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)의 핵심 원칙을 이해하게 되었어요!

  • 상속으로 코드 재사용을 늘리고

  • 캡슐화로 안전한 코드를 작성하며

  • 다형성으로 유연한 프로그램을 만들 수 있습니다.



댓글 쓰기