오늘의 주제
1. 프로토콜
2. 익스텐션
안녕하세요, 야곰입니다.
지난 포스팅에서는 스위프트의 구조체와 클래스에 대해 알아봤습니다.
2017/01/23 - [Swift] - Swift란 어떤 언어인가?
2017/01/25 - [Swift] - Swift 기초문법 - 변수, 상수, 기초 데이터 타입
2017/02/06 - [Swift] - Swift - 함수, 콜렉션 타입
2017/02/28 - [Swift] - Swift - 구조체 클래스
프로토콜
프로토콜(Protocol)은 특정 역할을 수행하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 정의합니다. 구조체, 클래스, 열거형은 프로토콜을 채택(Adopted)해서 특정 기능을 수행하기 위한 프로토콜의 요구사항을 실제로 구현할 수 있습니다. 어떤 프로토콜의 요구사항을 모두 따르는 타입은 그 ‘프로토콜을 준수한다(Conform)’고 표현합니다. 타입에서 프로토콜의 요구사항을 충족시키려면 프로토콜이 제시하는 청사진의 기능을 모두 구현해야 합니다. 즉, 프로토콜은 기능을 정의하고 제시 할 뿐이지 스스로 기능을 구현하지는 않습니다.
프로토콜 정의
프로토콜은 구조체, 클래스, 열거형의 모양과 비슷하게 정의할 수 있으며 protocol 키워드를 사용합니다.
protocol 프로토콜 이름 {
프로토콜 정의
}
struct SomeStruct: AProtocol, AnotherProtocol { // 구조체 정의 } class SomeClass: AProtocol, AnotherProtocol { // 클래스 정의 } enum SomeEnum: AProtocol, AnotherProtocol { // 열거형 정의 }
class SomeClass: SuperClass, AProtocol, AnotherProtocol { // 클래스 정의 }
프로토콜 요구사항
프로퍼티 요구
protocol SomeProtocol { var settableProperty: String { get set } var notNeedToBeSettableProperty: String { get } } protocol AnotherProtocol { static var someTypeProperty: Int { get set } static var anotherTypeProperty: Int { get } }
protocol Talkable { var topic: String { get set } } struct Person: Talkable { var topic: String }
메서드 요구
protocol Talkable {
var topic: String { get set }
func talk(to: Person)
}
struct Person: Talkable {
var topic: String
var name: String
func talk(to: Person) {
print("\(topic)에 대해 \(to.name)에게 이야기합니다")
}
}
이니셜라이저 요구
protocol Talkable { var topic: String { get set } func talk(to: Person) init(name: String, topic: String) } struct Person: Talkable { var topic: String var name: String func talk(to: Person) { print("\(topic)에 대해 \(to.name)에게 이야기합니다") } init(name: String, topic: String) { self.name = name self.topic = topic } } let yagom: Person = Person(name: "야곰", topic: "스위프트") let hana: Person = Person(name: "하나", topic: "코딩") yagom.talk(to: hana) // 스위프트에 대해 하나에게 이야기합니다
프로토콜의 상속
protocol Readable {
func read()
}
protocol Writeable {
func write()
}
protocol ReadSpeakable: Readable {
func speak()
}
protocol ReadWriteSpeakable: Readable, Writeable {
func speak()
}
class SomeClass: ReadWriteSpeakable {
func read() {
print("Read")
}
func write() {
print("Write")
}
func speak() {
print("Speak")
}
}
익스텐션
- 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
- 타입 메서드 / 인스턴스 메서드
- 이니셜라이저
- 서브스크립트
- 중첩 타입
- 특정 프로토콜을 준수할 수 있도록 기능 추가
|
상속 |
익스텐션 |
확장 |
수직 확장 |
수평 확장 |
사용 |
클래스 타입에만 사용 |
클래스, 구조체, 프로토콜, 제네릭 등 모든 타입 |
재정의 |
재정의 가능 |
재정의 불가 |
익스텐션 문법
extension 확장할 타입 이름 {
// 타입에 추가될 새로운 기능 구현
}
extension 확장할 타입 이름: 프로토콜1, 프로토콜2, 프로토콜3 { // 프로토콜 요구사항 구현 }
익스텐션으로 확장할 수 있는 항목
연산 프로퍼티 추가
extension Int { var isEven: Bool { return self % 2 == 0 } var isOdd: Bool { return self % 2 == 1 } } print(1.isEven) // false print(2.isEven) // true print(1.isOdd) // true print(2.isOdd) // false var number: Int = 3 print(number.isEven) // false print(number.isOdd) // true number = 2 print(number.isEven) // true print(number.isOdd) // false
메서드 추가
extension Int {
func multiply(by n: Int) -> Int {
return self * n
}
}
print(3.multiply(by: 2)) // 6
print(4.multiply(by: 5)) // 20
var number: Int = 3
print(number.multiply(by: 2)) // 6
print(number.multiply(by: 3)) // 9
이니셜라이저 추가
extension String { subscript(appendValue: String) -> String { return self + appendValue } subscript(repeatCount: UInt) -> String { var str: String = "" for _ in 0..<repeatCount { str += self } return str } } print("abc"["def"]) // "abcdef" print("abc"[3]) // "abcabcabc"
- 본 글의 일부내용은 필자의 저서 [스위프트 프로그래밍](2017, 한빛미디어)(http://www.hanbit.co.kr/store/books/look.php?p_code=B5682208459)에서 요약, 발췌하였음을 알립니다.
- 스위프트의 문법에 대해 더 알아보고 싶다면 애플의 Swift Language Guide[https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html]를 참고해도 많은 도움이 됩니다.
by yagom
facebook : http://www.facebook.com/yagomSoft
facebook group : https://www.facebook.com/groups/yagom/
twitter : http://www.twitter.com/yagomSoft ( @yagomsoft )
p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.
RSS Feed 받기
'Swift > 기본문법' 카테고리의 다른 글
이름짓기, 콘솔로그, 문자열 보간법 (0) | 2017.05.11 |
---|---|
스위프트 시작하기 (0) | 2017.05.08 |
Swift - 구조체 클래스 (0) | 2017.02.28 |
Swift - 함수, 콜렉션 타입 (0) | 2017.02.06 |
Swift 기초문법 - 변수, 상수, 기초 데이터 타입 (0) | 2017.01.25 |