모나드는 개념적으로는 "함수형 프로그래밍"의 분파입니다! 1950년 대에 등장한 개념이라서 "객체 지향 프로그래밍"이 없던 때 등장한 녀석입니다. 이 용어가 참 복잡한데 간단하게 정리해보면 (1) 원래 map, filter 함수를 연속으로 사용하고 싶다면 filter(map(map([1, 2, 3], 〇〇), 〇〇), 〇〇)처럼 코드를 구성해야 합니다. 함수는 안쪽부터 실행되므로 이 코드를 이해하려면 map→map→filter 형태로 이해해야 합니다. 이해하기가 힘듭니다. (2) 만약 이를 [1, 2, 3] → map → map → filter 처럼 작성할 수 있게 된다면 코드를 이해하는 것이 더 쉬울 것입니다. --- 이런 인식 흐름이 굉장히 좋으므로 여러 분파에서 이 문법을 채용합니다. 객체 지향 프로그래밍 언어에서는 "메서드 체이닝"이라는 이름으로 이를 활용합니다. 자바스크립트를 예로 들면 [1, 2, 3].map(〇〇).map(〇〇).filter(〇〇)으로 코드를 작성합니다. 함수형 프로그래밍 언어에서는 "모나드"라는 이름으로 이를 활용합니다. [1, 2, 3] | 〇〇 | 〇〇 | 〇〇처럼 씁니다. PS. 한 방에 묶어서 [1, 2, 3] | 〇〇, 〇〇, 〇〇하기도 합니다. PS. 바인드라는 표현을 써서 [1, 2, 3] bind 〇〇 bind 〇〇 bind 〇〇 [1, 2, 3] bind 〇〇, 〇〇, 〇〇 하기도 합니다. 분파에 따라서 차이가 있다면 일반적으로 객체 지향 프로그래밍 언어는 오류가 있을 때 "바로 예외"를 때려버리고 함수형 프로그래밍 언어는 "프로그램이 죽지 않게" 구현합니다. 그리고 이러한 흐름에 따라서 각자 길을 가서 잘 발전합니다. PS. 함수형 프로그래밍 언어는 어떤 식으로 더 발전하냐면 10 binds 〇〇, 〇〇 if maybe 〇〇 # 뭔가 값이 나오면 이거 실행 if null 〇〇 # null 이 나오면 이거 실행 when error 〇〇 # 오류 뜨면 이거 실행 합니다. --- 그런데 최근 객체 지향 프로그래밍 분파의 "객체 지향 비동기 프로그래밍 분파"에서 "아니 처리 중에 예외가 뜨게 하면 안 되는데...."라고 하다 보니 함수형 프로그래밍에서 발전하고 있던 모나드를 채용해버립니다. PS. 객체 지향 프로그래밍에서 발전하던 메서드 체이닝과 함수형 프로그래밍에서 발전하던 모나드를 결합한 새로운 분파가 나온 것입니다. [비동기 분파에서 활발하게 쓰이므로, 자바스크립트에서는 이것이 큰 축을 이룹니다] 그래서 [1, 2, 3] .pipe(〇〇, 〇〇, 〇〇) .nullable({{null이 떴을 때 실행할 함수}}) .exception({{예외가 떴을 때 실행할 함수}}) .complete({{정상적으로 실행했을 때 호출하는 함수}}) 이렇게 코드를 구현할 수 있게 하는 것이 현대적인 "객체 지향 프로그래밍 언어에서의 모나드"라고 할 수 있습니다!
혼공파 책과 영상으로 파이선 공부하면서 학교에서 진행하는 프로젝트에 많이 도움을 받고 있습니다. 감사합니다. 강의와 책을 통해 상속, 인캡슐레이션 은 이해가 좀 되는데 OOP 를 공부하면서 polymorphism 을 이해를 잘 못하겠어요.. 혼공파책에 찾아봐도 안나오더라구요 ㅜ_ㅜ 윤인성 강사님의 설명좀 부탁드려도 될까요?
결국 캡슐화는 개발자의 목적과 관계없는 어떤(실험정신이 투철한) 정신나간 사람이 뻘짓 할경우를 대비하기 위함인거 같다고 해석해도 될까요? ㅎㅎㅎㅎ 요즘 자바 강의 듣는데, 이전 파이썬 강의 들어논게 잇어서 그런지 듣기 거북하지는 않네요. 선생님 덕분입니다. ^^ 감사합니다.~~
넵 맞습니다! 근데 사실 개발을 하다보면 (1) 클래스를 사용해서 만든 프로그램을 사용하는 사용자[최종 사용자]에 의해서도 잘못된 값이 들어오고 (2) 예상치 못한 버그로 잘못된 값이 들어오고 PS. 양수만 넣으려 했는데 오버플로우나서 음수가 들어온다던지 등등 워낙 다양한 일이 있어서 이런 모든 상황을 대비하기 위한 것이라 생각해주시면 되겠습니다!!
근데 문득 궁금해지는 건 외부에서 변수를 참조하는 걸 막기 위한 방법론이 캡슐화인 건 납득이 됩니다만 결국 외부라는 것도 코드 상에서 클래스 외부라는 말일텐데, 그러면 그 미친놈이라는 분은 함께 일하는 어떤 동료 및 협엄 개발자라는 것인가요? 어떤 사람이 밤새 일하느라 피곤해서 잠시 착각해서 헛짓을 할 수도 있으니까요?
개발과 관련해서 유명한 말로 "3일 후의 나는 내가 아니다"라는 말이 있습니다. 본인이 클래스를 만들어도 3일 후가 되면 본인이 만든걸 다 까먹기 때문입니다. 그래서 함께 일하는 동료도 문제가 될 수도 있고 + 그 클래스를 가져가서 쓰는 협업하는 사람이 문제가 될 수도 있고 + 그 클래스를 만든 본인이 문제가 될 수도 있습니다. 그리고 개발이라는게 일정적으로 문제가 빡빡하고 미래를 예측하는 것이 힘들어서 코드가 복잡해지면 """지금 당장 문제는 안 일으키는데 깊게 생각해보면 나중에 유지보수로는 문제가 될지도 모르는 코드"""를 어떤 시점에 딱 파악하는 것이 쉽지가 않아서 일단 일정 맞추느라 모두가 다 같이 문제를 일으킵니다[...]. PS. 이렇게 """지금 당장 문제는 안 일으키는데 깊게 생각해보면 나중에 유지보수로는 문제가 될지도 모르는 코드"""를 "기술적 부채"라고 이야기합니다.