개발자 99% 커뮤니티에서 수다 떨어요!
연습문제2. 객체 지향 언어와 함수형 언어의 직교성은 어떻게 다를까? 이런 차이가 언어 자체에 내재된 것일까 아니면 사람들이 언어를 사용하는 방법이 다른 것일까
풀이과정 :
1. 직교성 : 하나가 바뀌어도 나머지에 어떤 영향도 주지 않는 것.
2. 객체지향형 언어
- 프로그램을 다수의 "객체"를 만들고 아들이 서로 상호작용을 통해 만들어지는 방식
- 다형성을 기대하는 것이 객체지향의 핵심
- 객체지향언어 : 자바, 파이썬, 자바스크립트, C++, 시뮬라, 스몰토크, 오브젝티브,루비
1) 객체지향형 언어의 특징
- 캡슐화, 상속, 다형성, 추상화,
- 다형성
- 다형성은 강하게 비결합된(Strongly decoupled) 시스템을 만들어주기 때문에 바람직.
- 설계된 구조의 경계 사이에서 종속성이 역전될 수 있게끔 해주기 때문.
- 그렇게 되면 모킹이나 가짜 객체들을 사용해 테스트가 가능해짐.
- 그리고 다른 모듈들에 영향을 주지 않으면서도 수정될 수 있게 됨.
- 유지보수와 개발이 편한 시스템이 되는 것.
2) 객체지향형 언어의 장점
- 재사용성, 생산성 향상, 자연적인 모델링, 유지보수의 우수성
3) 객체지향형 언어와 직교성
- 다중 상송, 예외, 연산자 오버로딩, 상속을 이용한 부모 메서드 오버라이딩 등으로 직교성이 낮아질 위험이 있음.
- 함수 호출의 다형성을 사용할 때, 호출자의 소스코드가 피호출자의 소스코드에 의존하지 않도록 주의.
- 다형성 메커니즘은 반드시 호출자(Caller)에서 피호출자(Callee)로 소스코드 종속성을 만들어내서는 안된다.
- 함수를 다형적으로 호출하는 소스파일은 그 함수의 구현을 가진 소스파일을 참조해서는 안된다.
3. 함수형 언어
- 순수 함수를 작성하는 것. 숨겨진 입력이나 출력을 최대한 제거하여 가등한 코드의 대부분이 단지 입력과 출력의 관계를 기술하게끔 하는 것.
- 함수형 프로그래밍에서는 같은 인풋에 있어서 항상 동일한 아웃풋을 냄. 이런 성질은 참조 투명성이라고도 불림.
- 클로저, 하스켈, 펄 등.
1) 함수형 프로그래밍의 특징 및 핵심 개념
- 순수함수
- 참조 투명성 : 같은 입력값이라면 항상 같은 결과 값을 반환한다.
- 참조 투명성은 시스템을 예상 가능하게 만들어주기 때문에 바람직.
- 내부 상태를 바꿀 수 없다는 성질은 시스템을 이해하기 쉽고, 개발하기 쉽게 만듦.
- 스레드 경쟁상태 같은 동시성 관련 문제도 현저히 줄여줌.
- side-dffects를 가지지 않는다.
- 합성 함수
- 새로운 함수를 생성하거나 어떤 계산을 수행하기 위해 둘 이상의 함수를 결합하는 프로세스.
- 상태 공유
- 공유되는 스코프 안에 존재하는 모든 변수, 객체, 메모리 공간이거나 스코프 간에 전달되는 객체의 속성.
- 불변성
- 생성된 이후 바꿀 수 없는 객체
- 이름 붙은 값은 절대 바뀔 수 없음. 즉, 대입 연산이 존재할 수 없음
- side-effect
- 반환 값 이외에, 호출 된 함수 밖에서 관찰할 수 있는 어플리케이션의 상태변경.
- 상위 함수를 통한 재사용성
- 컨테이너, functor, 리스트 그리고 스트림
- 선언적, 명령적
2) 함수형 언어와 직교성
- 데이터를 변환 시, 한 함수의 결과가 다른 함수의 입력이 될 수 있음. 이때 주의하지 않으면 함수가 생성하는 데이터 포맷을 바꾸는 바람에 그 이후로 이어지는 변환 어딘가를 망가트릴 수 있음.
- 좋은 타입 체계를 갖춘 언어를 사용하면 어느정도 이런 문제를 예방할 수 있음.
3) 함수형 언어와 재귀
- 이런 성질에 대해 생각하다보면 참조 투명한 함수들만으로 이루어진 프로그램은 결국 아무 것도 할 수 없다는 결론에 이르게 됨. 시스템의 유용한 기능들은 항상 무언가의 상태를 바꾸기 때문. 프린터나 모니터의 상태같은 것.
- 하지만 하드웨어와 외부의 모든 요소들을 제외하고 나면, 사실 이런 성질로 아주 유용한 시스템을 만들 수 있게 됨
- 비결은 재귀.
- 예를 들어 state 라는 구조체를 인자로 받는 함수가 있음. 이 구조체는 함수에서 사용하는 모든 상태 정보를 가짐. 함수가 끝날 때 업데이트된 값들로 새로운 state 구조체를 만들고, 그것을 인자로 자기자신을 호출.
- 이것이 함수형 프로그램이 내부 상태를 실제로는 변경하지 않으면서도, 내부 상태 변경을 구현하는 방법 중의 한 가지.