DevCho
Developer Blog
DevCho
반응형
전체 방문자
오늘
어제
  • 분류 전체보기 (48)
    • IOS (31)
      • Xcode (7)
      • Assets (1)
      • Swift (20)
      • UI (1)
      • SwiftUI (1)
      • Build (1)
    • Flutter (4)
      • Install (4)
      • Dart (0)
    • Rust (0)
    • 유용한 사이트 소개 (1)
    • 개발자의 아이템 (1)
    • Terminal (1)
    • Mac (2)
    • Git (1)
    • 회고 (1)
    • Java (2)
      • Java 기본 사용법 (2)
      • Collections (0)
    • 개발자의 글쓰기 (0)
    • 디자인 패턴 (1)
    • JavaScript (2)
    • Kotlin (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Storyboard
  • CLASS
  • dart
  • xcode13
  • optional
  • SwiftUI
  • 제어문
  • chocolatey
  • func
  • dart 설치
  • flutter dart
  • 스위프트
  • random number
  • Java
  • swift random
  • IOS
  • Xcode Theme
  • struct
  • Terminal
  • nil
  • Swift
  • MAC
  • flutter
  • xcode
  • flutter install
  • chocolatey 설치
  • Dark mode
  • flutter 설치
  • 플러터 설치
  • chocolatey install

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
DevCho

Developer Blog

[Swift] protocol이란 무엇인가?
IOS/Swift

[Swift] protocol이란 무엇인가?

2021. 12. 22. 23:53
반응형

protocol이란?

protocol은 타입으로 Swift의 class나 struct의 행동(func)을 정의하는 역할을 한다.

*Java, Kotlin, Dart, C#의 interface와 같은 역할을 한다. 

 

보통 프로그래밍에서의 protocol(프로토콜)이라 함은 프로그램(컴퓨터) 간에 데이터를 교환 방식을 정의하는 규칙을 말한다. 즉, 프로토콜은 코드 구현이 없는 규칙일 뿐이다. 따라서 프로토콜을 사용하는 프로그램에서 프로토콜을 보고 구현을 한다. Swift에서도 마찬가지로 protocol은 행동을 정의하기만 할뿐 구현을 하지 않는다.

 

 

protocol의 특징

  • protocol은 행동을 정의한다.
  • protocol은 타입이다.

 

protocol은 행동을 정의한다

예를 들어 Shop protocol이 있다고 해보자.  Shop protocol은 sell이라는 행동을 가진 protocol이다.

protocol Shop {
    func sell()
}

위 프로토콜을 보면 'func sell()' 이 정의만 되어있을 뿐 구현을 하지 않는다. 'sell()' 행동을 구현하기 위해서는 class나 struct에서 상속받아 구현을 해야한다. 예를 들어 다음 class Coffeeshop과 같이 Shop인터페이스에서 정의한 sell 을 구현하여 func을 완성시킬 수 있다.

class CoffeeShop : Shop {
    func sell() {
        print("Sell Coffee")
    }
}

 

 

protocol은 타입이다

protocol을 이용해 타입을 정의하면 protocol을  구현하는 모든 class나 stuct가 해당 protocol 타입을 수신하는 자리에 올 수 있다. 예를 들어 다음과 같은 func이 있다고 해보자. doSellAction은 Shop protocol을 파라미터로 받는다.

func doSellAction(shop : Shop){
    shop.sell()
}

 

위 예제에서 만든 class CoffeeShop 객체를 생성하여 이 자리에 오도록 해보자. CoffeeShop은 Shop protocol을 상속 받으므로 Shop이 들어가야 할 자리에 올 수 있다. 즉, Shop 타입을 받는 자리에 Shop 타입을 구현하는 CoffeeShop이 올 수 있다.

let coffeeShop = CoffeeShop()

doSellAction(shop: coffeeShop)

 

위 코드를 실행해보면 정상 동작하는 것을 확인할 수 있다.

 

그림1. CoffeeShop

 

 

 

protocol이 중요한 이유

객체의 유연한 설계를 위해서는 정의와 구현이 분리되어야 한다. 즉, 객체가 OCP 원칙을 지키기 위해서는 정의와 구현을 분리해야 한다.   

*OCP : Open Closed Principle. 확장에는 열려있고 변경에는 닫혀있어야 한다는 원칙

 

객체의 행동을 정의하는 타입을 만드는 것은 이 시작이다. 만약 func이 구체타입인 class나 struct를 인자로 받는다면 해당 인자에는 해당 class나 func만이 들어갈 수 있다. 하지만, protocol을 인자로 받게 되면 protocol을 구현하는 어떤 인자이든지 들어갈 수 있게 된다. 예를 들어 doSellAction에서는 protocol인 Shop을 인자로 받는다.

func doSellAction(shop : Shop){
    shop.sell()
}

 

따라서 이 자리에는  Shop을 구현하는 어떤 객체라도 들어올 수 있다. 예를들어 카페(coffeeShop), 케익집(cakeShop), 빵집(bakeryShop) 이 모두 Shop을 상속 받는다고 하면 이곳에는 어느 값이든 들어올 수 있게 된다.

let coffeeShop = CoffeeShop()
doSellAction(shop : coffeeShop)

let cakeShop = CakeShop()
doSellAction(shop : cakeShop)

let bakeryShop = BakeryShop()
doSellAction(shop: bakeryShop)
반응형

'IOS > Swift' 카테고리의 다른 글

[Swift] JSONDecoder 사용하여 JSON 데이터 파싱하기  (0) 2021.12.25
[Swift] 함수형 프로그래밍 알아보기 : 클로저(Closures), 일급객체  (0) 2021.12.25
[Swift] Struct와 Class의 차이는 무엇인가?  (0) 2021.12.20
[Swift] struct 내부에서 변수값 변경하기  (0) 2021.12.19
[Swift] struct 한 번에 정리하기  (1) 2021.12.19
    'IOS/Swift' 카테고리의 다른 글
    • [Swift] JSONDecoder 사용하여 JSON 데이터 파싱하기
    • [Swift] 함수형 프로그래밍 알아보기 : 클로저(Closures), 일급객체
    • [Swift] Struct와 Class의 차이는 무엇인가?
    • [Swift] struct 내부에서 변수값 변경하기
    DevCho
    DevCho
    개발자의 개발 공간

    티스토리툴바