POP(Protocol Oriented Programming)는 프로토콜 지향 프로그래밍을 의미합니다. Swift 언어에서 도입된 이 개념은 객체 지향 프로그래밍(OOP)의 한계를 극복하기 위해 설계되었습니다. 객체 지향 프로그래밍(OOP)와 달리 프로토콜 지향 프로그래밍(POP)은 프로토콜을 중심으로 설계되었습니다.
전통적인 OOP에서는 상속을 통해 기능을 확장하는 방식이 일반적입니다. 그러나 상속은 복잡한 계층 구조를 만들어 코드의 가독성을 떨어뜨리고, 유지보수를 어렵게 만드는 단점이 있습니다. POP는 이러한 문제를 해결하기 위해 프로토콜을 사용하여 구현하며, 다음과 같은 차이점들이 있습니다.
중심 개념
OOP는 클래스가 중심입니다. 객체는 클래스의 인스턴스로 생성되며, 클래스는 속성과 메서드를 포함합니다. 반면에 POP는 프로토콜이 중심입니다. 프로토콜은 특정 기능이나 속성을 정의하고, 이를 준수하는 여러 타입(클래스, 구조체, 열거형 등)이 존재할 수 있습니다.
상속 vs 조합
OOP는에서 클래스는 상속을 통해 기능을 확장합니다. 이는 단일 상속 또는 다중 상속을 통해 이루어질 수 있습니다. POP는 상속 대신 프로토콜의 조합을 통해 기능을 확장합니다. 여러 프로토콜을 채택하여 다양한 기능을 구현할 수 있습니다.
값 타입 vs 참조 타입
OOP에서 대부분의 경우 클래스는 참조 타입입니다. 객체가 복사될 때, 참조가 복사되므로 원본 객체에 대한 변경이 영향을 미칠 수 있습니다. POP에서 구조체와 같은 값 타입을 사용할 수 있어, 복사할 때 실제 값이 복사됩니다. 이는 메모리 관리와 데이터 안전성 측면에서 이점을 제공합니다.
유연성
OOP에서 클래스 간의 상속 관계가 복잡해질 수 있으며, 코드가 경직해질 수 있습니다. 반면에 POP는 프로토콜을 통해 여러 타입이 동일한 기능을 수행할 수 있으므로, 더 유연하고 확장 가능한 코드를 작성할 수 있습니다.
유연성과 확장성: POP는 프로토콜을 통해 다양한 타입이 동일한 기능을 구현할 수 있도록 하여, 코드의 유연성과 확장성을 높입니다. 새로운 타입을 추가할 때 기존 코드를 변경할 필요가 없습니다.
코드 재사용성: 프로토콜 내에서 기본 구현을 제공할 수 있어, 이를 채택하는 타입은 해당 기능을 재사용할 수 있습니다. 이로 인해 중복 코드를 줄일 수 있습니다.
값 타입의 장점: POP는 구조체와 같은 값 타입을 활용할 수 있습니다. 값 타입은 복사 시 실제 값이 복사되므로, 데이터 안전성이 높아지고 메모리 관리가 용이합니다.
다중 상속 문제 해결: POP는 프로토콜의 조합을 통해 다중 상속의 문제를 피할 수 있습니다. 여러 프로토콜을 채택함으로써 다양한 기능을 쉽게 결합할 수 있습니다.
테스트 용이성: 프로토콜을 사용하면 의존성을 줄일 수 있어, 테스트가 용이해집니다. 특정 프로토콜을 준수하는 가짜(mock) 객체를 쉽게 만들 수 있습니다.
가독성 향상: 프로토콜을 활용하여 인터페이스를 명확하게 정의할 수 있어, 코드의 가독성이 향상됩니다. 각 타입이 어떤 기능을 제공하는지 쉽게 이해할 수 있습니다.
모듈화: POP는 기능을 모듈화하는 데 도움을 줍니다. 각 프로토콜과 그 구현체를 독립적으로 관리할 수 있어, 코드의 유지보수가 쉬워집니다.
[iOS - swift] POP(Protocol Oriented Programming) 프로토콜 지향 프로그래밍