객체 지향 프로그래밍의 핵심 원칙 중에 하나이며 데이터와 그 데이터를 조작하는 메서드를 하나의 단위로 묶는 것을 말한다.
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) // 읽기는 가능
데이터(상태): balance, accountNumber
메서드(행동): deposit, withdraw, balanceInfo
이것(데이터와 기능)들이 BankAccount라는 하나의 클래스 안에 함께 모여있게 되는데 이로서
1.데이터(balance)는 private으로 보호
2. 정의된 메서드(deposit, withdraw)를 통해서만 접근/수정할 수 있다
3. 이 클래스를 사용하는 외부 코드는 내부 구현을 모르면서 제공된 메서드만 사용하면 된다