OOP 와 POP

OOP – Object Oriented Programming
객체 지향 프로그래밍

어플리케이션을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍 하는 것을 말합니다.
코드의 재사용성과 중복제거가 가장 큰 목적입니다.

OOP 특징

추상화(Abstraction)

추상화란? 객체들의 공통적인 부분을 뽑아내서 구현하는것을 의미합니다.

캡슐화(Encapsulation)

객체의 프로퍼티 및 메서드를 외부에 노출하지 않고 감춘다는 의미 입니다.

상속성 (EInheritance)

하나의 클래스의 특징(부모 클래스)을 다른 클래스가 물려받아 그 속성과 기능을 동일하게 사용하는 것을 말합니다. 재사용성과 확장에 의미가 있습니다.(상속은 수직확장이며 익스텐션은 수평 확장입니다.)

다형성(Polymorphism)

동일한 요청에 대해 각각 다른 방식으로 응답 할 수 있도록 만드는 것을 말 합니다. 다향성의 방법으로는 오버라이딩(Overriding), 오버로딩(Overloading) 이 있습니다.

오버로딩(overloading)

오버로딩이란 같은 이름의 메소드에 매개변수, 반환타입을 다르게 선언 할 수 있는 것을 의미합니다.

class Student {
    var name: String
    var age: Int?
    init(name: String, age: Int?) {
        self.name = name
        self.age = age
    }
    func printInfo(){
        print("my name is \(name)")
    }
    func printInfo(age: Int){
        print("my name is \(name) my age is \(age)")
    }
}

위의 코드에서 이름은 필수지만 나이는 옵션입니다. 이 때 정보 출력 함수의 경우 이름만 있을 경우와 이름과 나이가 있는경우에 다른 결과가 출력 되어야 하기 때문에 오버로딩을 통해 다른 결과를 출력했다.

오버라이딩(overriding)

상위 클래스에서 선언한 메서드를 하위 클래스에서 재정의해서 사용하는 것.

class middleSchoolStudent: Student {
    override func printInfo(age: Int) {
        print("my name is \(name) and I'm middleschool student")
    }
}

override라는 키워드를 메서드 앞에 붙여 사용합니다. 매개변수의 이름, 타입, 리턴타입까지 모두 맞춰 주어야 합니다.

장점

  • 강한 응집력과 약한 커플링
  • 프로그램을 유연하고 변경이 용이하게 만든다.
  • 프로그램의 개발 보수를 간편하게 만든다.
  • 직관적인 코드 분석을 가능하게 한다.

단점

  • 암시적 공유 : 의도하지 않았는데, 상속했다는 이유로 모든 속성과 행위를 공유한다.
  • 단일체 : 단 하나의 부모만 존재한다. 추가적인 기능 구현으로 클래스의 덩치가 무한대로 커질 수 있다.
  • 클래스 타입 관계 문제 : 복잡한 상속 구조를 지닌 클래스 참조 또는 연산을 수행할 때 임의 클래스의 올바른 타입을 얻기 위해 down-cast 해야 한다.

프로토콜 지향 프로그래밍 
POP – Protocol Oriented Programming

객체지향 프로그래밍 언어들은 대부분 클래스 상속을 사용해 타입에 공통된 기능을 구현합니다.

그런데 Swift는 class 뿐만 아니라 구조체, 열거형과 같은 값 타입도 클래스 만큼 자주 사용합니다.(권장하고 있죠.) 이러한 값 타입은 상속을 받을 수 없습니다.

그렇기 때문에, struct, enum과 같은 값 타입에 프로토콜을 사용하면 상속을 사용하는 것과 같은 효과를 누릴 수 있습니다.

프로토콜 초기 구현

만약 특정 프로토콜을 정의하고 여러 타입에서 이 프로토콜을 준수하게 만들어서 타입마다 똑같은 메서드, 똑같은 프로퍼티, 똑같은 서브스크립트 등을 구현해야 한다면,  많은 코드를 중복 사용해야 하며 또 유지보수는 얼마나 힘들어질지 생각만 해도 머리가 아플 겁니다.

이때 필요한게 바로 익스텐션과 프로토콜의 결합입니다. 
프로토콜을 채택한 타입의 정의부에 프로토콜의 요구사항을 구현하지 않더라도 익스텐션에 미리 프로토콜의 요구사항을 구현해 둘 수 있습니다. 이를 프로토콜 초기구현이라고 합니다. 

프로토콜 지향 프로그래밍을 사용하는 이유

  • 구조체, 클래스, 열거형 등 구조화된 타입 중에 상속은 클래스 타입에서만 가능합니다.
  • 클래스는 참조 타입이므로 참조 추적에 비용이 많이 발생합니다.
    비교적 비용이 적은 값 타입을 활용하고 싶어도, 상속을 할 수 없으므로 때마다 기능을 다시 구현해 주어야 했지만, 프로토콜 지향 프로그래밍은 그 한계를 없앴습니다.
  • 기능의 모듈화가 더욱 명확해 집니다.
  • 클래스가 상속을 할 수 있도록 설계되어 있다고 하더라도 다중상속을 지원하는 언어는 많지 않습니다. 다중상속을 지원하지 않는다는 뜻은 하나의 상속체계에서 다른 상속체계에 속해있는 기능을 끌어다 쓸 수 없다는 뜻입니다.
  • 그런데 프로토콜 지향 프로그래밍은 기능을 프로토콜이라는 단위로 묶어 표현하고 초기 구현을 해 둘 수 있으니 상속이라는 한계점을 탈피할 수 있습니다.

함수형 프로그래밍이란?

말 뜻을 그대로 이해하면 함수를 사용한 프로그래밍이라고 할 수 있습니다. 함수를 사용하면 어떤 장점이 있는지 우리는 이미 알고 있습니다.

함수형 프로그래밍은 자료처리를 수학적 함수의 계산으로 취급 상태(State) 와 가변 데이터를 지양하는 프로그래밍”

함수형 프로그래밍의 사전적 정의는 이렇습니다.

Swift 의 함수형 프로그래밍의 특징

  1. 고차 함수(Higher-order function)
  • 함수를 다른 함수의 매개변수로 전달 및 반환 할 수 있습니다.

ex) filter 함수는 isEven 함수를 매개변수로 전달 받고 있습니다.

  1. 일등 함수(First-class function)

-함수를 변수처럼 취급 할 수 있습니다. 함수를 변수에 대입하고 마찬가지로 다른 함수의 파라미터로 전달 할 수 있습니다.

  1. 클로저(Closures)
  • 익명함수

ex) filter { } 형태의 구문 

에 발행했습니다
SWIFT(으)로 분류되었습니다

aaron님이 작성

아무것도 안해도 시간은 흐른다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다