Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오. #18

Open
Do-hyun-Kim opened this issue Sep 20, 2023 · 4 comments
Labels
Swift Swift CS 개념 공부

Comments

@Do-hyun-Kim
Copy link
Contributor

No description provided.

@Do-hyun-Kim Do-hyun-Kim added the Swift Swift CS 개념 공부 label Sep 20, 2023
@Do-hyun-Kim
Copy link
Contributor Author

Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오.

Polymorphism 다형성

  • 다형성이란 하나의 객체(Object)가 여러 가지 타입(type)을 가질 수 있는 것을 의미한다.
  • Object Oriented Programming의 다형성의 대표적으로 오버로딩(Overloading), 오버라이딩(Overriding)이 있다.
  • Protocol Oriented Programming 은 확장(extension)을 통해 공통 코드(Method)를 제공해 줄수 있다.

Protocol Oriented Programming

  • Protocol Oriented Programming 은 프로토콜 지향 프로그래밍으로 확장을 통한 수평 구조로 타입(Type)을 확장하는 방식으로 다형성을 구현한다.
  • protcol은 필요한 부분만 분리하여 만들수 있으며(Interface Segregation Principle), 다중 프로토콜을 구현하여 채택할 수 있다.
  • protocolextenion을 활용하여 Method를 정의하여 채택 받은 객체(object) 에 로직을 구현하지 않도록 할 수 있다.
  • protocol 은 class만 지원하는 것이 아닌 value Type 도 함께 지원한다.
  • Protocol Oriented Programming은 Value Type인 struct, enum타입을 사용하도록 권장 하고 있다.

Object Oriented Programming

  • Object Oriented Programming 은 객체 지향 프로그래밍으로 상속을 통해 수직 구조로 확장하는 방식으로 다형성을 구현하는 방식을 의미한다.
  • Object Oriented ProgrammingOverloading, Overriding을 통해 다형성을 제공해준다.
  • Object Oriented ProgrammingSuperClassSubClass에 의존적이며 class 에게만 지원되기에 독립적이지 못하다.
  • SuperClass에 상속받은 모든 propertyMethod를 물려 받아야 하며, 상속에 제한이 있다.

📝 참고 사이트

@vichye-1
Copy link

프로토콜 지향 프로그래밍(Protocol Oriented Programming)

  • 프로토콜 중심의 프로그래밍으로서 확장을 통한 수평 구조로 타입을 확장하는 방식
  • 프로토콜에 정의된 인터페이스를 직접 구현하기 때문에 필요치 않은 프로퍼티나 메서드를 구현하지 않을 수 있다.
  • 각각의 사이가 독립적이고 참조나 값 타입 모두를 지원해주며, 합성을 통해 다수의 프로토콜을 가질 수 있다.

객체지향 프로그래밍(Object Oriented Programming)

  • 객체 중심 프로그래밍으로서 슈퍼클래스의 상속을 통하여 수직 구조로 타입을 확장하는 방식
  • 프로그램이 ‘객체’ 단위로 분할되며, ‘public/private/protected’와 같은 액세스 지정자가 존재함
  • 상속이 제공됨
  • 데이터를 공개하거나 비공개하도록 모드를 설정할 수 있어 데이터 보안에 좋다

POP가 유용한 경우

  • 상속과 달리 다수의 프로토콜을 따를 수 있다.
  • 다중 상속 시의 문제점(죽음의 다이아몬드 이슈)에서 자유롭다
  • 다중 프로토콜을 구현할 수 있다.
  • 프로토콜 규칙을 class, struct, enum에 적용할 수 있어 확장 부분에서 OOP보다 유연하다.
  • 기존 OOP의 슈퍼클래스와 서브클래스의 의존적인 관계와 달리, 프로토콜에 정의된 인터페이스만 구현하면 되고 이를 따르는 사이들끼리도 깊게 연관되어 있지 않아 서로 독립적이며 안전하다
  • 상위 클래스에 요소들을 억지로 넣지 않고, 필요한 프로토콜만 채택하여 다양한 구조로 구현이 가능하다

참고

@Hminchae
Copy link
Member

객체지향 프로그래밍(Object Oriented Programming)

개발하려는 것을 기능별로 묶어 모듈화, 하드웨어가 같은 기능을 중복으로 연산하지 않도록 하고, 모듈을 재활용 함으로써 하드웨어의 처리양을 줄임

특성

  • 캡슐화(Encapsulation) : 객체를 캡슐로 싸서 그 내부를 보호하고 볼 수 없게 하는 것
  • 상속(Inheritance) : 상위 개체의 속성이 하위 개체에 물려져, 하위 개체가 상위 개체의 속성을 모두 가지는 관계
  • 다형성(Polymorphism) : 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 구현되는 것, 같은 인터페이스로 여러 타입과 상호작용할 수 있는 개념. 코드의 재사용성을 올려주며, 보다 생산적이고 클린한 구조의 설계를 돕는다. OOP에서는 Subclassing, Overloading, Overriding을 통해 Polymorphism을 구현한다.

OOP 장점

  • 코드 재활용성 높음, 디버깅 쉬움

OOP 단점

  1. 슈퍼클래스에 너무 종속적임 : 서브클래스를 생성하기 위해서는 슈퍼클래스의 코드를 제대로 파악하고 있어야 하며, 생성자와 퍼블릭 함수가 어떻게 돌아가는지 알아야함. 슈퍼클래스를 그대로 상속받는 구조이기 때문에, 서브클래스는 자신에게 필요없는 변수나 함수를 무조건 물려받을 수 밖에 없음
  2. value Type을 사용할 수 없음 : Swift의 Class는 Reference Type(참조 타입)이다. 상속 구조를 사용하기 위해서는 Value Type(값 타입)으로 정의해도 무방한 모델들을 굳이 참조 타입으로 정의 해야함

프로토콜지향 프로그래밍(Protocol Oriented Programming)

프로토콜이란 특정 기능 수행에 적합한 메소드, 프로퍼티 등을 정의한 것. 작성된 프로토콜은 class나 struct, enum을 통해 구현됨. 프로토콜을 구현한다는 것은 프로토콜에 선언된 명세에 따라 실질적으로 프로퍼티에 값을 할당하여 선언하거나 메소드의 내용을 작성하는 것을 말함. 즉 POP는 프로토콜의 확장과 프로토콜 상속, 그리고 프로토콜 합성이라는 개념을 사용하여 프로토콜의 정의를 통하여 시스템을 설계함

특성

  • 다형성(Polymorphism) : POP에서는 프로토콜을 통해 Polymorphism을 구현한다. 프로토콜 확장등을 통해 공통코드(function 등)를 제공해줄 수 있다.

POP 장점

  1. OOP 단점 위 1,2번의 불편함을 해결함. 구현체 입장에서 알아야할 것은 "프로토콜이 요구하는 변수와 함수" 뿐이다. 슈퍼클래스와 서브클래스의 의존적인 관계와 달리, 프로토콜 기반의 구조에서는 프로토콜에 정의된 인터페이스가 무엇인지 알고, 그것만 구현하면 된다. 같은 프로토콜을 따르는(conforms to) 사이는 각각이 독립적이고 안전함
  2. 다수의 프로토콜을 따르는 것이 가능하다. 상속 구조에서는 오직 하나의 슈퍼클래스만 가질 수 있다. 그러나 프로토콜의 경우엔 다수의 프로토콜을 따를 수 있고 물려받는 구조가 아니기때문에 다중 상속으로 문제되는 죽음의 다이아몬드 이슈에도 자유로움

POP 단점

요약

프로토콜지향 프로그래밍 객체지향 프로그래밍
영문명 Protocol Oriented Programming Object Oriented Programming
장점 Super Class에 독립적이고 기능의 모듈화 가능. 값 타입 사용이 가능함. 불필요한 API를 제외하고 정의한 API만 가져올 수 있음. 상속을 이용한 코드의 재사용성
단점 다중상속 불가능하고 상위클래스의 메모리 구조를 따라갈 수 밖에 없음. 클래스(참조타입)에서만 사용 가능

참조

객체지향 프로그래밍과 프로토콜지향 프로그래밍 (feat. Swift)
프로토콜 지향 프로그래밍

@ronick-grammer
Copy link
Contributor

ronick-grammer commented Oct 1, 2023

Protocol Oriented Programming과 Object Oriented Programming

Object Oriented Programming(OOP)

객체지향 프로그래밍이라고 하며, 특정 사물과 관련된 데이터와 그에 따른 행동을 있는 그대로 실체화 시키는 형태의 프로그래밍이다. 객체는 하나 이상의 정보(데이터, 프로퍼티)와 하나 이상의 행동(메서드)으로 구성된다. 상속, 캡슐화, 다형성등의 기능을 구현할 수 있다.

  • 캡슐화: 외부에서 특정 프로퍼티나 메서드를 사용할 수 없도록 정보를 은닉하는 것을 말한다. 객체 내부에 private 접근 제한자 선언을 통해 구현할 수 있다.

  • 추상화: 개별적인 특성을 배제하고 공통적인 특성의 타입으로 나타낼 수 있는 객체지향의 특성이다. 하나의 객체가 여러 가지 타입을 가질 수 있다.

  • 다형성: 객체를 다양한 형태로 나타낼 수 있는 객체지향의 특성이라고 할 수 있다. 상속관계에 있는 자식 클래스가 부모 클래스의 메서드를 오버라이딩하거나 오버로딩 하여 다형성을 구현한다.

OOP 설계에 있어 중요한 점

객체지향이 제공하는 기능을 어떻게 잘 사용할 것인지에 대한 척도는 응집도와 결합도로 나타낼 수 있다. 높은 응집도와 낮은 결합도가 좋은 객체지향의 설계이며, 이를 위해 위해 SOLID 원칙을 준수하는 것이 중요하다.

  • 응집도: 모듈에 포함된 내부 요소들이 연관돼 있는 정도를 나타낸다. 모듈 내의 요소들이 하나의 목적을 위해 긴밀하게 협력한다면 그 모듈은 높은 응집도를 갖는다고 할 수 있다. 객체지향 관점에서는 얼마나 관련 있는 책임들을 할당했는지를 나타낸다. 모든 메서드들에 대하여 프로퍼티 사용 비율이 높다면 응집도가 높다고 할 수 있으며, 메서드와 변수가 서로 의존하며 논리적인 단위로 묶인다는 의미이다.

  • 결합도: 의존성의 정도를 나타내며 다른 모듈에 대해 얼마나 많은 정보를 가지고 있는지를 나타내는 척도이다. 어떤 모듈이 다른 모듈에 대해 자세히 알고 있다면 두 모듈은 높은 결합도를 가지고, 반대로 꼭 필요한 정보에 대해서만 알고 있다면 낮은 결합도를 가진다. 객체지향 관점에서 결합도는 객체 또는 클래스가 협력에 필요한 적절한 수준의 관계만을 유지하고 있는지를 나타낸다.

  • SOLID (자세한 각 원칙에 대한 설명은 생략합니다)

    • Single Responsibility Principle : 단일 책임 원칙이며, 하나의 모듈은 단 하나의 책임을 가져야 한다는 원칙이다.
    • Open, Close Principle : 개방, 패쇄 원칙이며, 모듈에 대해서 기능의 확장에는 열려있고, 변경에는 닫혀 있어야 한다는 원칙이다.
    • Liskov Substitution Principle : 리스코프 치환 원칙이며, 상속관계에 있어서 자식 클래스는 부모 클래스의 기능을 완벽히 수행할 수 있어야 한다는 원칙이다.
    • Interface Segregation Principle : 인터페이스 분리 원칙이며, 인터페이스를 각 모듈의 사용에 맞게 분리해야 한다는 원칙이다.
    • Dependency Inversion Principle : 의존성 역전 원칙이며, 어떤 모듈이 다른 모듈을 참조할때 구현체가 아닌 추상화를 참조하도록 하라는 원칙이다.

Protocol Oriented Programming(POP)

POP는 위에서 언급한 OOP의 추상화, 다형성등의 기능 구현과, 이를 잘 설계하기 위한 SOLID 원칙을 준수하는 등 전반적으로 OOP의 개념을 따르지만, 참조 타입인 class보다 값 타입인 structenum을 더 효율적으로 사용해서 오류의 최소화와 참조로부터의 자요로움을 추구하는 프로그래밍 패러다임이다.

OOP와 POP는 추상화와 다형성을 구현하는 것이 중요한데, OOP는 상속과 인터페이스를 통해서, POP는 프로토콜(protocol)을 통해서 이들을 구현하는 것이 핵심이다. 특징은 아래와 같다.

  • 코드의 중복을 최소화 한다.
  • 상속과 달리 필요한 것만 골라서 사용할수 있으며 참조추적 비용이 없어 가볍다
  • 값 타입도 상속처럼 공통된 기능을 쉽게 구현할 수 있다
  • Class 는 하나의 상속만 가능하고 수직적인 구조이지만 Protocol을 사용하면 수평적인 확장이 가능해진다
  • generic을 활용하여 자료형에 구애받지 않는 범용 코드를 작성할 수 있다.

📝 참고 사이트

--

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Swift Swift CS 개념 공부
Projects
None yet
Development

No branches or pull requests

4 participants