[iOS-Swift] 프로토콜

TIL 10일 차 - Swift 문법 프로토콜

프로토콜은 이 클래스(구조체)는 이러한 기능을 반드시 가져야 한다!라고 약속을 적어둔 설계도임

class, structure, enum에서 공통으로 구현해야 하는 메소드와 프로퍼티의 청사진을 정의하는 기능이다.

 

프로토콜 자체가 기능을 구현하지는 않으며, 오직 설계만 제공함

 

 

프로토콜의 일반적인 생김새

protocol 프로토콜 이름 {
	// 프로퍼티 정의
    // 메소드 정의
}

protocol FullyNamed {
	var fullName: String { get }
    
    func sayMyFullName() -> String // 구현부는 작성 X
}

protocol Worker {
	fun work()
}
// Worker를 채택하는 녀석은 work()라는 함수를 반드시 구현해야한다는 뜻임.
// 즉 프로토콜은 구현을 하지는 않고 규칙만 제시한다.

 

 

 

프로토콜을 채택한다면?

struct Developer: Worker {
    func work() {
        print("코드를 작성한다.")
    }
}
// Developer 구조체는 Worker 프로토콜 계약서에 사인하였다
// 따라서 work()를 만들지 않으면 에러가 발생함. 단 함수의 내용은 자유임

 

1개의 프로토콜 채택

// 1개의 프로토콜 채택하기
protocol FullyNamed {
    var fullName: String {get}
    
    func sayMyFullName() -> String
}

class Person: FullyNamed { // FulltName 프로토콜을 채택함
    var fullName: String // FullyName 프로토콜에 있는 fullName 프로퍼티를 구현
    
    func sayMyFullName() -> String { // 프로토콜에 있는 메소드를 구현해야함
        return fullName
    }
    
    init(fullName: String) {
        self.fullName = fullName
    }
}

var person = Person(fullName: "JH")

print(person.fullName) // "JH" 출력
print(person.sayMyFullName()) // "JH" 출력

 

여러개의 프로토콜 채택

// 여러개의 프로토콜 채택

protocol FullyNamed {
    var fullName: String {get}
    
    func sayMyFullName() -> String
}

protocol ShortNamed {
    var shortName: String {get}
}


class Person: FullyNamed, ShortNamed { // 여러개의 프로토콜을 채택할때는 , 로 구분하여 나열함
    var fullName: String
    
    func sayMyFullName() -> String {
        return fullName
    }
    
    var shortName: String {
        return "ShortName"
    }
    
    init(fullName: String) {
        self.fullName = fullName
    }
}


var person = Person(fullName: "JH")

print(person.fullName) //'JH' 출력
print(person.sayMyFullName()) //'JH' 출력
print(person.shortName) // 'ShortName' 출력

 

 

그렇다면 이러한 프로토콜은 왜 쓰냐?

만약 프로토콜이 없다면..

- 클래스마다 규칙이 제 각각임

- 협업시에 이 객체가 뭘 할 수 있는지를 계속 물어야 함

 

만약 프로토콜이 있다면?

- Worker가 있는 것을 보고 함수 work()가 있는 구조체임을 한눈에 알아볼 수 있음

- 타입이 다르더라도 같은 방식으로 다룰 수 있음

 

 

함수의 파라미터 타입을 프로토콜로 받는다면

func startWorking(woker: Worker) {
	worker.work()
}

// Worker 프로토콜을 채택한 어떤것이든 받을 수 있음



struct Developer: Worker {
	func work() {
    	print("코드 짜기")
     }
}

struct Designer: Worker {
	func work() {
    	print("디자인 하기")
     }
}

struct PartTimer: Worker {
	func work() {
    	print("서빙을 한다")
     }
}


startWorking(worker: Developer()) // 코드를 짠다
startWorking(worker: Designer()) // 디자인을 한다
startWorking(worker: PartTimer()) // 서빙을 한다
// 같은함수이지만 각각 다른 동작을 한다.

 

 

 

클래스 전용 프로토콜 만들기

- class 전용 프로토콜은 struct, enum에서 사용될 수 없음

protocol OnlyClassProtocol: AnyObject {

}
// 프로토콜 정의 시, AnyObject를 채택하면 클래스 전용 프로토콜로 만들 수 있음

 

'iOS  > Swift ' 카테고리의 다른 글

[iOS-Swift] 중첩타입  (0) 2026.01.08
[iOS-Swift] enum 열거형  (0) 2026.01.08
[iOS-Swift] 인스턴스  (0) 2026.01.07
[iOS-Swift] 고차함수  (0) 2026.01.07
[iOS-Swift] 고급 데이터 타입(Collection Type)  (0) 2026.01.06