GGURUPiOS
[Swift] 프로토콜 지향 vs 객체 지향 프로그래밍 (POP vs OOP) 본문
안녕하세요.
이번시간에는 프로토콜 지향 프로그래밍 (Protocol Oriented Programming)과
객체지향 프로그래밍 (Object-Oriented Programming)에 대해 알아보고 둘이 어떻게 다른지 보겠습니다.
Swift에서 프로토콜을 쓰는 이유는 무엇일까요?
그 이유를 이번시간에 파헤쳐 볼게용
그 전에 객체지향에 대해 무엇인지 간단히만 알아볼게요
객체 지향 프로그래밍(OOP)?
객체 지향 프로그래밍 이란 객체들의 '상호작용으로 서술하는 프로그래밍 기법' 입니다
(간단히 얘기해서 클래스의 인스턴스들끼리 프로퍼티, 메서드를 통해 상호작용)
객체지향 프로그래밍의 4가지 특성
- 추상화: 객체의 공통적인 속성과 기능을 추출하여 정의 (예를들어, 버스와 지하철 -> 탈것으로 정의, 추상화 가능)
- 캡슐화: 객체의 목적에 따라 데이터 구조 및 처리 방법을 결합시키고, 외부에 내부 기능 구현을 감추고 이용방법만 알려줌
예를들어, 클래스안의 프로퍼티에 직접 접근 못하게하고, 메서드를 통해서만 접근 가능하게 한다던가 등등
-> 외부에서 접근하지 못하도록 은닉화 하는게 핵심
-> 직접접근을 막으면 변경을 못하게 하여 유지보수, 오류 범위 최소화
-> 독립성, 모듈화 가능 - 상속: 상위 객체의 특징을 하위 객체가 물려받아 사용함
-> 코드의 길이를 줄이고, 가독성을 높임 - 다형성: 한 객체가 다른 여러형태의 객체로 재구성 되는 것
-> 서브클래스는 슈퍼클래스에서 상속할 메서드, 프로퍼티, 서브스크립트를 재정의 할 수 있음(오버라이딩)
-> 함수 이름, 파라미터, 리턴타입을 모두 고려해서 함수를 식별하기 때문에 오버로딩이 가능
객체지향 장점
재사용성, 생산성 향상
객체지향 단점
많은 오버헤드, 객체가 상태를 가지기 때문에 예기치않은 버그 발생가능
프로토콜 지향 프로그래밍(POP)?
OOP에서는 객체의 상속을 통해 공통 기능을 정의 했지만, 프로토콜 지향 프로그래밍은 프로토콜을 통해 공통 기능을 정의 하는 프로그래밍 방법입니다.
프로토콜 지향 프로그래밍의 장점(객체 지향과의 차이)
- 범용적 사용: 클래스 뿐만 아니라 구조체, 열거형 등 타입에도 적용 가능 하기 때문
- 상속한계 극복: 특정 상속 체계에 종속되지 않음 (Swift는 다중 상속이 불가능(수직적 구조) 하지만 프로토콜은 수평적 구조)
- 적은 시스템 비용: 기본적으로 클래스는 참조 타입이기 때문에 동적 할당과 참조 카운팅에 많은 자원을 소모
- 용이한 테스트
- DIP: 의존성이 구현체에 의존하지 않고 추상화된 프로토콜에 의존
- 확장성: 개발자가 코드를 작성할 때 매우 자연스럽게 사용 가능
사용하는 쪽에서 자연스러움 -> 프로토콜 준수 -> 기능 준수
프로토콜과 상속
- 프로토콜은 추상적인 행위를 정의
-> 특정 기능을 변경할 때 사이드이펙트가 적다.
상속 -> 오브젝트 자체를 변경, 프로토콜 -> 행위만 변경 - 서브클래스가 슈퍼클래스의 구현 세부사항에 결합하게 되어 슈퍼 클래스의 변경이 서브클래스에 영향 미칠 수 있음
-> 슈퍼 클래스를 변경하려고 할 때, 서브 클래스를 고려해야함 (유지보수가 어려움)
한마디 요약
Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오.
프로토콜 지향 프로그래밍은 객체 지향 프로그래밍과 다르게 상속을 이용하지 않고 프로토콜을 이용하기 때문에
클래스 이외에도 구조체 열거형 등에 적용이 가능하며 상속과는 다르게 수평적인 구조로 기능을 확장 시킬 수 있다.
(기능 모듈화를 더욱 명확히 할 수 있다.)
출처
https://ios-development.tistory.com/1377
'Swift > 문법 파헤치기' 카테고리의 다른 글
[Swift] 접근제어(Access Control)란? (0) | 2023.12.05 |
---|---|
[Swift] Hashable 이란? Equatable을 준수해야 하는 이유 (1) | 2023.12.04 |
[Swift] KVO란? Key-Value 코딩과 함께 알아보자 (0) | 2023.11.09 |
[Swift] Singleton? 싱글톤에 대해 알아보기 (1) | 2023.11.07 |
[Swift] Delegate Pattern이란? 왜 사용할까? (0) | 2023.11.07 |