본문 바로가기
iOS/iOS

OOP, FP

by 황민우 2022. 4. 5.

서론

면접 질문 중 "OOPFP에 대해서 알고 있는지?"라는 질문을 한다고 합니다.

갑자기 들으면 당황스럽고 생소하게 느껴지지만,

OOPObject-Oriented Programming의 약자로 객체 지향 프로그래밍이며

FPFunctional Programming의 약자인 함수형 프로그래밍에 대해서 묻는 것입니다.


객체 지향 프로그래밍 [OOP]

▪ 정의

- 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체(Object)를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.

 

대표적인 언어

- C++

- C#

- Java

- Swift

- Python

- Objective-C

 

객체지향 5원칙(SOLID)

- SOLID란 로버트마틴이 2000년대 초에 명명한 객체 지향 프로그래밍의 다섯 가지 기본 원칙을 마이클 페더스가 원칙의 앞글자를 따서 SOLID라고 지칭한 것입니다.

 

1, 단일 책임 원칙 : SRP(Single Responsibillity Principle)

= 하나의 클래스는 하나의 기능만 가질 수 있다.

(=모든 클래스는 각각 하나의 기능만 가진다.)

 

2, 개방 폐쇄의 원칙 : OCP(Open Close Principle)

= 소프트웨어의 모든 구성요소(클래스, 모듈, 함수)는 확장에는 개방적이고, 변경에는 폐쇄적이 여야 한다.

(=요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 않아야 하며 쉽게 확장이 가능하여 재사용할 수 있어야 한다는 뜻입니다.)

 

3, 리스 코브 치환의 원칙 : LSP(Liskov's Substitution Principle)

= 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.

(= 부모 클래스를 상속한 자식 클래스는 부모 클래스의 역할을 정확히 수행해내야 한다는 뜻입니다.)

 

4, 인터페이스 분리의 원칙 : ISP(Interface Segregation Principle)

= 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.

(= 하나의 큰 인터페이스를 상속받기보다 구체적이고 작은 단위로 분리시켜 꼭 필요한 인터페이스만 상속하자는 뜻입니다. )

 

5, 의존성 역전의 원칙 : DIP (Dependency Inversion Principle)

= 추상화에 의존한다. 구체화에 의존하면 안 된다.

(= 인터페이스를 적극적으로 활용하라는 뜻입니다.)

 

 

 

객체지향의 4가지 특징

 

1, 캡슐화

- 객체의 속성과 행위를 하나로 묶는다.

- 실제 구현 내용 일부를 내부에 은닉한다. 

- 코드를 재수정 없이 재활용할 수 있다.

 

2, 상속

- 자식 클래스가 부모 클래스의 특성과 기능을 물려받는다.

- 상속받은 자식 클래스에서 필요한 기능을 재정의하여 사용할 수 있다.

 

3, 추상화

- 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.

- 인터페이스로 클래스들의 공통적인 특성(변수, 메서드)들을 묶어 표현하는 것이다.

 

4, 다형성

- 어떤 변수, 메서드가 상황에 따라 다른 결괏값을 나타내는 것이다.

- 오버 라이딩(Overriding) : 부모 클래스의 메서드와 같은 이름, 매개변수를 재정의하는 것

- 오버 로딩(Overloading) : 같은 이름의 함수를 여러 개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수마다 다르게 호출하는 것

 

 객체지향 언어의 장단점

장점

- 재사용성 : 상속을 통해 프로그래밍의 재사용이 용이합니다.

- 생산성 향상 : 잘 설계된 클래스를 만들어 독립적인 객체로 사용하므로 개발의 생산성이 향상됩니다.

- 자연적인 모델링 : 일상생활의 모습 구조가 녹아있어 생각한 것을 자연스럽게 구현할 수 있습니다.

- 유지보수의 우수성 : 캡슐화로 인해 유지보수가 쉽고 효과적입니다.

단점

- 느린 개발 속도 : 객체가 처리하려는 것에 대한 정확한 이해가 필요해 설계단계부터 많은 시간이 소모됩니다.

- 느린 실행 속도 : 대체적으로 실행 속도가 느립니다. 

- 코딩 난이도의 상승 : 다중 상속과 같은 기능으로 코딩이 복잡해질 수 있습니다.


함수형 프로그래밍 [FP]

▪ 정의

- 컴퓨터 프로그래밍 패러다임의 하나로, 일련의 코딩 접근 방식이며 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임입니다.

 

대표적인 언어

- Clojure

- Scala

- Haskell

함수형 프로그래밍 문법이 포함된 언어

- JavaScript

- Kotilin

- Python

 

함수형 프로그래밍의 특징

1, 순수 함수(Pure function)

- 동일한 입력에는 항상 같은 값을 반환해야 하는 함수

- 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수

- 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 부수효과(Side Effect)가 없는 것

 

2, 비 상태, 불변성(Stateless, Immutability)

- 한수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.

- 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 해당 데이터의 복사본을 만들어서 그 일부를 변경하고 변경한 복사본을 사용해 작업을 진행한다.

 

3, 선언형 함수(Expressions)

- 명령형 프로그래밍은 무엇을 어떻게 할 것인가에 주목하고, 선언형 프로그래밍은 무엇을 할 것인가에 주목한다.

let numbers = [1, 2, 3];

function multiply(numbers, multiplier) {
    for (let i = 0; i < numbers.length; i++) {
        numbers[i] = numbes[i] * multiplier;
    }
}

- 위의 코드는 for문을 사용해 배열의 각 요소에 multiplier 곱해주는 명령형 프로그래밍입니다.

- 함수형 프로그래밍에서는 마찬가지로 if, switch, for, 등, 명령문을 사용하지 않고 함수형 코드를 사용해야 합니다.

// 선언형 프로그래밍
function multiply(number, multiplier) {
    return number.map((num) => num * multiplier);
}

 

4, 1급 객체와 고차 함수(First-Class, Higher-order functions)

- 함수형 프로그래밍에서 1급 객체의 특징은 다음과 같습니다.

  • 변수나 데이터 구조안에 담을 수 있다.
  • 파라미터로 전달할 수 있다.
  • 반환 값(return value)으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
  • 동적으로 프로퍼티 할당이 가능하다.

- 또한, 고차 함수의 속성을 가져야 하는데, 고차함수의 특징은 다음과 같습니다.

  • 함수를 인자로써 전달할 수 있어야 한다.
  • 함수의 반환 값으로 또 다른 함수를 사용할 수 있다.

 

함수형 프로그래밍의 장단점

장점

- 높은 수준의 추상화를 제공

- 함수 단위의 코드 재사용이 수월하다.

- 불변성을 지향하기 때문에 프로그램의 동작을 예측하기가 쉽다.

단점

- 순수 함수를 구현하기 위해서 코드의 가독성이 떨어진다.

- 함수형 프로그래밍에서 반복이 for문이 아닌 재귀를 통해 이루어지는데, 재귀적 코드 스타일은 무한 루프에 빠질 수 있다.

- 순수 함수를 사용하는 것은 쉬울 수 있지만, 조합하는 것은 쉽지 않다.


내용 출처

https://velog.io/@ygh7687/OOP%EC%9D%98-5%EC%9B%90%EC%B9%99%EA%B3%BC-4%EA%B0%80%EC%A7%80-%ED%8A%B9%EC%84%B1

 

📚OOP의 5원칙과 4가지 특성

Object-Oriented Programming 의 줄임말객체 지향 프로그래밍 방식입력을 받아 명시된 순서대로만 처리하고 결과를 내는 방식절차적 프로그래밍 방식의 개선된 형태프로그램을 함수단위로 나누고 함수

velog.io

https://jeong-pro.tistory.com/95

 

객체 지향 프로그래밍이 뭔가요? (꼬리에 꼬리를 무는 질문 1순위, 그놈의 OOP)

객체 지향 프로그래밍(Object Oriented Programming) 여러 소프트웨어 관련 IT기업 신입사원 기술면접에서 면접자들 긴장을 풀어줄 겸 워밍업으로 자주 나오는 질문이다. "객체 지향 프로그래밍에 대해

jeong-pro.tistory.com

https://jaeyeong951.medium.com/%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-5%EC%9B%90%EC%B9%99-solid-ac7d4d660f4d

 

객체지향 5원칙 : SOLID

디자인 패턴에 대해 공부하던 중 예전 소프트웨어 공학 때 배운 객체지향 5원칙(SOLID)에 대해 다시 정리해보기로 했습니다.

jaeyeong951.medium.com

https://jongminfire.dev/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4%EB%9E%80

 

함수형 프로그래밍이란?

jongminfire.dev

https://mangkyu.tistory.com/111

 

[프로그래밍] 함수형 프로그래밍(Functional Programming) 이란?

1. 함수형 프로그래밍(Functional Programming)에 대한 이해 [ 프로그래밍 패러다임(Programming Paradigm) ] 프로그래밍 패러다임(Programming Paradigm)은 프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를..

mangkyu.tistory.com

https://velog.io/@thms200/%ED%95%A8%EC%88%98%ED%98%95-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

 

함수형 프로그래밍

함수형 프로그래밍이란 무엇을까? 정의 함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고, 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다. 문이 아닌 식이

velog.io

 

댓글