⭐️ 프로토콜을 채택하고 있는 모든 타입들을 채택할 수 있게 된다.

쉬운 예시

class A {
	var name = "aaa"
}

class C {
	var a = A()

	func printAlphabet() {
		print(a.name)
	}
}

*C클래스는 A클래스에 의존하고 있다. (예, A클래스의 name 프로퍼티를 age로 바꾸면 C클래스 안에 a.name도 a.age로 바꿔줘야한다)


final class WeatherService {
	func fetchData(_ completion: @escaping (WeatherData?) -> Void) {
		...
	}
}
final class WeatherViewModel {
	var data: WeatherData?
	
	// ⭐️
	**let service = WeatherService()**

	func fetchWeatherData() {
		service.fetchData { [weak self] data in 
			guard let weakSelf = self else { return }
			weakSelf.data = data
		}
	}
}

protocol **Servicing**: AnyObject **{**
	func fetchData(_ completion: @escaping (WeatherData?) -> Void)
**}**
final class WeatherService: **Servicing** {
	func fetchData(_ completion: @escaping (WeatherData?) -> Void) {
		...
	}
}
final class WeatherViewModel: **Servicing** {
	var data: WeatherData?

	// ⭐️ service: WeatherService가 아니라 WeatherServicing
	// ⭐️ WeatherService에는 접근 불가능
	**let service: Servicing

	init(service: Servicing) {
		self.service = service
	}**

	func fetchWeatherData() {
		service.fetchData { [weak self] data in 
			guard let weakSelf = self else { return }
			weakSelf.data = data
		}
	}
}

❖ 전