// post
객체지향 프로그래밍이란? / 함수형 프로그래밍이란?
2022년 12월 7일
객체지향 프로그래밍이란? 객체지향 프로그래밍은 프로그램을 개발하기위한 방법론 중 하나이다. 개발해야할 프로그램이 복잡해지고 규모가 커졌는데 단순한 변경에도 전체 로직에 영향이 가는 문제등을 어떻게 해결할지에 대한 대안으로 나온 방법
객체지향 프로그래밍이란?
객체지향 프로그래밍은 프로그램을 개발하기위한 방법론 중 하나이다.
개발해야할 프로그램이 복잡해지고 규모가 커졌는데 단순한 변경에도 전체 로직에 영향이 가는 문제등을 어떻게
해결할지에 대한 대안으로 나온 방법론.
객체지향 프로그래밍은 공장에서 제품을 생산하는 공정과 닮았다.
자동차를 생산하는 일련의 과정을 객체지향적인 방법론으로 생각해 보면
자동차 설계도는 클래스
자동차 완성품은 객체라고 생각하면 된다.
자동차라는 객체를 부품화하여
엔진 ,바퀴, 핸들, 연료통 등으로 세분화 할 수 있고 각각을 독립된 객체로서 부품화 시키면
차후에 특정 부품에 결함이 생겼을때 자동차 전체를 고치거나 폐차시키고 새로 사는 것이 아니라
그 부품의 문제만 찾아 해결하면 된다.
또한 이미 설계된 것을 활용하여 자동차를 대량 생산하듯이 재사용성의 장점이 있다.
자동차 종류별로 확장하여 일반 승용차, 트럭, 버스, 경차등 확장된 형태의 생산이 필요할 경우에도
객체지향은 상속과 인터페이스 다형성과 같은 기법을 활용하여 추상화 시키고 차량의 성격에 맞게
기능을 구체화할 수 있다. (메소드 오버로딩/오버라이딩/ 디자인패턴 등)
객체지향 프로그래밍은 이처럼 우리 일상에서 보는 사물의 구조와 모습과 많이 닮은 형태로 개발하는 방법론으로서
현재까지도 각광받고 있다.
함수형 프로그래밍 이란?
함수형 프로그래밍은 1958년 LISP라는 언어를 통해서 처음 나왔다. (참고로 C언어가 1972에 나옴... )
역사적으로 굉장히 오래되었지만 대중적으로 잘 사용하지 않다가 최근들어서야 부각되기 시작했다. 그 이유는
AI, IOT, 빅데이터, 블록체인(비트코인)이 뜨기 시작했기 때문이다.
이것은 방대한 데이터를 최대한 빠르게 계산하고
병렬적으로 프로세스가 동작할때 문제없이 안정적으로 처리하기 위한 방법론이 필요했고 이것은 함수형 프로그래밍 방법론이 적합했기 때문이다.
함수형 프로래밍은 수학과 밀접한 관련이 있기 때문에 배우기가 어려운 편에 속한다.
일반적으로 우리가 function() { .... } 라고 쓴다고 이 모든 것을 함수형 프로그래밍으로 착각하기 쉬운데 함수형 프로그래밍도 나름 규칙이 있다.
함수형 프로그래밍의 대표적인 특징을 한마디로 말한다면,
콩심은데 콩나고 팥심은데 팥난다는 깊은 우리나라 속담 한줄로 표현 할 수 있다.
어떤 함수에 2개의 인자를 받는데 예를 들어 2와 3을 넣고 호출할 경우 함수가 결과 값으로 5를 리턴했다면
이 함수는 어떠한 외부 환경의 변화를 받지 않고 동일하게 2와 3을 백번 천번 만번을 똑같이 넣더라고 결과값은
항상 동일하게 5를 리턴해야 된다. 2와3을 입력했는데 결과값이 5가 나올때도 있고 6이 나올때도 있다면,
만약 이 함수가 외부의 변수값을 하나 가지고 있고 이 변수가 함수의 결과 도출에 영향을 준다면 이것은 함수형 프로그래밍이 아니라. 절차지향적 프로그래밍일 가능성이 높다.
두번째로, 함수의 인자로 입력받는 인풋값이 함수 안에서 바뀌면 함수형 프로그래밍이 아니다.
전달된 데이터를 변경하는 것이 아니라. 그 값을 변경하기 위해 값을 담을 변수(또는 오브젝트)를 새로 만들어서
결과값을 전달해야 된다.
정리하면 이처럼 외부의 상태, 함수의 인자로 전달된 데이터의 상태를 변경하지 않음으로서 Side Effect가 발생하지 않도록 불변성을 유지해야 하는 특징이 있다.
이를 통해서 여러가지 동시다발적인 멀티쓰레딩 환경에서도 안정적으로 동작 할 수 있다.
세번째, 내가 만약 어떠한 함수에 if와 같은 조건문이나 제어문을 사용했다면 이것은 함수형 프로그래밍이 될 수 없다. for 문 if문과 같은 문장을 사용하지 않고 프로그래밍을 해야 한다. (자바스크립트 같은 경우 배열을 for문을 사용하지 않고 배열.map()를 사용)
네번째로 다른 데이터와 마찬가지로 함수에 인자로 전달하거나 리턴하는 등의 일들을 할 수 있는 Fist class(일급함수) 특징과 함수 자체를 인자로 전달하거나 함수에서 또다른 함수를 리턴하는 고차함수의 특성을 가지고 있어야 한다.
객체지향도 객체지향 프로그래밍의 규칙이 있듯이 함수형 프로그래밍도 이런 규칙에 맞춰야만 함수형 프로그래밍인 것이다. (Monad, Semigroup, Applicative, Monaid, Funtor, Disjuntion 과 같은 다양한 함수형 프로그래밍의 컨셉들이 있다. 이것을 잘 이해해야지 제대로된 함수형 프로그래밍을 구현할 수 있다. 특히 Monad는 함수형 프로그래밍에서 제일 중요한데 이해하는데 오랜시간이 걸린다고... 진정한 함수형 프로그래밍은 배우는데 어려운 패러다임이다. )
결론과 내생각
요즈음 함수형 프로그래밍이 주목 받으면서 객체지향으로 작성하는 것을 구식이라고 생각하고 함수형 프로그래밍이 더 좋은 거다 라고 생각하는 사람들이 있다. 함수형 프로그래밍, 객체지향 프로그래밍을 비교하는 것이 적절한가?
서로 다른 문제해결 방법론일 뿐이다. 건물을 짓는 데 건축자의 기술과 성향에 따라 같은 건물도 다른 기술을 가지고 짓듯이 그렇다. 무엇이 더좋고 더 나은 것이 아니라 개발하는 방법의 차이일 뿐이다. 또한 상황에 따라 객체지향과 함수형 프로그래밍을 접목해서 사용할 수 있고 절차형이나 UI의 반응형도 함수형 프로그래밍을 병행해서 사용 할 수도 있다. (그런데... 현실은 그렇게 녹록치가 않다...)
현실적으로 객체지향 프로그래밍만해도 객체지향적으로 코딩한다는 것이 쉬운일이 아니다. 하물며 함수형 프로그래밍은?....
리액트같은 경우 처음에는 객체지향적인 작성방식을 채택하다가 버전이 올라가고 함수형 프로그래밍 형식을 지원하고 그것을 더 권장하는 추세인데 2개의 같은 기능으로 동작하는 소스코드를 비교해보면 확실히 함수형으로 작성하는 것이 알기 쉽고 간결하긴 하다.
대기업을 제외하고 스타트업들은 거의 함수형 프로그래밍을 쫓아가는 상황(확실하진 않음), 프론트엔드를 희망한다면 결국 함수형 프로그래밍을 알고 있어야 한다로 매듭지으며 책 한권을 추천하고 마무리를 지으려 한다.
http://www.yes24.com/Product/Goods/91737015Clean Code(클린 코드) - 애자일 소프트웨어 장인 정신
자료출처: 구글링 / 유튜브
'Java' 카테고리의 다른 글
| | Stream API란(0)| 2022.12.07
| | JAVA 언어 과제(별 삼각형 찍기 / 구구단 가로 세로 설정)(0)| 2022.12.02
이 글은 제 Tistory 블로그에 처음 게시(2022-12-07)된 글입니다.