조금 더 자세한 설명을 듣고 싶은 사람을 위한 보충설명. 코드는 OCaml 기준입니다. 함수형 프로그래밍의 주요 특징은 다음과 같이 나열할 수 있습니다. 1. Variable is not variable: 4:30에서도 설명했듯, 특별한 경우가 아니라면 변수의 값을 변경할 수 없습니다. 원한다면 새로운 변수를 생성해서 계산값을 할당하거나, 계산값 자체를 리턴하여 처리해야 합니다. 2. Every expression is return value: 이는 5:36의 설명과도 일맥상통하는데, 함수의 내부는 단 한 줄의 Expression으로 구성되며 그것이 곧 그 함수의 리턴값이 됩니다. 그렇기에 필연적으로 Recursive하게 함수를 구성할 수밖에 없습니다. 예를 들어 1~n까지 더한 값을 반환하는 함수의 경우 [ let rec sum n = if n = 1 then n else n + sum (n-1) ]과 같이 구현합니다. 3. Higher-order function: 5:43에 나와 있듯, 함수인데 입력값과 출력값도 함수인 경우입니다. 예를 들어 어떤 함수든지간에, 그 함수를 두 번 적용하는 함수 makeTwice의 경우 [ let makeTwice f = fun x -> f (f x) ]와 같이 구현합니다. 입력받는 인자 f도 함수이고, 반환하는 값 [ fun x -> f (f x) ] 또한 함수입니다. 물론 f의 정의역과 치역은 동일해야 합니다. 영상에서 잠깐 언급된 Functor의 경우, 클래스를 입력받아 클래스를 반환하는 함수.. 정도로 이해하셔도 무방합니다. 4. Pattern-matching: 우리가 if-else문을 이용하여 특정 변수 안에 들어있는 값에 따라 프로그램의 분기를 만든다면, 패턴매칭은 해당 변수가 어떤 형태를 띠고 있는지에 따라 프로그램의 분기를 만듭니다. 예를 들어 int 타입 변수라면 항상 정수 하나가 저장되어 있는 상태이므로 형태를 나눌 수 없습니다만, list의 경우에는 '비어있거나, 적어도 하나라도 차 있거나'로 그 형태를 구분할 수 있습니다. 정수형 리스트에 들어있는 값을 전부 더하는 함수 sumList를 패턴매칭으로 구현하면 [ let rec sumList list = match list with [] -> 0 | hd::tl -> hd + sumList tl ]과 같습니다. 여기서 []은 리스트가 가질 수 있는 형태 중 '비어있음'을 뜻하며, hd::tl에서 hd는 리스트의 원소, tl은 나머지 리스트를 뜻하기에 이는 '리스트에 적어도 하나의 원소가 들어있음'의 형태를 뜻합니다. 즉 list라는 변수를 [] | hd::tl로 패턴매칭한 것이죠. 비단 리스트뿐만 아니라 내가 직접 '여러 형태를 지닌 새로운 타입'을 만들어서 패턴매칭하는 것또한 가능하며, 이 때 Monad의 개념이 등장합니다. 5. Monad: 단순 정수 하나를 입력받아 저장하기 위해서는 int형 변수를 사용하면 됩니다만... 무언가 불행한 일이 발생하여 아무런 정수도 입력되지 않은 채 프로그램이 진행될지도 모릅니다. 이 때를 대비하여 우리는 새로운 타입, intOrNone을 만들 수 있습니다. [ type intOrNone = Some of int | None ] 이렇게 만들어진 intOrNone은 두 가지 형태를 지니므로 패턴매칭을 이용하여 프로그램 분기가 가능합니다. 만약 정상적으로 입력받았을 경우에는 정수 하나가 저장될 것이고 그렇지 않다면 None이 설정되어 있을테니 그에 맞게 프로그램을 분기하는 것이 가능합니다. 이렇듯 *여러 예기치 못한 상황을 대비하거나, 혹은 이 형태를 이용하여 외부로부터 어떤 자료가 저장되어 있는지 철저히 숨기는 데에* 모나드가 사용됩니다. 물론 위 예시에선 몇 가지 더 설정해주어야 하는 것이, 우선 정수끼리는 당연히 사칙연산이 가능합니다. 그러니 새롭게 정의한 intOrNone 또한 이게 가능해야 합니다. [ let plus v1 v2 = match v1 with None -> None | Some k1 -> (match v2 with None -> None | Some k2 -> Some(k1 + k2) ) ]와 같이 정의한 plus 함수는 두 intOrNone을 입력받아 덧셈을 계산하여 intOrNone을 반환합니다. 이와 같이 *원래 변수인 int가 할 수 있는 건 intOrNone도 전부 할 수 있어야 합니다.* 그래야 int의 자리를 intOrNone이 대체 가능하니까요. 이를 조금 어려운 말로 표현하면.. intOrNone을 인자로 하는 두 함수를 입력받아 그 합성함수를 반환하는, 고차함수를 정의할 수 있어야 합니다. 예시인 intOrNone이야 워낙 간단하기에 그럴 필요도 없지만, 조금 복잡한 모나드를 설계한다면 이를 이용해 구현 가능한지 아닌지 그 여부를 알 수 있습니다. 마지막으로 특정 int형 변수를 intOrNone으로 바꿔주는 함수와 intOrNone 변수에서 정수값 혹은 None을 추출하는 기능 또한 필수입니다. 덤으로 프로그래밍을 배웠든, 전혀 문외한이든 상관없이 함수형 프로그래밍을 공부해보고 싶으신 분들은 pl.postech.ac.kr/~gla/cs101/notes/all.pdf 문서를 읽어보시기 바랍니다. 만약 링크가 자동 삭제된다면 구글에 "박성우 OCaml"로 검색하시면 됩니다. 포항공대 교수님께서 작성하신 정말 멋진 책입니다.
와, 이런 멋진 부연설명 정말 감사합니다 ❤️핀 📌 해둘께요 🙏 정말 정성 가득, 그리고 이해하기 쉽게 설명해 주셔서 감동했어요. 특히 모나드 파트에서요 하하 👍 제가 모나드를 이해하게 되었던 좋은 영상이 기억나서 공유해 드리고 싶어요: th-cam.com/video/t1e8gqXLbsU/w-d-xo.html
you all prolly dont give a shit but does any of you know a trick to log back into an instagram account?? I stupidly lost the password. I love any assistance you can offer me!
@Conner Ayden Thanks so much for your reply. I got to the site through google and im trying it out now. Takes a while so I will get back to you later when my account password hopefully is recovered.
저도 나온지 좀 됐지만 자바스크립트 함수형 프로그래밍 책을 최근에 봤는데 lodash이전에 나온 underscore를 뜯어보고, filter와 map, 일급함수, 보조함수, 클로져, 커링 등등에 대해서 다루더라구요.. 인자값으로 값이 아니라 함수가 들어가고요! 말을 엄청 간단하게 해주시지만 정말 어렵죠... 그리고 백엔드도 n년뒤에는 함수형 언어인 코틀린 스프링으로 갈것도같구요! 영상 잘보고갑니다아
진정한 잡탕 언어인 C++에는 사실 이전부터 함수형 프로그래밍의 특성이 있었습니다. Functor, Pure Function를 위한 const, Map을 위한 람다, 함수합성을 위한 커리 등등... 사실 함수형 프로그래밍을 구현하기 위해서 함수형 언어를 써야 하는 건 아닙니다. 여러분들이 쓰는 언어로 함수형 프로그래밍 패러다임을 구현하시면 됩니다. 그러면 함수형 언어의 장점인 간결성, Side Effect free를 얻을 수 있습니다. 위의 영상에 너무 빠르게 지나갔습니다만, Pure 함수를 써야 하는 이유가 뭘까요? 함수형 언어만 그런게 아니라 절차형 또는 객체지향 언어에서도 Pure 함수를 쓰는게 유리합니다. 당연하지요. 같은 입력을 줬음에도 내부 State에 따라 다른 출력이 나오는 함수는 이해하기 힘듬니다. 같은 이야기로 전역변수 쓰지마라, Flag, 만들지 마라, 함수에 상수매개변수를 전달해라등등이 있습니다. 이건 전부 Pure 함수를 써라는 이야기와 같은 말입니다. 함수형 프로그래밍은 Stateless 강제하는 겁니다. 덕분에 경쟁해야 할 State가 없어서 Multithreading에 강하고 State가 없으니 고민할게 줄어서(=Side Effect free) 버그 발생량이 확 줄어듭니다. State가 없어서 언제든 같은 입력에 같은 출력이 나오니 언제 연산할지 상관없어져서 Lazy Evaluation을 쉽게 지원하지요. 같은 이유로 State가 없어서 코드가 꼭 선언만으로 이루어진 것처럼 보이지요. 코딩양이 주는 건 덤이구요. 하지만 결정적으로 Pure 함수로만 프로그래밍을 할 수 없습니다. 프로그램이란 PC의 복잡한 상태변경을 목적으로 하니까요. 그래서 자기 함자 범주의 모노이드(=모나드), 함수 합성을 위한 커리 등 꼼수(?????)들이 필요한거지요. 사실 이런 꼼수(??!!!)들이 사실 함수형 언어를 실제 사용하는데 핵심입니다. 하지만 무지 낫섭니다. 마치 비C언어 프로그래머가 포인터를 처음 접할때 기분이지요.. 이게 뭐야!!! 왠지 징그러워.. 그런 느낌?? 이제 함수형 프로그래밍이 유행합니다. 장점이 강려크합니다. 자신이 무슨 언어를 쓰던지 함수형 프로그래밍을 이해해서 적용하는 것만으로도 충분히 그 장점을 흡수 할 수 있습니다. 유튜브에 뒤져보니 Java로, Javascripter로, C++로 함수형 프로그래밍을 하는 영상이 많더군요. 그래서 결론적으로 복잡하게 생각할 것 없이 지금 작성하고 있는 프로그램에 pure 함수를 최대한 도배를 해보겠다고 마음먹는 정도도 충분히 좋을 것 같습니다.
1982년 처음 COBOL,Fortran 등으로 프로그래밍 공부를 시작하고 나중에 LISP로 개발을 오랜 동안 했었습니다. 그러다가 20년 가까이 프로그래밍을 손 뗀 이후 최근에 와서 다시 요즘 프로그래밍에 관심을 갖고 보고 있는데 많은 변화가 있었네요. 엘리님의 설명은 귀에 쏙쏙 들어와서 정말 이해가 잘되네요. 감사합니다.
if나 for 같은것을 사용하지 않아야 한다고 설명해주셨는데요, 여기서 강하게 의문점이 드는 것이 있습니다.... 기계에게 명령을 내리려면 결국 조건과 반복이 무조건 들어가야 하지 않나 싶은데 함수를 선언하고 그걸 조합하는것만으로 사람이 아닌 기계가 그것을 어떻게 이해하고 처리하는지 궁금합니다...
저도 인트로에서 빵 터졌는데 (저는 마침 오늘 내가 지금은 다 이해를 못해도 무리하지말고 일단 되면 되는 걸 하는 단계인거지..하고 정리했거든요) 이해하려 애썼더니 마침내 이해하고 나서는 설명할 수 없게 되었다니 ㅋㅋㅋㅋ 괄호에 설명한 스테이지에 있음에도 친절한 드림코딩을 통해서 조금이라도 맥락을 공부할 수 있어 좋아요. 오늘도 컨텐츠에 감사드립니다~~ :)
개인적으로 순수함수의 조합을 통해 인풋 아웃풋 앞뒤 형식만 맞춰서 파이프만 연결해주면 되는 함수형 프로그래밍이 오히려 제 사고 방식에 맞아서 거의 모든 개발을 함수형으로 바꾸려고 하고 있습니다. 그냥 커링과 조합기 쓰는 수준으로 쓰고 있고 모나드 같은 건 아직 이해도 못했지만 이 정도 만으로도 OOP에 비해 안정성 높고 유지보수성 보장되는 프로그래밍을 할 수 있었던 것 같아요. 유닛테스트 하기도 좋고.... 한번 제대로 만들어 놓은 단순한 툴들이 많을수록 그게 자산처럼 쌓여나가는 게 개발자의 좋은 길이라는 생각이 있다보니 FP는 저에게 축복처럼 느껴졌습니다 ㅎㅎ 아 그리고 함수형은 지나치게 한번에 다 조합하려고 하면 가독성이 아주 안좋은 코드가 될 수는 있는 것 같습니다. 그래서 적당한 선에서 함수형 고집하면서 가독성 방해하지 않는 수준으로 코딩하는 노하우를 쌓아나가는 게 좋은 것 같습니다.
일전에 함수형 프로그래밍에 관심이 있어 공부하다가 한계를 느낀 것이 재귀 방식으로 함수를 만들었는데 재귀호출에 limit이 걸려 있더라구요. 파이썬/R은 limit이 확실히 있었는데 자바스크립트도 있었던 것 같아요. 하는 업무가 복잡한 수학이 필요해서 함수형 프로그래밍으로 만들면 재귀호출을 많이 하게 되는데 이를 극복하는 팁이 있을까요? 단순히 limit을 해제하면 되는건지.. 아니면 복잡한 수학에는 안 맞는 것인지 궁금합니다.
멀티 패러다임은... 순수한 함수형 진영에선 이단 정도로 취급하는... 아무튼 현업에서 이게 아무리 좋다 뭐다 해도 그 작은 허들 때문에 주류로 올라오려면 아직도 멀었다는 이야기를 많이 하게 되는듯. 이게 이래서 좋다라고 아무리 이야기 해도 대부분 이해 못하는 사람들이 많더군요.
@@dream-coding 젤 처음엔 monet.js 사용하다가, 거의 대부분 either랑 maybe만 쓰게 되던군요. 향후에 maybe는 optional chaining으로 쓰고, either는 사실 예외 처리 용도로 사용하였는데, ramda.js tryCatch로 쓰거나 또는 promise catch용으로 만들거나, 또는 axios도 역시 한 더 wrapping 하는 형태로 쓰고 있어요. monad는 거의 에러 처리용도와 널 처리 용도 이외는 잘 안쓰기도 하고 monad 가 뭔가 장황하기도 하고, PIPE처리도 어렵기도 하고, 뭐 결정적으로 다른 팀원이 잘 안쓰더라는 ....
기계과인데 대학원 올라오니 프로그래밍 해라고 해서 C# C++ python 전부 다 만지다보니 혼자서 몇개월 공부해서 쓰다보니 처음엔 클래스 묶었다가 오류 빵빵 터진 이후로 객체지향이든 절차지향이든 그냥 다 함수로 만들어서 쓰는게 오류가 없어서 그거만 하게 되네요.. 이런 패러다임이나 디자인패턴 같은건 어케 하는지ㅠㅠ
흠... 어렵네요. 하스켈이나 얼랭을 써본 적도 없고 함수형 프로그래밍이 필요한 적이 없어서 그런지 잘 이해를 못 하겠습니다. 그냥 느낌은 빅데이터를 다루면서 병렬적으로 비동기가 중요해지고 개개의 연산들이 오류가 안 나게 하려고 일반 언어들이 쓰는 if문등을 쓰지 않고 기존의 언어보다 좀 더 엄격하고 특별한 방법을 사용하는 거 같은데 실제로 프로그래밍을 해봐야 정확히 이해할 수 있지 않을까 생각이 드네요. 어쨌든 영상 잘 봤습니다.
@@dream-coding 지금 다시 보고 있는데요 6분43초에서 광고 나와서 광고 그만 보기 눌렀는데 강좌로 안돌아가고 스피너만 돌고 있습니다.. 어제도 광고 그만 보기 누르고 돌아갈 때 멈추었었는데, 오늘도 또 그러네요.. 아마도 유투브에서 저 보고 유료 전환 하라고 이러는 거 같네요 ㅋㅋㅋ...
@@aepyor 일단 답변 너무 감사드려요 ㅠㅠ 저가 지금 중견 si에서 인턴중인데 여기도 당연히 스프링....꾸준히 js를 공부중이긴 한데 이게 빛이 바랄일이 있을지 모르겠어요 ㅠㅠ 글대로 nodejs 사용하는 기업들 보면 보통 인력을 줄이고자 '풀스택' 개발자를 원하더라고요...
@@jipdol2638 어차피 js는 하는 김에 풀스택 하는 게 맞지 않나 생각합니다. 그래야 혼자 할 수 있는 게 무궁무진해져서 재밌기도 하구요. 근데 풀스택 개발자 구하는 스타트업은 그냥 대표나 다른 분들은 아무것도 모르고 그냥 한 사람 뽑아서 다 맡길 것 같은 분위기라 좀 그렇기는 하네요..
조금 더 자세한 설명을 듣고 싶은 사람을 위한 보충설명. 코드는 OCaml 기준입니다.
함수형 프로그래밍의 주요 특징은 다음과 같이 나열할 수 있습니다.
1. Variable is not variable: 4:30에서도 설명했듯, 특별한 경우가 아니라면 변수의 값을 변경할 수 없습니다. 원한다면 새로운 변수를 생성해서 계산값을 할당하거나, 계산값 자체를 리턴하여 처리해야 합니다.
2. Every expression is return value: 이는 5:36의 설명과도 일맥상통하는데, 함수의 내부는 단 한 줄의 Expression으로 구성되며 그것이 곧 그 함수의 리턴값이 됩니다. 그렇기에 필연적으로 Recursive하게 함수를 구성할 수밖에 없습니다. 예를 들어 1~n까지 더한 값을 반환하는 함수의 경우 [ let rec sum n = if n = 1 then n else n + sum (n-1) ]과 같이 구현합니다.
3. Higher-order function: 5:43에 나와 있듯, 함수인데 입력값과 출력값도 함수인 경우입니다. 예를 들어 어떤 함수든지간에, 그 함수를 두 번 적용하는 함수 makeTwice의 경우 [ let makeTwice f = fun x -> f (f x) ]와 같이 구현합니다. 입력받는 인자 f도 함수이고, 반환하는 값 [ fun x -> f (f x) ] 또한 함수입니다. 물론 f의 정의역과 치역은 동일해야 합니다. 영상에서 잠깐 언급된 Functor의 경우, 클래스를 입력받아 클래스를 반환하는 함수.. 정도로 이해하셔도 무방합니다.
4. Pattern-matching: 우리가 if-else문을 이용하여 특정 변수 안에 들어있는 값에 따라 프로그램의 분기를 만든다면, 패턴매칭은 해당 변수가 어떤 형태를 띠고 있는지에 따라 프로그램의 분기를 만듭니다. 예를 들어 int 타입 변수라면 항상 정수 하나가 저장되어 있는 상태이므로 형태를 나눌 수 없습니다만, list의 경우에는 '비어있거나, 적어도 하나라도 차 있거나'로 그 형태를 구분할 수 있습니다. 정수형 리스트에 들어있는 값을 전부 더하는 함수 sumList를 패턴매칭으로 구현하면 [ let rec sumList list = match list with [] -> 0 | hd::tl -> hd + sumList tl ]과 같습니다. 여기서 []은 리스트가 가질 수 있는 형태 중 '비어있음'을 뜻하며, hd::tl에서 hd는 리스트의 원소, tl은 나머지 리스트를 뜻하기에 이는 '리스트에 적어도 하나의 원소가 들어있음'의 형태를 뜻합니다. 즉 list라는 변수를 [] | hd::tl로 패턴매칭한 것이죠. 비단 리스트뿐만 아니라 내가 직접 '여러 형태를 지닌 새로운 타입'을 만들어서 패턴매칭하는 것또한 가능하며, 이 때 Monad의 개념이 등장합니다.
5. Monad: 단순 정수 하나를 입력받아 저장하기 위해서는 int형 변수를 사용하면 됩니다만... 무언가 불행한 일이 발생하여 아무런 정수도 입력되지 않은 채 프로그램이 진행될지도 모릅니다. 이 때를 대비하여 우리는 새로운 타입, intOrNone을 만들 수 있습니다. [ type intOrNone = Some of int | None ] 이렇게 만들어진 intOrNone은 두 가지 형태를 지니므로 패턴매칭을 이용하여 프로그램 분기가 가능합니다. 만약 정상적으로 입력받았을 경우에는 정수 하나가 저장될 것이고 그렇지 않다면 None이 설정되어 있을테니 그에 맞게 프로그램을 분기하는 것이 가능합니다. 이렇듯 *여러 예기치 못한 상황을 대비하거나, 혹은 이 형태를 이용하여 외부로부터 어떤 자료가 저장되어 있는지 철저히 숨기는 데에* 모나드가 사용됩니다.
물론 위 예시에선 몇 가지 더 설정해주어야 하는 것이, 우선 정수끼리는 당연히 사칙연산이 가능합니다. 그러니 새롭게 정의한 intOrNone 또한 이게 가능해야 합니다. [ let plus v1 v2 = match v1 with None -> None | Some k1 -> (match v2 with None -> None | Some k2 -> Some(k1 + k2) ) ]와 같이 정의한 plus 함수는 두 intOrNone을 입력받아 덧셈을 계산하여 intOrNone을 반환합니다. 이와 같이 *원래 변수인 int가 할 수 있는 건 intOrNone도 전부 할 수 있어야 합니다.* 그래야 int의 자리를 intOrNone이 대체 가능하니까요. 이를 조금 어려운 말로 표현하면.. intOrNone을 인자로 하는 두 함수를 입력받아 그 합성함수를 반환하는, 고차함수를 정의할 수 있어야 합니다. 예시인 intOrNone이야 워낙 간단하기에 그럴 필요도 없지만, 조금 복잡한 모나드를 설계한다면 이를 이용해 구현 가능한지 아닌지 그 여부를 알 수 있습니다. 마지막으로 특정 int형 변수를 intOrNone으로 바꿔주는 함수와 intOrNone 변수에서 정수값 혹은 None을 추출하는 기능 또한 필수입니다.
덤으로 프로그래밍을 배웠든, 전혀 문외한이든 상관없이 함수형 프로그래밍을 공부해보고 싶으신 분들은 pl.postech.ac.kr/~gla/cs101/notes/all.pdf 문서를 읽어보시기 바랍니다. 만약 링크가 자동 삭제된다면 구글에 "박성우 OCaml"로 검색하시면 됩니다. 포항공대 교수님께서 작성하신 정말 멋진 책입니다.
와, 이런 멋진 부연설명 정말 감사합니다 ❤️핀 📌 해둘께요 🙏
정말 정성 가득, 그리고 이해하기 쉽게 설명해 주셔서 감동했어요.
특히 모나드 파트에서요 하하 👍 제가 모나드를 이해하게 되었던 좋은 영상이 기억나서 공유해 드리고 싶어요: th-cam.com/video/t1e8gqXLbsU/w-d-xo.html
you all prolly dont give a shit but does any of you know a trick to log back into an instagram account??
I stupidly lost the password. I love any assistance you can offer me!
@Aden Kaiser Instablaster =)
@Conner Ayden Thanks so much for your reply. I got to the site through google and im trying it out now.
Takes a while so I will get back to you later when my account password hopefully is recovered.
@Conner Ayden It did the trick and I actually got access to my account again. I'm so happy:D
Thank you so much you saved my ass!
일빠 ❤️ 크으으 ㅠㅠ 엘리님 영상 힐링이네요..!! 아이 학교 방학이라니이 크크크🤣 즐거운 휴가보내셔요 엘리님!! 늘 감사합니다~~!!! 다음주도 기대할게요!!💕🌟
아닛! 1등을 하시다니 🎉
@@dream-coding 헤헤 기분좋아졌어요🎉🎉🎉🎉🎉
어차피 it종사자들이 많이 보는 내용일텐데 추상적이지 않고 구체적이고 분명한 기준들을 알려주신게 너무 좋습니다.
저도 나온지 좀 됐지만 자바스크립트 함수형 프로그래밍 책을 최근에 봤는데 lodash이전에 나온 underscore를 뜯어보고, filter와 map, 일급함수, 보조함수, 클로져, 커링 등등에 대해서 다루더라구요.. 인자값으로 값이 아니라 함수가 들어가고요! 말을 엄청 간단하게 해주시지만 정말 어렵죠... 그리고 백엔드도 n년뒤에는 함수형 언어인 코틀린 스프링으로 갈것도같구요! 영상 잘보고갑니다아
담당분야 전문성/지식도 지식이지만 컨텐츠 기획력도 정말 탁월하신거 같네요 영상 하나하나 감탄하고 갑니다 ㅠㅠ!
긍정적인 코멘트 주셔서 감사해요 ❤️
한번 본 영상들도 몇번씩 다시 보는데 이런 priceless한 영상을 아낌없이 공유해주셔서 더 감사하죠😍
진정한 잡탕 언어인 C++에는 사실 이전부터 함수형 프로그래밍의 특성이 있었습니다.
Functor, Pure Function를 위한 const, Map을 위한 람다, 함수합성을 위한 커리 등등...
사실 함수형 프로그래밍을 구현하기 위해서 함수형 언어를 써야 하는 건 아닙니다.
여러분들이 쓰는 언어로 함수형 프로그래밍 패러다임을 구현하시면 됩니다.
그러면 함수형 언어의 장점인 간결성, Side Effect free를 얻을 수 있습니다.
위의 영상에 너무 빠르게 지나갔습니다만, Pure 함수를 써야 하는 이유가 뭘까요?
함수형 언어만 그런게 아니라 절차형 또는 객체지향 언어에서도 Pure 함수를 쓰는게 유리합니다.
당연하지요. 같은 입력을 줬음에도 내부 State에 따라 다른 출력이 나오는 함수는 이해하기 힘듬니다.
같은 이야기로 전역변수 쓰지마라, Flag, 만들지 마라, 함수에 상수매개변수를 전달해라등등이 있습니다.
이건 전부 Pure 함수를 써라는 이야기와 같은 말입니다.
함수형 프로그래밍은 Stateless 강제하는 겁니다. 덕분에 경쟁해야 할 State가 없어서 Multithreading에 강하고
State가 없으니 고민할게 줄어서(=Side Effect free) 버그 발생량이 확 줄어듭니다. State가 없어서 언제든 같은
입력에 같은 출력이 나오니 언제 연산할지 상관없어져서 Lazy Evaluation을 쉽게 지원하지요.
같은 이유로 State가 없어서 코드가 꼭 선언만으로 이루어진 것처럼 보이지요. 코딩양이 주는 건 덤이구요.
하지만 결정적으로 Pure 함수로만 프로그래밍을 할 수 없습니다. 프로그램이란 PC의 복잡한 상태변경을 목적으로 하니까요.
그래서 자기 함자 범주의 모노이드(=모나드), 함수 합성을 위한 커리 등 꼼수(?????)들이 필요한거지요.
사실 이런 꼼수(??!!!)들이 사실 함수형 언어를 실제 사용하는데 핵심입니다. 하지만 무지 낫섭니다.
마치 비C언어 프로그래머가 포인터를 처음 접할때 기분이지요.. 이게 뭐야!!! 왠지 징그러워.. 그런 느낌??
이제 함수형 프로그래밍이 유행합니다. 장점이 강려크합니다.
자신이 무슨 언어를 쓰던지 함수형 프로그래밍을 이해해서 적용하는 것만으로도 충분히 그 장점을 흡수 할 수 있습니다.
유튜브에 뒤져보니 Java로, Javascripter로, C++로 함수형 프로그래밍을 하는 영상이 많더군요.
그래서 결론적으로 복잡하게 생각할 것 없이 지금 작성하고 있는 프로그램에 pure 함수를 최대한 도배를 해보겠다고 마음먹는 정도도 충분히 좋을 것 같습니다.
어머.... 자바스크립트 함수를 잘 이해 하지 못해, 계속 마음이 무거웠는데, 이 강의를 들으니, 갑자기 이해가 됩니다. 늘 언제나 처럼, 감사합니다. 선생님 강의는, 공부 시작할때, 공부하는 중간에도 계속 반복해서 들어야 한다는걸 알았습니다. 감사합니다
1982년 처음 COBOL,Fortran 등으로 프로그래밍 공부를 시작하고 나중에 LISP로 개발을 오랜 동안 했었습니다. 그러다가 20년 가까이 프로그래밍을 손 뗀 이후 최근에 와서 다시 요즘 프로그래밍에 관심을 갖고 보고 있는데 많은 변화가 있었네요. 엘리님의 설명은 귀에 쏙쏙 들어와서 정말 이해가 잘되네요. 감사합니다.
상황에 따라 접근하는 방법이 달라집니다. 더 유용한 방법을 찾아가는데, 어떤 언어가 만능은 아니기 때문에 새로운 개념의 언어가 나타나는 것이죠. 그래서 자기가 사용하는 언어를 잘 활용하면서 다른 개념의 언어를 습득하는 것도 중요합니다.
5:39 함수형에서 for문을 쓴 것이 문제가 아니고, 저건 넘겨준 파라미터에 대한 변경이 for문에 담겨있어서 그런거라 봐야하는거죠? 만약 function 내 변수를 하나 선언해서 해당 값을 주어 return하면 무관한 것인거죠?
이미 5년 전서 부터 람다 같이 필터링이나 따이 따이 한것들도 의미있는 콜백 처럼 간결한 문장으로 개발하는 패러다임으로 점점 기술이 진화하고 있는데, 거기에 인젝션 기술 까지 접목해서
급속도로 바뀌는게 피부로 와닿기는함~
따이 따이 한것들 🙌 맞아요 :) 일급함수, 고차함수(?) 이런 트렌드가 많이 접목되는거 같아요
자바에 stream이 갑자기 생겨서 가벼운 사용법은 어쩌다 익혔지만 그 원리나 방법이나 효율적인 응용방식은 이 영상으로 알게 되었습니다! 덕분에 많이 느끼고갑니다:) 항상 잘보고있어요 🥰
저도 엘린님 영상 보면서 프론트 개발자가 되려했지만 백엔드 개발자로 취업을 했네요😂 하지만 프론트가 좋아서 간간히 공부 하려 합니다 ! 항상 좋은 영상 올려주셔서 감사합니다 😊
우와 축하드려요!!! 백엔드가 저는 더 어렵던데!!! 대단하세요 🎉
우와 축하드려요 🎉 이번 영상에서 벌써 꽤 오래전부터 구독해 주시던 분들이 취업하셨다고 코멘트 주셔서 너무너무너무 행복하네요 🍻
TS 강의 듣고 있는데. 복습 차원에서 다시 찾아 듣습니다:) 이전엔 이게 멍미 했는데 이제 이해가 쏙쏙 되네요 ㅋ
항상 좋은 영상 잘 보고있습니다!! 항상 화이팅입니다!!!
감사합니다 🙆♀️ 화이팅!
모르는게 있어서 검색할 때, 엘리님이 뜨면 그렇게 좋더라:) 감사합니다. 좋아요 오천개 맘으로 눌렀슴다
양질의 영상 감사합니다!!
함수형 프로그래밍.. 순수함수로 해야한다는 부분만 알고있었는데 더 많은 특징이 있는 어려운 페러다임이었군요..ㅎㅎ
디테일한 예시 좋네요 감사합니다
모나드 언급하는 채널이 별로 없는데 ㅎㅎ 이해할려고 엄청 고생했던 기억이 나네요
하스켈, 스칼라 책도 보고 개발 시장에서 스칼라가 약한데 취미로 하기엔 적성에 스칼라가 재미있더라고요
프로그래밍 언어는 각 목적에 따라 기능을 추가하고 확장하는 경향이 있어 모던 언어는 비슷한 기능이 추가되는 것이 요즘의 추세입니다. 하지만 디버깅의 입장에서 함수형 프로그래밍은 직관적인 디버깅과 좀 거리가 있습니다.
if나 for 같은것을 사용하지 않아야 한다고 설명해주셨는데요, 여기서 강하게 의문점이 드는 것이 있습니다....
기계에게 명령을 내리려면 결국 조건과 반복이 무조건 들어가야 하지 않나 싶은데
함수를 선언하고 그걸 조합하는것만으로 사람이 아닌 기계가 그것을 어떻게 이해하고 처리하는지 궁금합니다...
아 이런 영상을 기다려왔어요
다른 분들 설명도 정말 좋았지만
엘리님만의 세련되면서도 너무 얄팍하지는 않은 이런 설명이 필요했어요!!
아니, 이런 좋은 피드백을 😆 감사합니다 ❤️
저도 인트로에서 빵 터졌는데 (저는 마침 오늘 내가 지금은 다 이해를 못해도 무리하지말고 일단 되면 되는 걸 하는 단계인거지..하고 정리했거든요) 이해하려 애썼더니 마침내 이해하고 나서는 설명할 수 없게 되었다니 ㅋㅋㅋㅋ 괄호에 설명한 스테이지에 있음에도 친절한 드림코딩을 통해서 조금이라도 맥락을 공부할 수 있어 좋아요. 오늘도 컨텐츠에 감사드립니다~~ :)
하하하 많이 동감하셨다니 저두 좋아요 🙆♀️ 어려운걸 공부하다 보면 한번씩 그럴때 있는거 같아요. 아! 이해 했다고 느끼는 순간, 갑자기 다시 음? 뭐지? 하는거...ㅋㅋㅋ
함수형 프로그래밍이란 걸 이 영상을 통해 전반적인 것들을 파악할 수 있었습니다. 감사합니다!
고생 많으셨습니다 쉽게 설명해 주셔서 감사해요!!
와 저는 이때까지 함수형 프로그래밍이 절차지향 프로그래밍인 줄 알았어요!
엘리님 덕분에 바로잡을 수 있었네요! 늘 감사합니다 ㅎㅎ
많은 분들이 "함수형" 이 이름 때문에 그냥 함수만 쓰는 건줄 아시더라구요 😊
오늘도 좋은 영상 감사드립니다~~ 요즘 회사에 새로오신 분들에게 엘리님 영상 추천해주고 있는데 너무 뿌듯합니다. ㅎㅎ
아닛 추천해 주고 계시다니 😍 감사합니다 🙆♀️
저는 관심으로 몇번 검색했지만, 아무리 생각해도 큰 차이를 모르겠던 함수형프로그래밍 ㅎㅎ 별도로 봤었던 키워드들의 교차점을 찾았네요 ㅠ 감사합니다.
엘리님 오랜만에 출석체크합니다! ㅎㅎ 감사합니다~!
제가 이해한 바로는 call by reference 가 아닌 call by value 가 기본이 되는 프로그래밍인 것 같네요
5:39에 '문장(expressions)'이라고 돼 있는데 'Statements'가 맞는거죠?
아뉫 이런 오타가 ㅠ ㅠ
트랜드를 일목요연하게 짚어주셔서 감사합니다! C언어면 함수형일줄 알았는데 더 심오한 정의가 있었네요!
개인적으로 순수함수의 조합을 통해 인풋 아웃풋 앞뒤 형식만 맞춰서 파이프만 연결해주면 되는 함수형 프로그래밍이 오히려 제 사고 방식에 맞아서 거의 모든 개발을 함수형으로 바꾸려고 하고 있습니다. 그냥 커링과 조합기 쓰는 수준으로 쓰고 있고 모나드 같은 건 아직 이해도 못했지만 이 정도 만으로도 OOP에 비해 안정성 높고 유지보수성 보장되는 프로그래밍을 할 수 있었던 것 같아요. 유닛테스트 하기도 좋고.... 한번 제대로 만들어 놓은 단순한 툴들이 많을수록 그게 자산처럼 쌓여나가는 게 개발자의 좋은 길이라는 생각이 있다보니 FP는 저에게 축복처럼 느껴졌습니다 ㅎㅎ 아 그리고 함수형은 지나치게 한번에 다 조합하려고 하면 가독성이 아주 안좋은 코드가 될 수는 있는 것 같습니다. 그래서 적당한 선에서 함수형 고집하면서 가독성 방해하지 않는 수준으로 코딩하는 노하우를 쌓아나가는 게 좋은 것 같습니다.
맞아요 🙆♀️ 어떤 패러다임이든 가독성이 유지보수와 확장성면에서 정말 중요한것 같아요. 잘 짜여진(디커플링된, 독립적인 모듈) 클래스도 유닛테스트 하기가 좋지만, 순수 함수만큼 유닛테스트 작성하기 쉬운게 또 있을까 싶어요 😊
요즘 모던자바 공부하면서 함수형 프로그래밍에 관심을 가지게 됐는데 딱 관심저격해주시는 엘리님 클라스 ㅠㅠ 🤩
관심저격 감사합니다 🙆♀️
너무 재미있게 잘 보고 갑니다. ^^ 프로그래밍에 관심없는 사람도 정말 재미있게 보고 흥미를 많이 가질만한 영상이네요^^
코딩에 관심이 없는데 제 영상이 추천으로 뜨셨나요? 하하하핫ㅋㅋㅋ
지금 학교에서 Ocaml 배우는데 온라인에 리소스가 다른 프로그래밍언어들보다 너무 적어서 너무힘드네요 ㅠㅠ
와 학교에서 Ocaml을 배우시나요?
함수형이 대세라는 썰은 10년째 나오는거같다
@@asdsdddds 아하 제가 10년전에 프로그래밍 첨시작해서 그런듯 ㅋㅋㅋ
엘리쌤 항상 좋은 영상 감사합니다! 그리고 엘리쌤 영상 썸네일 보는 재미가 있어요 ㅋㅋㅋㅋㅋ
항상 감사드립니다!!! :)
좋은 말씀 잘들었습니다 감사합니다
일전에 함수형 프로그래밍에 관심이 있어 공부하다가 한계를 느낀 것이 재귀 방식으로 함수를 만들었는데 재귀호출에 limit이 걸려 있더라구요. 파이썬/R은 limit이 확실히 있었는데 자바스크립트도 있었던 것 같아요. 하는 업무가 복잡한 수학이 필요해서 함수형 프로그래밍으로 만들면 재귀호출을 많이 하게 되는데 이를 극복하는 팁이 있을까요? 단순히 limit을 해제하면 되는건지.. 아니면 복잡한 수학에는 안 맞는 것인지 궁금합니다.
항상 좋은강의 감사드리면 엘리 선생님 사랑합니다
감사합니다 🙆♀️
진짜 너무 쉽게 설명
해줘서 감사합니다.
오늘도 너무 멋지세요!
저도 아름다운 코딩을 하는 그 날 까지 :)
아름다운 코딩 ✨
멀티 패러다임은... 순수한 함수형 진영에선 이단 정도로 취급하는... 아무튼 현업에서 이게 아무리 좋다 뭐다 해도 그 작은 허들 때문에 주류로 올라오려면 아직도 멀었다는 이야기를 많이 하게 되는듯. 이게 이래서 좋다라고 아무리 이야기 해도 대부분 이해 못하는 사람들이 많더군요.
함수형으로 개발하고 계신가요? :) 저는 저희 CTO가 매일 Haskell에 대해 얘기 해서 함께 대화 하기 위해서 배우기 시작했다가 함수형에 빠졌는데 한번도 현업 프로젝트에서 써보지는 못해서 언젠가 꼭 한번 프로젝트 해보고 싶더라구요 😊
좋은 영상 감사하고요, 다음 영상 기다릴게요. ❤❤❤
감사합니다 🙆♀️
좋은 영상 감사합니다
크 요즘 ts 객체지향 공부하고 있는데 이해가 정말 쑥쑥 잘되서 재밌어요!
감사합니다!
감사합니다 🙌 객체지향 잘 공부하시구 나중에 디자인패턴까지 공부하시면 정말 재밌어요 🙆♀️
@@dream-coding 아 맞다 엘리님 강의가 이해 잘된단 거였어요!
제 경우는 모나드 잘 안쓰게 되더라고요. 그게 전체적으로 코드가 길어지게 많드는 한편, 일단 쓰기 시작하면 다른 사람들이 불편해 하더라는 대체할 수 있는 방법도 없는 것도 아니고,
주로 어떻게 대체해서 사용하시나요? :)
@@dream-coding 젤 처음엔 monet.js 사용하다가, 거의 대부분 either랑 maybe만 쓰게 되던군요. 향후에 maybe는 optional chaining으로 쓰고, either는 사실 예외 처리 용도로 사용하였는데, ramda.js tryCatch로 쓰거나 또는 promise catch용으로 만들거나, 또는 axios도 역시 한 더 wrapping 하는 형태로 쓰고 있어요. monad는 거의 에러 처리용도와 널 처리 용도 이외는 잘 안쓰기도 하고 monad 가 뭔가 장황하기도 하고, PIPE처리도 어렵기도 하고, 뭐 결정적으로 다른 팀원이 잘 안쓰더라는 ....
안그래도 궁금해 하던 부분인데! 감사합니다!!
감사합니다 🙆♀️
깔끔하게 이해됐네요 ㅎㅎ 최고의 요약입니다!
감사합니다 🙆♀️
좋은 영상 감사합니다~
감이 좀 온 것 같아요! 감사합니다 :)
궁금했는데 간략히 다뤄주셔서 감사합니다
감사합니다 🙆♀️
이 영상보고 구독했어요! 첫화부터 정독갑니다!
어서오세요 😍
감사합니다! 이해쏙쏙
완전 리액트네용!
너무 멋진 엘리님 감사합니다
감사합니다 🙆♀️
함수형 프로그래밍에 익숙해지니까 코드 리뷰 중에 함수 중간에 못보던 변수가 튀어나오면 심기가 매우 불편해짐.
누님 쌩 초보자가 c언어 건너뛰고 C++ 로 시작해도 문제없을까요?
This is what I want.
와 캘리 짱 ~
둘다 적재적소에 쓰는게 중요하다!
설명 최고에요👍
감사합니다 🙆♀️
기계과인데 대학원 올라오니 프로그래밍 해라고 해서 C# C++ python 전부 다 만지다보니 혼자서 몇개월 공부해서 쓰다보니 처음엔 클래스 묶었다가 오류 빵빵 터진 이후로 객체지향이든 절차지향이든 그냥 다 함수로 만들어서 쓰는게 오류가 없어서 그거만 하게 되네요.. 이런 패러다임이나 디자인패턴 같은건 어케 하는지ㅠㅠ
이게 궁금한게 기본적인 지식만 듣고 이영상 을 찍은건지 깃헙에서 자신이 짠 코드가 기업에서 처럼 코드를 정확히 알고 쓰는건지 궁금한데...
Thanks
흠... 어렵네요. 하스켈이나 얼랭을 써본 적도 없고 함수형 프로그래밍이 필요한 적이 없어서 그런지 잘 이해를 못 하겠습니다.
그냥 느낌은 빅데이터를 다루면서 병렬적으로 비동기가 중요해지고 개개의 연산들이 오류가 안 나게 하려고 일반 언어들이 쓰는 if문등을 쓰지 않고 기존의 언어보다 좀 더 엄격하고 특별한 방법을 사용하는 거 같은데 실제로 프로그래밍을 해봐야 정확히 이해할 수 있지 않을까 생각이 드네요. 어쨌든 영상 잘 봤습니다.
최근 하스켈 배워보고 있는데 진짜 재밌더라구요 ㅋㅋ
그쵸? 조금씩 빠져들면 헤어나올 수 없는 세계, HASKELL
공부 재밌다는 그대가 win......
커링도 중요하고 모나드 스택도 중요하고...
감사합니다.
감솨합니다~
감사합니다 🙆♀️
리액트에서 절차형으로 코딩하다가 뚝배기 깨졌던 기억이 있네요ㅋㅋ 함수형.. 어렵네요ㅋㅋㅋ
하하하하하하하하 뚝배기!ㅋㅋㅋㅋ
잘 들었습니다. 모나드도 한 번 부탁드립니다. ^_^
하하 감사합니다 🙆♀️
딴거는 이해가 가는데 if switch for 문을 쓰면 왜 안되는지는 이해가안가네요.. ㅠㅠ
스칼라 개발잔데 맨날 하는게 함수형 프로그래밍인데 아직도 Currying 을 이해 못했음......ㅠ
감사합니다
감사합니다 🙆♀️
아아ㅏㅏㅏㅏㅏ앗... 최근에 함수형 프로그래밍을 배워서 사용할지 말지 고민했었는데... 역시 엘리눈나...!
최근에 뜨끈뜨끈하게 배우셨네요 🔥
동시 시청자가 많아서 그런지 영상이 플레이가 안되요.. 한 시간 전에 안되서 다른 채널 보다가 다시 들어왔는데 지금도 안되요.. 스피너만 뱅뱅 돕니다.. 저만 그런건지.. 다른분들도 그런건가요?
앗, 정말요? 😭
@@dream-coding 지금 다시 보고 있는데요 6분43초에서 광고 나와서 광고 그만 보기 눌렀는데 강좌로 안돌아가고 스피너만 돌고 있습니다.. 어제도 광고 그만 보기 누르고 돌아갈 때 멈추었었는데, 오늘도 또 그러네요.. 아마도 유투브에서 저 보고 유료 전환 하라고 이러는 거 같네요 ㅋㅋㅋ...
요즘 자바스크립트에 관해 공부중인데 백엔드 지금 한국내에선 nodejs를 사용하는 기업들은 별로 없다고 알고있습니다. 그럼 그냥...포기하고 자바나 해야되는걸까요
스타트업에서는 많이 씁니다.. 물론 스타트업 취업은 신중히 고려해 봐야겠지만요.. 여하튼 한국은 고인물..
@@aepyor 일단 답변 너무 감사드려요 ㅠㅠ 저가 지금 중견 si에서 인턴중인데 여기도 당연히 스프링....꾸준히 js를 공부중이긴 한데 이게 빛이 바랄일이 있을지 모르겠어요 ㅠㅠ 글대로 nodejs 사용하는 기업들 보면 보통 인력을 줄이고자 '풀스택' 개발자를 원하더라고요...
@@jipdol2638 어차피 js는 하는 김에 풀스택 하는 게 맞지 않나 생각합니다. 그래야 혼자 할 수 있는 게 무궁무진해져서 재밌기도 하구요. 근데 풀스택 개발자 구하는 스타트업은 그냥 대표나 다른 분들은 아무것도 모르고 그냥 한 사람 뽑아서 다 맡길 것 같은 분위기라 좀 그렇기는 하네요..
3번은 동의하기 힘드네요
2021년 3월 28일 일요일 완강!
굳~
감사합니다 🙆♀️
☺️
다음 강의때는 드림을 코딩 하는 방법좀 ㅎㅎ
넵, CODE YOUR DREAM ☀️
대학 다닐 때 코볼 배웠었는데 (...)
👍👍👍👍👍👍
21년전에 함수형언어 배운듯..ㅋㅋ
C언어에서 사용되는 함수를 이용하는거랑 동일한 것같은데...
C언어는 함수형에서 제일 중요한 일급함수 특징이 없어요 :)
함수들을 조합할 수 있는 action().map().flatmap().reduce()..
이런것도 할 수 없죠
함수형 프로그래밍이 저런거라면 그냥 평소 숨쉬듯이 하는것 하고 똑같은거네. 모듈이 외부요소에 영향 받으면 불안해서 어찌 쓰나.
천재다 ㅋ
혹시 옆에 키보드 뭔지 알수있을까요 ?
곧! 리뷰 영상이 올라옵니다 👍 스테이 튠
객체 어니고 개체
코린이는 갈길이 머네요..하하하
Yez님 많이 남지 않았어요! 화이팅 🙆♀️
영상 처음에 이상한 소리나요.. 순간 배속해놓은줄
맞아요!ㅋㅋㅋ 앞부분만 살짝 1.25배속!
타임스크립트가 없어진다 ㅋ
함수형은 절대 메이저가 못될거 같아요. 머리터짐. ㅅㄱ
frpㅋㅋ
나 이 누나 좋아 나이는 내가 더 많은거 같지만 나보다 잘하니깐 ㅋㅋ
어렵다 ㅠ.ㅠ
화이팅!
눈나...