절차지향 / 객체지향 / 함수형 프로그래밍이란 무엇이고 차이점은 무엇인가?
=> 절차 지향 프로그래밍(Procedural Programming)
- 순차적인 처리를 중요시 여기며, 프로그램 전체가 유기적으로 연결되도록 만드는 프로그래밍 기법
- 장점
- 코드의 가독성이 좋다.
- 코드를 단위화 할 수 있다.
- 컴퓨터의 처리구조와 비슷해 실행 속도가 빠르다.
- 단점
- 각각의 코드가 순서에 따라 실행되어, 변경, 유지보수 및 분석이 어렵다.
- 변수나 상수 등의 값들을 관리하는 자료형 과 해당 자료형을 사용하는 함수가 분리되어 사용된다.
- 절차지향 프로그래밍 언어 : C
=> 객체지향 프로그래밍(Object Oriented Programming)
- 모든 데이터를 객체(Object)로 취급하여, 객체가 처리 요청을 받았을 때, 객체 내부에 있는 기능을 가져와 사용해 처리하는 기법
- 모든 객체가 내부의 자료형(Field)와 함수(Method)로 구성된 프로그래밍 구조를 의미.
- 장점
- 코드의 재사용이 가능하다.(유지보수에 좋다)
- 분석과 설계의 전환이 쉽다.
- 단점
- 처리 속도가 상대적으로 느리다.
- 설계에 많은 시간이 소요된다.
- 4가지 특정
- 추상화 : 공통된 속성에만 중점을 두어 모델화
- 캡슐화 : 데이터와 함수를 하나로 묶는 것
- 상속성 : 상위 부모 객체의 속성과 특징을 하위 객체가 물려받는 것
- 다형성 : 같은 함수가 있어도 매개변수에 따라 각자 다른 일을 하는 것
- 객체지향 프로그래밍 언어 : Java, Python
=> 함수형 프로그래밍(Functional Programming)
- 순수 함수를 사용해, 상테를 제어하기보단, 빠르게 처리하는데 초점을 둔 방법.
- 실행 순서를 지정할 필요가 없어 비절차형 언어라고도 한다.
- 장점
- 코드에서 프로그램의 실행에 영향을 미치는 영역과 순수한 영역을 최대한 분리한다.
- 코드의 가독성이 높아지고, 유지보수가 좋아진다.
- 테스트가 쉬워진다.
- 단점
- 외부 데이터 혹은 내부 데이터의 상태를 조작할 수 없다.
- 함수형 프로그래밍 언어 : Haskell, OCamal 등
순수함수
동일한 입력값을 넣으면 항상 동일한 리턴 값을 반환하는 함수.
외부에 영향을 받지 않는다.
프로그램의 실행에 영향을 미치지 않는다.
멀티스레드에서 함수형 프로그래밍
No Mutual State
- 서로 공유하는 자원이 없다는 것이 병렬 처리에서 큰 이점
- 공유자원으로 인한 레이스 컨디션, 데드락 문제가 자연스럽게 해결
- 객체지향이어도 공유 자원이 없다면 똑같이 스레드에서 안전
자바에서 함수형 프로그래밍
알고리즘에서 ‘시간복잡도‘와 ‘공간복잡도’란 무엇인가? 그리고 이것들은 왜 중요한가?
=> 시간 복잡도는 특정 알고리즘이 어떤 문제를 해결하는데 걸리는 시간을 의미한다.
같은 결과를 갖는 프로그래밍 소스도 작성 방법에 따라 걸리는 시간이 달라지며, 같은 결과를 같는 소스라면 시간이 적게 걸리는 것이 좋은 소스다.
시간 복잡도에는 빅-오 표기법이라는 개념이 있다.
예를 들어, 동전을 튕겨 뒷면이 나올 확률을 이야기 할 때 운이 좋으면 1번에 뒷면이 나오지만 운이 안 좋다면 n번 만큼 동전을 튕겨야 하는 경우가 발생한다.
이 최악의 경우를 계산하는 방식을 빅-오(Big-O) 표기법이라 한다.
=> 공간 복잡도란 작성한 프로그램이 얼마나 많은 공간(메모리)을 차지하느냐를 분석하는 방법이다.
알고리즘을 실행시키기 위해 필요한 공간(space)는 두 가지로 나눌 수 있다.
- 알고리즘과 무관한 공간, 즉 고정 공간
- 코드가 저장되는 공간, 알고리즘 실행을 위해 시스템이 필요로 하는 공간 등
- 알고리즘과 밀접한 공간, 즉 가변 공간
- 문제를 해결하기 위해 알고리즘이 필요로 하는 공간. 변수를 저장하는 공간, 순환 프로그램일 경우 순환 스택(recursion stack) 등