swift에서의 캡슐화(Encapsulation) #객체지향프로그래밍

임혜정·2024년 8월 20일
0
post-custom-banner

Swift에서 캡슐화

객체 지향 프로그래밍의 핵심 원칙 중에 하나이며 데이터와 그 데이터를 조작하는 메서드를 하나의 단위로 묶는 것을 말한다.

  1. 접근 제어자 (private, fileprivate, internal, public, open) 를 사용함
  2. 프로퍼티 래퍼 (get, set)를 사용해서 접근 제어
  3. 계산 프로퍼티 - 저장된 값말고 계산된 값을 제공함
  4. 프로퍼티 옵저버 - willSet, didSet을 사용해서 변화 관찰

예제

class BankAccount {
    private var balance: Double = 0
    private(set) var accountNumber: String
    
    init(accountNumber: String) {
        self.accountNumber = accountNumber
    }
    
    func deposit(amount: Double) {
        if amount > 0 {
            balance += amount
        }
    }
    
    func withdraw(amount: Double) -> Bool {
        if amount > 0 && balance >= amount {
            balance -= amount
            return true
        }
        return false
    }
    
    var balanceInfo: String {
        return "Current balance: $\(balance)"
    }
}

// 실제 사용
let account = BankAccount(accountNumber: "1234567890")
account.deposit(amount: 1000)
print(account.balanceInfo) // 출력: Current balance: $1000.0

if account.withdraw(amount: 500) {
    print("Withdrawal successful")
    print(account.balanceInfo) // 출력: Current balance: $500.0
} else {
    print("Insufficient funds")
}

// 직접 접근 불가:
// account.balance = 1000000 // 컴파일 에러
// account.accountNumber = "0987654321" // 컴파일 에러
print(account.accountNumber) // 읽기는 가능
  1. balance는 private으로 선언되어 클래스 외부에서 직접 접근할 수 없다. (접근제어자)
  2. accountNumber는 private(set)으로 선언되어 외부에서 읽을 수는 있지만 수정할 수 없다 (프로퍼티 래퍼)
  3. deposit과 withdraw 메서드를 통해서만 잔액을 변경할 수 있다 (인터페이스 역할)
  4. balanceInfo는 계산 프로퍼티로, 잔액 정보를 문자열 형태로 제공 (계산 프로퍼티)

데이터(상태): balance, accountNumber
메서드(행동): deposit, withdraw, balanceInfo

이것(데이터와 기능)들이 BankAccount라는 하나의 클래스 안에 함께 모여있게 되는데 이로서
1.데이터(balance)는 private으로 보호
2. 정의된 메서드(deposit, withdraw)를 통해서만 접근/수정할 수 있다
3. 이 클래스를 사용하는 외부 코드는 내부 구현을 모르면서 제공된 메서드만 사용하면 된다

profile
오늘 배운걸 까먹었을 미래의 나에게..⭐️
post-custom-banner

0개의 댓글