으니의 개발로그

[Swift] Swift로 알아보는 객체지향 프로그래밍과 함수형 프로그래밍 본문

Swift/책 정리

[Swift] Swift로 알아보는 객체지향 프로그래밍과 함수형 프로그래밍

아잉으니야 2021. 1. 1. 21:21

Swift로 알아보는 객체지향 프로그래밍과 함수형 프로그래밍

이 글은 Swift 프로그래밍 책과 위키백과를 읽고 요약한 내용입니다.

 

객체지향

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

https://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

객체 지향 프로그래밍 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목

ko.wikipedia.org

객체 지향 프로그래밍 : 컴퓨터 프로그램을 명령어의 목록으로 보는 기존의 명령형 프로그래밍 패러다임의 시각에서 벗어나 여러 개의 독립된 단위, 즉 '객체'들의 모임으로 파악하고자 하는 것이다. 각각의 개체는 메시지를 주고받고, 데이터를 처리할 수 있다.

장점

  • 프로그램을 유연하고 쉽게 변경할 수 있도록 작성할 수 있기에 대규모 소프트웨어 개발에 많이 사용
  • 프로그래밍을 더 쉽게 배울 수 있음
  • 소프트웨어 개발과 유지보수를 간편하게 함
  • 직관적으로 코드를 분석할 수 있음
  • 클래스에 하나의 문제 해결을 위한 데이터와 메서드를 모아놓은 방식으로 응집력을 강화하고, 클래스간에 독립적으로 디자인해 결합력을 약하게 할 수 있음

단점

  • 지나친 프로그램의 객체화 경향 때문에 오히려 실제 세계를 그대로 반영하지 못한다는 비판을 받기도 함

특징

  • 자료 추상화 : 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 것
  • 상속 : 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능 (다중 상속 : 클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능)
  • 다형성 : 어떤 한 요소에 여러 개념을 넣어 놓는 것으로 일반적으로 오버라이딩(같은 이름의 메소드가 각각의 클래스에서 다른 기능을 하는 것)이나 오버로드(같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것)을 의미
  • 동적 바인딩 : 실행 시간 중에 일어나거나 실행 과정에서 변경될 수 있는 바인딩으로 컴파일 시간에 완료되어 변화하지 않는 정적 바인딩과 대비되는 개념

차용 언어

  • Smalltalk, Objective-C, C++, C#, Java, Python, Ruby, Swift 등

 

기본 구성 요소

  • 클래스(Class) : 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성과 행위를 정의한 것으로 객체지향 프로그램의 기본 사용자 정의 데이터 타입이라고 할 수 있다. 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인하여야 한다.
  • 객체(Object) : 클래스의 인스턴스(실제로 메모리에 할당된 것)이다. 객체는 자신 고유의 속성을 가지며 클래스에서 정의한 행위를 할 수 있다.
  • 메서드(Method) 또는 메시지(Message) : 클래스로부터 생성된 객체를 사용하는 방법으로서 객체에 명령을 내리는 메시지라고 할 수 있다. 객체 간의 통신은 메시지를 통해 이루어진다.

 

스위프트에서 객체지향 프로그래밍을 사용

class SomeClass {
  var someProperty: Any = 1
  func someMethod() {
    // some task...
  }
}

let myInstance: SomeClass = SomeClass()
// SomeClass라는 이름의 클래스의 이니셜라이저를 호출하여
// myInstance라는 이름의 상수에 할당한다.
// 클래스의 이니셜라이저를 통해 메모리에 할당되고 초기화한 객체를 인스턴스라고 부른다.

myInstance.someProperty = 100 // 인스턴스의 프로퍼티에 값을 할당할 수도 있고
print(myInstance.someProperty) // 값을 가져올 수도 있다.

myInstance.someMethod() // 인스턴스의 메서드를 호출하여 작업을 수행하도록 할 수 있다.

 

함수형

함수형 프로그래밍

https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98%ED%98%95_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

함수형 프로그래밍 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 함수형 프로그래밍(functional programming)은 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 명령

ko.wikipedia.org

함수형 프로그래밍(functional programming) : 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임

장점

  • 대규모 병렬처리가 굉장히 쉽다

특징

  • 함수의 응용을 강조
  • 함수형 코드에서는 함수의 출력값은 그 함수에 입력된 인수에만 의존하므로 인수 x에 같은 값을 넣고 함수 f를 호출하면 항상 f(x)라는 결과가 나옴

 

명령형 프로그래밍과 함수형 프로그래밍의 비교

// doSomething 함수와 doAnotherThing 함수를 모두 처리하고 싶은 경우

// 명령형 프로그래밍
func doSomething() {
  print("do something")
}

func doAnotherThing() {
  print("do another thing")
}

func excuteAll() {
  doSomething()
  doAnotherThing()
}

excuteAll()

// 함수형 프로그래밍
func doSomething() {
  print("do something")
}

func doAnotherThing() {
  print("do another thing")
}

func excute(tasks: [() -> Void]) {
  for task in tasks {
    task()
  }
}

excute(tasks: [doSomething, doAnotherThing])


// 두 수의 합을 구하고 싶은 경우

// 명령형 프로그래밍
func sum(first: Int, second: Int) -> Int {
  return first + second
}

sum(first: 10, second: 5)

// 함수형 프로그래밍
func sum(first: Int) -> ((Int) -> Int) {
  return { second in first + second }
}

sum(first: 10)(5)