반응형
접근제어자
클래스와 구조체를 사용하다 보면 외부에서 특정 데이터에 접근을 제한하고 싶을 때가 있다.
struct Person {
var name: String
var age: Int
var havingMoney: Int
func introduce() {
print("안녕하세요. 제 이름은 \(name)이고, 나이는 \(age)살 입니다.")
}
}
var me = Person(name: "Brody", age: 26, havingMoney: 10000)
print(me.havingMoney)
- 내가 가진 돈은 나만 알고 싶은데 다른 사람에게 알리고 싶지 않을때 접근 제어자를 사용하면 외부에서 접근을 못하도록 막을 수 있다.
- 접근제어자는 외부에서 코드에 대한 접근을 제한하는 기능을 제공한다.
- 접근을 제어합으로써, 불필요한 정보의 노출을 막을 수 있다.
- class, enum, struct 등에서 사용 가능하며, 프로퍼티, 메소드에 적용할 수 있다.
Swift에서 제공하는 접근제어자 종류
open
- 모든 외부 모듈에서 접근할 수 있는 접근제어자
- 가장 개방적인 접근 수준
- 유일하게 class 에서만 사용 가능
- 상속이 가능하고 재정의 가능하기 때문에!
public
- 모든 외부 모듈에서 접근할 수 있는 접근제어자
- 가장 개방적인 접근 수준
internal
- 기본값 접근제어자로 설정하지 않았다면 internal
- 동일한 모듈에서 접근 가능
fileprivate
- 동일한 파일 내부에서만 접근할 수 있는 접근 제어자
private
- 가장 제한적인 접근 제어자
- 해당 요소를 선언한 스코프(예를 들어 class, struct, enum의 코드블록)에서만 사용 가능
- struct 에서 private 프로퍼티가 있다면 멤버와이즈 init을 사용할 수 없어서 직접 init을 작성해야 한다.
모듈이란?
- 모듈은 코드 배포의 단일 단위.
- Swift에서는 import를 사용하여 다른 모듈에서 가져올 수 있다.
struct Person {
var name: String
public var age: Int
private var havingMoney: Int
init(name: String, age: Int, havingMoney: Int) {
self.name = name
self.age = age
self.havingMoney = havingMoney
}
private func printMoney() {
print("나는 \(havingMoney) 원 있다!")
}
func test() {
printMoney()
}
}
let person = Person(name: "Brody", age: 20, havingMoney: 3000)
✅
person.test() // test 함수는 internal(default) 이여서 호출이 가능합니다.
// test 함수 안에서는 private printMoney 함수에 접근이 가능합니다.
// 출력 값 : 나는 3000 원 있다!0
person.age // public 이기 때문에 접근 가능합니다.
// ❌ 빌드 오류 발생
person.havingMoney // person의 havingMoney는 private 프로퍼티 이기 때문에 접근할 수 없습니다.
// 'havingMoney' is inaccessible due to 'private' protection level
person.printMoney() // person의 printMoney함수는 private 메소드여서 접근할 수 없습니다.
// 'printMoney' is inaccessible due to 'private' protection level
// 프로퍼티와 메소드뿐만 아니라 struct, class, enum도 동일하게 사용 가능
public struct Person2 {
}
fileprivate class Animal {
}
private enum Season {
}
직접 구현해보기
🌱 구현해보기
- 아래의 설명을 코드로 개발해주세요.
- BankAccount라는 클래스를 정의하고, balance라는 private 프로퍼티를 만드세요.
- deposit과 withdraw 메소드를 작성하여 계좌 잔고를 증가 또는 감소시키세요.
- balance는 직접적으로 접근하지 못하게 하고, 오직 deposit과 withdraw 메소드를 통해서만 변경할 수 있도록 확인해보세요.
- 현재 balance가 얼마있는지 확인할 수 있는 getBalance 메소드를 작성해주세요.
import Foundation
class BankAccount {
private var balance: Int
init(balance: Int) {
self.balance = balance
}
func deposit(_ money: Int) {
balance += money
}
func withdraw(_ money: Int) {
if money > balance {
print("잔액 부족 \n 현재 잔액은 \(balance)원 입니다.")
}
balance -= money
}
func getBalance() {
print("현재 잔액은 \(balance)원 입니다.")
}
}
let myAccount = BankAccount(balance: 1000)
myAccount.deposit(10000)
myAccount.withdraw(5000)
myAccount.getBalance()
반응형
'iOS > Swift' 카테고리의 다른 글
[ Swift ] Swift 5.9 신기능: 복사 불가능한 타입 (Noncopyable Types) (0) | 2025.03.26 |
---|---|
[ Swift ] ARC : Automatic Reference Counting (0) | 2025.03.25 |
[ Swift ] 중첩 타입 (0) | 2025.03.13 |
[ Swift ] Override (0) | 2025.02.06 |
[ Swift ] mutating (0) | 2025.02.04 |