스파르타 코딩 클럽 - iOS 스타터 6기/본 캠프

16. 스파르타 코딩 클럽 - 접근제어자

seongpil Heo 2025. 3. 17. 20:46

 🎯 접근제어자

📚 내가 가진 돈은 나만 알고 싶은데 다른 사람에게 알리고 싶지 않아요!
이럴 때 접근제어자를 사용하면 외부에서 접근을 못하도록 막을 수 있습니다.
접근제어자는 외부에서 코드에 대한 접근을 제한하는 기능을 제공합니다.
접근을 제어함으로써, 불필요한 정보의 노출을 막을 수 있습니다.
class, enum, struct 등에서 사용 가능하며, 프로퍼티, 메소드 에 적용할 수 있습니다.

 


 Swift에서 제공하는 접근제어자 종류

1. open

  • 모든 외부 모듈에서 접근할 수 있는 접근제어자
  • 가장 개방적인 접근 수준
  • 유일하게 class에서만 사용 가능
    • 상속이 가능하고 재정의 가능하기 때문에!

2. public

  • 모든 외부 모듈에서 접근할 수 있는 접근제어자
  • 가장 개방적인 접근 수준

3. internal

  • 기본값 접근제어자로 설정하지 않았다면 internal
  • 동일한 모듈에서 접근 가능

4. fileprivate

  • 동일한 파일 내부에서만 접근할 수 있는 접근 제어자

5. 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

힌트에서도 private 프로퍼티, 메소드는 제공하지 않는다.


 실습하기

import UIKit

// 접근제어자 실습하기

class BankAccount {
    private var balance: Int = 0
    
    func deposit(money: Int) {
        balance += money
    }
    
    func withdraw(money: Int) {
        if money < balance {
            balance -= money
        } else {
            print("오류가 발생했습니다")
        }
    }
    
    func getBalance() -> Int {
        return balance
    }
}

let account = BankAccount()
// print(account.balance) // private 접근제어자 때문에 접근 불가 (출력 불가)


account.deposit(money: 1000)
print(account.getBalance())
account.withdraw(money: 2000)
print(account.getBalance())

 

private 프로퍼티나 메소드는 클래스 외부에서 접근할 수 없음