IMCAT.DEV
로그인 가입
Swift 입문 문법

Swift Swift의 접근 제어

Swift Swift의 접근 제어 — 초급

Swift의 접근 제어

1. 도입 (왜 배워야 하는가)

Swift의 접근 제어는 소프트웨어 개발에서 매우 중요한 개념입니다. 접근 제어를 통해 클래스, 구조체, 메서드, 프로퍼티 등에 대한 접근 권한을 제어할 수 있어, 코드의 안전성과 유지보수성을 향상시킵니다.

실무에서 접근 제어를 제대로 이해하지 못하면, 다른 개발자가 작성한 코드에 의도치 않게 영향을 줄 수 있는 문제가 발생할 수 있습니다. 예를 들어, 클래스의 내부 상태를 외부에서 수정할 수 있다면, 버그가 발생하기 쉽고, 이는 나중에 문제를 해결하는 데 많은 시간을 소모하게 됩니다. 접근 제어는 이러한 문제를 예방하는 데 중요한 역할을 합니다.

2. 핵심 개념 설명

Swift의 접근 제어는 크게 네 가지로 나뉩니다:

  1. open: 다른 모듈에서도 접근 가능하고, 서브클래싱이 가능
  2. public: 다른 모듈에서도 접근 가능하지만, 서브클래싱은 불가능
  3. internal: 같은 모듈 내에서만 접근 가능 (기본값)
  4. fileprivate: 같은 파일 내에서만 접근 가능
  5. private: 같은 선언 내에서만 접근 가능
  6. 관련 용어 정리

    접근 제어 수준설명
    open다른 모듈에서도 접근 가능, 서브클래싱 가능
    public다른 모듈에서도 접근 가능, 서브클래싱 불가능
    internal같은 모듈 내에서만 접근 가능 (기본값)
    fileprivate같은 파일 내에서만 접근 가능
    private같은 선언 내에서만 접근 가능

    3. 기본 코드 예제

    다음은 각 접근 제어 수준을 보여주는 간단한 코드 예제입니다.

    class Animal {
        private var name: String = "Unknown"
        
        func setName(_ newName: String) {
            self.name = newName
        }
        
        func getName() -> String {
            return self.name
        }
    }
    
    let myAnimal = Animal()
    myAnimal.setName("Cat")
    // print(myAnimal.name) // 오류 발생: 'name'은 private 접근 제어로 인해 외부에서 접근할 수 없음
    print(myAnimal.getName()) // "Cat" 출력

    실행 결과

    Cat

    코드 한 줄씩 동작 설명

  7. class Animal에서 Animal이라는 클래스를 정의합니다.
  8. private var name: String = "Unknown"에서 name 프로퍼티는 private로 선언되어, 외부에서 직접 접근할 수 없습니다.
  9. func setName(_ newName: String) 메서드는 name 프로퍼티의 값을 설정하는 함수입니다.
  10. func getName() -> String 메서드는 name 프로퍼티의 값을 반환하는 함수입니다.
  11. let myAnimal = Animal()에서 Animal 클래스의 인스턴스를 생성합니다.
  12. myAnimal.setName("Cat")에서 setName 메서드를 통해 name을 "Cat"으로 설정합니다.
  13. print(myAnimal.getName())에서 getName 메서드를 통해 "Cat"을 출력합니다.
  14. 4. 실전 활용 예제

    1. 쇼핑몰에서 장바구니 구현

    쇼핑몰에서 장바구니 클래스를 만들 때, 장바구니의 아이템 리스트는 외부에서 직접 접근할 수 없도록 private으로 설정할 수 있습니다.

    class ShoppingCart {
        private var items: [String] = []
        
        func addItem(_ item: String) {
            items.append(item)
        }
        
        func getItems() -> [String] {
            return items
        }
    }

    여기서 items는 private로 설정하여 외부에서 직접 접근할 수 없게 하고, addItem 메서드를 통해 아이템을 추가할 수 있도록 합니다.

    2. 사용자 정보 관리

    사용자 정보를 다루는 클래스에서 중요한 정보를 private으로 설정하여, 외부에서 접근할 수 없도록 하는 패턴입니다.

    class User {
        private var password: String
        
        init(password: String) {
            self.password = password
        }
        
        func changePassword(newPassword: String) {
            self.password = newPassword
        }
    }

    이렇게 하면 비밀번호가 외부에서 직접 수정되지 않도록 보장할 수 있습니다.

    5. 흔한 실수와 주의사항

    실수 1: 접근 제어의 오해

    • 잘못된 코드
    • class Base {
          public func show() {}
      }
      
      class Sub: Base {
          override func show() {} // 오류 없음
      }
    • 올바른 코드
    • class Base {
          open func show() {} // open으로 설정해야 함
      }
      public은 서브클래싱을 허용하지 않기 때문에 open으로 설정해야 합니다.

      실수 2: 접근 제어의 기본값

    • 잘못된 코드
    • class MyClass {
          func doSomething() {} // 기본값은 internal
      }
    • 올바른 코드
    • class MyClass {
          private func doSomething() {} // 의도적으로 private으로 설정
      }

      기본값이 internal이므로, 의도적으로 접근 제어를 설정하는 것이 중요합니다.

      6. 정리

    • Swift의 접근 제어는 코드의 안전성과 유지보수성을 높이는 데 필수적입니다.
    • 접근 제어의 종류로는 open, public, internal, fileprivate, private가 있습니다.
    • 실무에서 자주 사용하는 패턴은 장바구니나 사용자 정보를 보호하는 방식입니다.
    • 다음에 학습하면 좋은 주제로는 Swift의 프로토콜이나 오류 처리를 추천합니다.