본문 바로가기

Swift

Swift - Protocols Method 요구사항

업로드를 좀 자주 하는 것 같네요 ㅎ

요즘에 하루종일 집에 있다 보니깐 공부를 많이 하게 돼서 그런가 봐요 :)

프로토콜 공부를 하다보니깐 SwiftUI에 대해서 공부하는데 많은 도움이 되는 것 같아요!

제 착각일 수 도 있지만 제가 느끼기에는 그렇네요

여러분들에게도 도움이 되셨으면 좋겠네요 ㅎㅎ


이번에 제가 글을 쓸 주제는

Method 요구사항

에 대한 글이에요

첫번째로는 인스턴스 메서드 작성하는 방법에 대해서 알아보도록 할게요

인스턴스 메서드 작성하는 법은 인스턴스 프로퍼티에 비해서 굉장히 적고 쉽습니다^^

  1. 중괄호가 존재하지 않는다

  2. 선언부가 존재하지 않는다

  3. 파라미터에 초기값을 구현하지 못한다

위에 나와있는 3가지만 지켜주시면 인스턴스 메서드 요구사항은 끝입니다

프로퍼티에 비해서 정말 정말 별거 없죠?

 

이제 한번 코드로 구현해 보면서 알아보도록 할게요!!

protocol SomeProtocol {
    
    func someFunction()
    
}

 

protocol SomeProtocol {
    
    func someFunction(input : Int) -> Double
    
}

위에 있는 2개의 예제로 보셨듯이 프로토콜에서 정의하는 함수는

중괄호와 실행부는 선언하지 않고 파라미터 값에 초기값도 주지 않습니다

 

이번에는 프로토콜로 정의한 메서드를 채택해 볼까요?

struct SomeStruct : SomeProtocol {
    
    func someFunction() {
        print("hello peachberry")
    }
}

var somestruct = SomeStruct()
somestruct.someFunction()

 

struct SomeStruct : SomeProtocol {
    
    func someFunction(input: Int) -> Double {
        return Double(input)
    }
}

var somestruct = SomeStruct()
print(somestruct.someFunction(input: 6))

위에 선언한 2개의 프로토콜을 각각의 구조체에서 채택해 보았어요

프로토콜에서는 메서드의 이름과 반환 값 정도만 정해주었으면

구조체(클래스, 열거형)에 채택했을 때에는 이제 그 이름에 맞는 알맞은 기능을 구현해주시면 됩니다!

 

이번에는 타입 메서드 작성하는 방법에 대해서 알아보도록 할게요

타입 메서드도 인스턴스 메서드와 똑같이 선언해주시면 되고 한 가지 다른 점이라면

func 키워드 앞에 static이라는 키워드를 붙여주셔야 해요

 

예제 코드를 통해서 정의하는 것을 한번 보도록 할까요?

protocol SomeProtocol {
    
    static func someFunction()
    
}

클래스에서는 상속을 했을 경우 오버 라이딩하기 위해서

class 키워드를 타입 메서드 앞에 static 키워드 대신에 붙이고는 하지만

프로토콜에서는 그런 거 상관없이 타입 메서드는 무조건 static 키워드로 작성해주시면 돼요

 

클래스에서 이 타입 메서드를 채택했는 경우를 알아볼까요?

class SomeClass : SomeProtocol {
    
    class func someFunction() {
    
        print("execute")
        
    }
}

프로토콜 정의에서는 static으로 선언되어있어도

클래스에서 프로토콜을 채택하여 구현을 할 때에는 오버라이딩을 위해서 class 키워드로 작성해도 무방합니다!

class SomeSubClass : SomeClass {
    
    override static func someFunction() {
        
        print("override execute")
        
    }
}

SomeSubClass.someFunction() // "override execute"

이렇게 말이죠!!

 

이번에는 mutating 메서드의 요구사항에 대해서 알아보도록 할게요

 

mutating이라는 키워드는 구조체랑 열거형에서 메서드를 정의해보신 분들은 들어 본 적이 있을 거예요

이 키워드는 구조체나 열거형에 있는 프로퍼티 값을 메서드에서 수정하기 위해서 필요해요

 

예제를 통해서 한번 알아보도록 할까요

protocol SomeProtocol {
    
    mutating func mutatingfunc()
    
}

일단 먼저 mutating키워드를 가지고 있는 함수를 하나 선언하여 줍니다

struct SomeStruct : SomeProtocol {
    
    var num : Int
    
    mutating func mutatingfunc() {
        num += num
        print(num)
    }
}

var somestruct = SomeStruct(num: 4)
somestruct.mutatingfunc() //8

구조체에서 프로토콜을 채택하여 구현까지 마친 상태입니다

함수 안에 보시면 아시겠지만 구조체에서는 원래 프로퍼티의 값을 수정할 수가 없습니다

하지만 mutating키워드로 선언하시면 수정이 가능하게 됩니다

물론 클래스에서는 프로토콜에서 mutating이 선언되어 있어도 따로 구현해주지 않아도 됩니다!!

 

여기까지가 메서드 요구사항에 대한 글이었습니다

읽어주셔서 감사드리고 궁금하신 점이나 부족한 점이 있으면 댓글로 알려주세요 :)


제가 최근에 노트북을 변경하였더니 코드 블록에 스킨이 적용이 안되네요...

그 점은 양해 부탁드릴게요 ㅠ

다음에는 Initializer 요구사항에 대한 글로 돌아오겠습니다!!

'Swift' 카테고리의 다른 글

Swift - Properties - Property Wrappers  (0) 2020.07.21
Closure - Capture List  (0) 2020.07.17
Swift - Protocols Property 요구사항  (0) 2020.03.08
Swift - Protocols 기본개념  (0) 2020.03.07