서론
면접 질문 중 "OOP와 FP에 대해서 알고 있는지?"라는 질문을 한다고 합니다.
갑자기 들으면 당황스럽고 생소하게 느껴지지만,
OOP는 Object-Oriented Programming의 약자로 객체 지향 프로그래밍이며
FP는 Functional 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://jeong-pro.tistory.com/95
https://mangkyu.tistory.com/111
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
'iOS > iOS' 카테고리의 다른 글
Class의 성능을 향상 시킬 수 있는 방법들을 나열해보시오. (0) | 2022.04.07 |
---|---|
NotificationCenter 동작 방식과 활용 방안 (0) | 2022.04.06 |
멀티 스레드(Multi Thread) 구현 시, 고려할 수 있는 방식 (0) | 2022.04.01 |
String은 왜 subscript로 접근이 안되는가? (0) | 2022.03.30 |
Main Thread (0) | 2022.03.29 |
댓글