iOS프로그래밍기초(Smile Han)/문법 정리

[Swift] 문법 정리 - extension, Swift 접근 제어(access control), 프로토콜(protocol)

wse46 2024. 11. 17. 23:02
https://youtu.be/R8OWOgCNt4M?si=bldau6gYEZ3seGj2

위 영상을 보고 정리한 글입니다. (29:14 ~ 34:03)

 

# 익스텐션 

  • 스위프트 클래스, 구조체, 열거형, protocol에 새로운 기능을 추가
  • 익스텐션은 하위 클래스를 생성하거나 참조하지 않고 기존 클래스에 메서드, 생성자(initailizer), 계산 프로퍼티 등의 기능을 추가하기 위하여 사용
  • 스위프트 언어의 built-in 클래스와 iOS 프레임워크에 내장된 클래스에 기능을 추가할 때 익스텐션을 이용하면 매우 효과적임
  • 클래스(구조체, 열거형, protocol)는 다음과 같은 형태로 확장(익스텐션)됨
extension 기존타입이름 {
    // 새로운 기능
}
  • 표준 자료형 Double 구조체에 두 배의 값을 반환하는 프로퍼티를 추가
extension Double{
   var squared : Double {
      return self * self
   }
}
  • 이제는 Double형의 인스터스 myValue를 다음과 같이 사용할 수 있다.
let myValue: Double = 3.0
print(myValue.squared)
print(3.0.squared) // Double형 값에도 '.'으로 바로 사용 가능
  • 출력값
    9.0
    9.0


# Swift의 access control

public class MyClass{
    fileprivate var name : String = "Kim"
    private func play(){}
    func display(){}
}

모듈은 코드 배포(code distribution)의 단일 유닛

 

1. open 접근, public 접근

  • 모듈의 모든 소스 파일 내에서 사용 가능
    정의한 모듈을 가져오는 다른 모듈의 소스파일에서도 사용 가능
  • Framework에 공용 인터페이스를 지정할 때 사용
    open 접근은 클래스 및 클래스 멤버에만 적용

2. internal 접근

  • 해당 모듈의 모든 소스 파일 내에서 사용
    해당 모듈 외부의 소스 파일에서는 사용 불가
    App이나 Framework의 내부 구조를 정의할 때 사용

3. fileprivate 접근

  • 해당 소스 파일 내에서만 사용 가능

4. private 접근

  • 블록과 동일한 파일에 있는 해당 선언의 extension으로 제한
open class var blue : UIClolor { get }
  • open : 모듈 외부까지(클래스에만 사용) 접근 가능
  • class : 클래스 프로퍼티
  • 읽기 쓰기 가능한 프로퍼티는 정의 뒤에 {get set}
  • 읽기만 가능한 프로퍼티는 정의 뒤에 {get}

 


# 프로토콜(protocol)

 

특정 클래스와 관련없는 프로퍼티, 메서드 선언 집합

  • 함수(메서드) 정의는 없음
  • 기능이나 속성에 대한 설계도
  • 클래스(구조체, 열거형)에서 채택(adopt)하여 메서드를 구현해야 함

Swift 상속과 프로토콜 채택

  • 부모 클래스는 하나만 가능하며 여러 개라면 나머지는 프로토콜
  • class 클래스명: 부모명, 프로토콜명 { }
    부모가 있으면 부모 다음에 표기
  • class 클래스명: 부모명, 프로토콜명1, 프로토콜명2 { }
  • class 클래스명: 프로토콜명 { }
    부모가 없으면 바로 표기 가능
  • class 클래스명: 프로토콜명1, 프로토콜명2 { }
  • 클래스, 구조체, 열거형에 프로토콜을 채택(adopt) 할 수 있다.

protocol 정의

protocol 프로토콜명 {
    프로퍼티명
    메서드 선언 // 메서드는 선언만 있음
}
protocol 프로토콜명 : 다른 프로토콜, 다른 프로토콜2 {
    // 프로토콜은 다중 상속도 가능
}

 

프로토콜과 프로퍼티/메서드 선언

protocol SomeProtocol {
    var x: Int { get set } // 읽기와 쓰기가 가능
    var y: Int { get } // 읽기 전용
    static var tx: Int { get set }
    static func typeMethod()
    func random() -> Double
}

 

protocol 채택과 준수

protocol Runnable
   var x : Int { get set }
   func run()
}
class Man : Runnable {
   var x : Int = 1
   func run(){ print("달린다~") }
}
  • class Man에 x, run()정의 없다면
    type 'Man' does not conform to protocol 'Runnable'