[Swift] Protocol

정환우·2021년 1월 4일
1

iOS

목록 보기
6/24
post-thumbnail

앞에서 나만의 보안 키보드를 만들다가 protocol을 사용하였는데 이것을 이용해서 다른 파일에 데이터를 넘겨주는 식으로 사용을 하길래 중요해 보였다. 그리고 이게 뭔지도 모르겠어서 알고 넘어갈 필요가 있다고 생각이 되어 열심히 구글링을 해보았다.

Protocol 이란?

애플 공식문서에 정의된 protocol의 정의는 이렇다.

"A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality."

...?

뭐 특정 작업 혹은 기능들을 구현하기 위한 메소드들, 그리고 다른 요구사항들의 모임?

그래서 더 찾아보니 보통 개발자 블로그에선 이렇게 말하더라.

Java의 Interface와 굉장히 비슷하다.

자바의 Interface?

본인은 군대에 있을 때 자바 책을 샀었기 때문에 책을 뒤져 인터페이스가 무엇인지 찾아보았다.

예를들어 우리가 어플을 하나 개발한다고 치자. 근데 어플을 iOS말고 안드로이드용도 개발할 것이라고 한다.

만약 한명의 개발자가 개발한다고 해도, 마구잡이로 개발하게 된다면 두 어플의 결과물이 완전히 일치할 수 있을까? 그리고 나중에 유지보수를 하게 된다면 더더욱 복잡해 질 것이다.

그래서

  1. 기능별로 클래스를 정한다

  2. 기능별로 메서드의 선언부를 정한다

  3. 기능별로 변수를 정한다.

이렇게 기준을 정하면 플랫폼에 상관없이 일관된 방법으로 프로그램을 사용할 수 있고, 짤 수도 있다. 즉, 이것을 "인터페이스를 통일했다."라고 말하는 것이다.

그리고 인터페이스는 여러 클래스에서 사용할 필드와 메서드를 일관되게 하기 위한 설명과 같은 것이다. 즉, 실제 존재하는 객체가 아니므로 인터페이스에서 객체를 생성할 수 없다!

그러므로 인터페이스에서 필드를 선언한다는 것은 객체 생성과 상관없이 사용할 수 있는 static으로 선언해야 한다는 것을 의미한다.

프로토콜 기본 형태

프로토콜의 기본 형태는 다음과 같다.

protocol 프로토콜 이름{
//프로토콜 정의를 작성하고
}

그리고 이 프로토콜을 사용하려면 구조체, 클래스, 열거형 등에서 상속 받듯이 콜론 뒤에 작성하면 된다. 여러가지거나 superclass가 있으면 쉼표를 사용하여 구분해준다.

struct aStruct: AProtocol, BProtocol{
// 구조체
}

class aClass : Superclass, AProtocol, BProtocol{
// 클래스 정의
}

이런 식이다.

프로토콜 구현

프로토콜에서 프로퍼티는 이름과 타입, 그리고 get, set한지 명시해야한다.(자바의 getter,setter 개념과 같다. 자바랑 많이 비슷하네) 그리고 프로퍼티들은 항상 var로 선언해 줘야한다.

protocol Student{
var score:Int{get set}
var name:String{get}
}

그리고 이 프로토콜을 채택하는 타입은 해당 프로퍼티를 구현해 줘야한다.

class Harry: Student{
 var studentscore :Int = 0
 var score:Int {
 
 	get {
        	return studentscore
        }
      	set {
            	studentscore = 100
            }
       }
       
 var name: String = Harry
}

이런식이다.

그리고 메소드를 정의할 때는 함수명과 반환값을 지정할 수 있고, {}를 적지 않는다. 그리고 mutating 키워드를 사용해 인스턴스에서 변경 가능하다는 것을 표시할 수 있다.(값 타입에서만 사용 가능하다는데, 이게 뭔지 아직은 잘 모르겠다.)

protocol Person{
static func speaking()
func doing()
mutating func running()
}

class Harry:Person{

var heartrate = 80
static func speaking(){
	print("내 이름은 Harry입니다.")
    }

func doing(){
print("나는 지금 쉬는중이야.")
}

mutating func running(){
heartrate += 50
}

이런식이다.

자바책보면서 이걸 보니 정말 인터페이스랑 굉장히 유사한듯.

다음에는 delegate에 대해서 공부해보고 써봐야겠다.


참고 자료:
오늘의 스위프트 상식(프로토콜)
이동건님 블로그 - 프로토콜
처음 해보는 자바 프로그래밍 - 오정임 저

0개의 댓글