ISA
3k
2020-08-23 15:16:44
20
1142

디자인 패턴은 OOP에 종속적인가?


지나가다가 fender님의 댓글에서 본 내용인데 디자인 패턴이 근본 지식이 아닐 수 있다 하시면서 함수형을 예로 드시더군요 객체지향에서 벗어나면 기존 디자인 패턴들이 많이 변하다는 내용이던데 정말 그런가 궁금해서 글을 써봅니다.

제 개인의 경험상 mvc 같은 패턴을 적용할때 해당 언어나 프로젝트가 객체지향이냐 와는 사실 별 상관이 없었던 것 같고 그 유용함이 달라지진 않았습니다. 기타 싱글톤 패턴이나 다른 패턴도 그렇고 함수형 이라 해서 object를 아예 안쓰지는 않는데

oop와 함수형 사이에서 크게 달라져서 써먹지 못할 정도의 패턴이 존재하나요?

그리고 디자인 패턴이 정형화된 형식이라기 보다는 설계(코딩) 방법론의 일종으로 생각하고 그렇게 적용중인데 뭔가 잘못 이해하고 있는건지 궁금하네요.

전 개인적으로 cs나 디자인 패턴이 그나마 언어나 분야에 상관없이 유용한 근본지식이라 느끼는데 다른 의견이 있으신 분들 그 의견과 자신의 근거를 남겨주시면 좋을거 같아요.

1
  • 댓글 20

  • 고고씽~
    425
    2020-08-23 15:25:09

    디자인패턴은 OOP의 설계의 패러다임에서 파생되었죠..


    이유는 OOP는 어렵고 또, 제대로 사용하기 힘들기 때문이죠.


    함수형언어는 단순 기능의 모음정도라 라이브러니용도로 생각합니다.


    디자인패턴 대상도 못되죠.

    그 예로 자바스크립트로 설명드리면 예전 자바스크립트는 함수형 언어의 전형이지만 이걸로 디자인패턴 운운을 못했죠..


    제대로 언어 취급도 못 받았으니까요.

    여기에 클래스가 도입되고 객체지향이 도입되니 프레임워크가 생기고 디자인패턴도 나오는 겁니다.


    함수형언어는 절차식언어입니다.

    그냥 절차대로 하면되요.


    -4
  • ISA
    3k
    2020-08-23 15:35:27

    고고씽 //

    디자인 패턴이 oop 패러다임에서 나왔다 한들 절차형이나 함수형에 적용 못할 이유 또는 이점이 없지는 않을거 같은데요.

    애초에 함수형언어를 단순히 기능모음 라이브러리로 취급하시는건.. 함수형 프로그래밍에서 말하는 개념을 제대로 이해 못하시고 계신거 같은데요..? 

    글고 자바스크립트는 함수형 언어였던 적이 없습니다. 태생부터 멀티 패러다임 스크립트 언어고 프로토타입형 객체지향과 클로저등을 이용한 함수형 프로그래밍이 가능했어요 es5전에도 가능했다고 알고 있네요.

  • fender
    19k
    2020-08-23 15:36:36

    제 생각에 그건 '디자인 패턴'이란 용어를 보통 'GoF'를 기반으로 한 객체 지향 패턴을 가르키는 것으로 사용하기 때문인 것 같습니다.

    물론 함수형에도 이런 저런 정형화 된 문제 해결 방법들은 존재합니다. 하지만 그 건 GoF의 패턴들과는 매우 다른 모양이고 혼동을 피하기 위함인지 '디자인 패턴'이라고 부르는 것이 흔하진 않은 것 같습니다.

    말씀하신 '설계 방법론'이란 것은 당연히 프로그램 설계를 바라보는 관점에 따라 크게 달라집니다. 그리고 프로그래밍의 패러다임은 바로 그러한 관점을 어떻게 가져가는 지에 따라 정의합니다.

    디자인 패턴은 어떻게 보면 객체지향의 하위 개념으로, 모든 것을 객체 간의 관계로 이해한다는 관점을 전제로, 구체적으로 그 관계를 어떻게 정의해서 주어진 문제를 풀 것인가에 대한 모범 답안을 정리한 것입니다.

    그렇기 때문에 모든 것을 객체가 아닌 함수로 이해하는 관점에서는 객체지향의 디자인 패턴은 아예 성립할 수가 없고, 함수형 안에서 자주 사용하는 정형화된 접근에 '패턴' 같은 이름을 붙이더라도, 그 모양은 GoF와는 전혀 다르게 될 것입니다.

  • 프초딩3
    2020-08-23 15:38:11

    디자인 패턴이라는 용어의 일반적인 사용에 따르자면, Language에 따른 Best practice의 모음 정도라고 볼 수 있고, OO나 FP의 특성마다 그 Best practice가 다릅니다. 

    Design pattern의 목적으로 보자면 어떻게 하면 가장 재사용과 유지보수가 간단할 수 있게 하는 목적인데 언어 관점으로는 제약사항이 있겠죠. 

    유명한 GoF 관점으로 보자면 Design pattern이라는 Term 자체가 OO에 국한되어 있지만, Immutable을 지향하는 FP의 경우 다른 디자인 패턴 ( Practice )들이 존재하겠죠.

    너무 깊게 생각할 문제는 아닌 것으로 보입니다.


  • kkey21a
    4k
    2020-08-23 15:39:11 작성 2020-08-23 15:42:02 수정됨

    패턴이라는게 결국 어떤 문제를 해결하기 위해 나온  재사용 가능한 방법 정도 아닐까요?

    결국 객체지향이나 함수형으로 프로그래밍하느냐에 따라 구현 방식에는 차이가 날 수 밖에 없지 않을까요. 


    다만, 그 패턴이라는 부분이 특정 프로그래밍에 따라 흡수가 되어, 특별한 해법이 필요하지 않거나 간략하게 변경되는 일부의 경우도 있겠지만, 그렇지 않은 경우도 있지 않나 생각합니다.



    PS

    객체지향과 함수형예 따라 재사용하는 단위가 다르잖아요.

  • fender
    19k
    2020-08-23 15:39:50 작성 2020-08-23 15:41:32 수정됨

    고고씽~ // 함수형과 절차지향을 혼동하시는 것 같습니다. 흔히 말하는 '함수형 프로그래밍'이란 어떤 기능을 하기 위해선 조건문, 반복문 등을 조합해서 함수를 호출한다는 식의 '명령형(imperative)' 접근과는 오히려 상반된 개념입니다.

    그리고 개인적으로 느끼기엔 객체지향에 너무 익숙해서인지 몰라도 이해하기엔 함수형이 훨씬 어려웠습니다. 전 지금도 솔직히 함수형은 객체지향 만큼 이해하고 자유자재로 쓰지 못합니다.

  • ISA
    3k
    2020-08-23 15:44:20

    Fender //

    그렇기 때문에 모든 것을 객체가 아닌 함수로 이해하는 관점에서는 객체지향의 디자인 패턴은 아예 성립할 수가 없고, 함수형 안에서 자주 사용하는 정형화된 접근에 '패턴' 같은 이름을 붙이더라도, 그 모양은 GoF와는 전혀 다르게 될 것입니다


    가장 효과적인 해결책이라는 측면에서 볼때 디자인 패턴의 이론이 함수형에 적용 안된다가 아니라 달라진다로 이해하면되는건가요?

    달라진다는 측면도 mvc기준이면 모델 뷰 컨트롤러가 달라지는게 아니라 그걸 구성하는게 fp식으로 된다고 이해하면 되는건가요?

  • ISA
    3k
    2020-08-23 15:45:28

    프초딩3 //

    Best practice 저도 이정도로 디자인 패턴을 이해 중인데 색다른 견해를 봐서 글써봤습니다.

  • ISA
    3k
    2020-08-23 15:51:36
  • fender
    19k
    2020-08-23 15:56:31 작성 2020-08-23 16:02:30 수정됨

    ISA //

    제 생각에 패러다임을 이해할 때 다른 패러다임의 비유를 사용하면 오히려 혼란을 초래할 수 있는 것 같습니다. 예컨대 객체지향의 '메서드'가 단순 서브루틴이 아니듯이, 함수형에서 말하는 '타입'은 객체지향의 '클래스'와 동일한 개념이 아닙니다.

    다만 프로그램을 만들 때 서로 다른 패러다임을 섞어서 사용하는 것은 가능합니다. 이건 조금 개인적 주관이 반영된 이야기지만,예들들어 객체지향적으로 구조를 정의하고 구현 단위에서 함수형을 적용한다던지 하는 모양이 이상적일 수도 있습니다.

    정리하면 패러다임은 하나의 언어나 프로젝트에서 혼용할 수 있지만, '패턴'과 같은 개념은 온전히 특정 패러다임에 종속된 것으로 이해하는 것이 좋다고 봅니다.

  • ISA
    3k
    2020-08-23 16:05:10 작성 2020-08-23 16:06:08 수정됨

    Fender //

    그럼 제가 잘못 이해했다기 보다는 용어를 즉 개념에 대해서 별 생각이 없었다고 이해하면 되겠네요. 감사합니다.

    그럼 혹시 함수형에서 패턴등의 개념을 어떤 용어로 지칭하는지 궁금합니다.



    다만 프로그램을 만들 때 서로 다른 패러다임을 섞어서 사용하는 것은 가능합니다. 이 건 조금 개인적 주관이 반영된 이야기지만,예들들어 객체지향적으로 구조를 정의하고 구현 단위에서 함수형을 적용한다던지 하는 모양이 이상적일 수도 있습니다.


    저도 동의합니다 실제로 처음 솔루션 프로그램을 만들때 구조 정의는 객체지향 디자인패턴에 맞게 하고 내부 구성들은 함수형으로 구성해서 짜서 점점 발전시킨 경험이 있습니다. 모델 부분은 oop적용하고 mvp p는 함수형으로 v도 함수형 템플릿으로 짰었네요. 어중간한 지식으로는 그게 제일 편해서 지금 보면 미흡하지만...

    절차지향으로 프로그램 플로우를 보면서 큰틀은 객체지향으로 잡고 내부 구성은 함수형으로 잡는게 가장 편한거 같아요.

  • kkey21a
    4k
    2020-08-23 16:07:24 작성 2020-08-23 16:14:36 수정됨

    ISA//

    링크해주신 글 봤는데, 제가 이야기 하는 것 보다 일부 패턴들을 비교까지 해주며, 자세하게 설명하고 있네요.


    조금 더 간략히 하자면, 프로그래밍 방식에 따라 특정문제에 대한 보완하는 방법이 필요없거나, 라이프사이클, 재사용의 단위가 다르기 때문에 구현 방식에 차이가 있지 않나 생각합니다.


    뭐 저도 최근 회사에서 사용할 프레임웍을 구현하면서, OOP기반에 스레드 처리할 부분만 FP로 구현한 정도라~ 

  • fender
    19k
    2020-08-23 16:19:15

    ISA // 글쎄요, 사실 어느 부분이 '디자인 패턴'에 해당하는지도 좀 애매합니다. '펑터'나 '모나드' 같은 것일 수도 있고, ADT 같은 것일 수도 있고, 어쩌면 함수를 조합(compose)해서 더 큰 무언가를 만들어 내는 접근 자체를 그렇게 볼 수도 있지 않을까 싶습니다.

    확실한 것은 함수형에는 현재 OOP의 GoF 처럼 '디자인 패턴'이란 이름으로 널리 통용되는 무언가는 없다는 것입니다. 대신 그냥 'functional practice', 'functional principle' 정도로 부르는 이런 저런 개념과 원칙, 접근 방법들이 있는 걸로 이해하고 있습니다.

  • birewall
    669
    2020-08-23 16:25:43

    디자인 패턴이나 OOP 모두 방법론에 대한 이야기이지 그 방법을 어떻게 실천하느냐는 언어와 무관하다고 생각합니다.

    C로 임베디드 작업하면서도 디자인 패턴과 OOP 모두 활용하고 있습니다.

    비록 객체지향 언어들에 비해 기능은 부족하지만요

  • kkey21a
    4k
    2020-08-23 16:26:41

    fender//

    함수형에서는 디자인 패턴이라 칭하지 않나보네요?

  • fender
    19k
    2020-08-23 16:35:11

    kkey21a // GoF로 인해서 '디자인 패턴'이 고유명사 비슷하게 되다보니 흔히 팩토리, 스트래티지 등등 일련의 잘 알려진 객체지향적 설계 기법을 부르는 용어로 고착이 된 것 같습니다.


    물론 함수형에서도 이런 저런 접근을 '디자인 패턴'이라고 부르는 경우가 없는 것은 아닙니다만, GoF 처럼 함수형 개발자 대부분 '디자인 패턴'이란 이름으로 이해하는 어떤 일련의 함수형 기법 같은 것이 존재하진 않습니다.

    반면 아무래도 함수형은 객체지향과 자주 비교되고 두 진영 간에 서로 묘한 경쟁의식 같은 것도 있다보니 객체지향적 용어를 그대로 가져와서 쓰는 데도 그다지 호의적이지 않은 듯 합니다.

    예를들어 "함수형에서는 모든 것이 함수이기 때문에 객체지향 같은 디자인 패턴이 필요없다"는 식의 주장도 종종 볼 수 있습니다.


  • 프초딩3
    2020-08-23 17:02:11

    일반적으로 GoF의 패턴 지칭은 개발자들의 커뮤니케이션 수단으로 활용이 되죠. Diagram을 그리는 것보다 말 한마디로 함축 할 수 있으니까요. 

    GoF와 별도로 함수형에서도 Best practice는 있고 언어마다 바뀌죠. Scala의 경우도 cake pattern이 DI의 용도로 사용할 수 있다고 하지만 요즘은 antipattern이라는 인식이 강하고, DI의 경우는 OO이냐 FP상관없이 범용적으로 사용되는 용어이죠. 

    시대도 변하고, 패턴들도 변합니다.

    다중 상속이 좋다고 생각했던 시대도 있었고, Singleton이 GoF의 메인(?)처럼 인식되면서 오용되기도 하고, MVC도 이제 rest나 graphql의 등장으로 사라지고 있는 추세죠.

    그래서 그 Best practice가 언어만의 관점으로 "패턴"이라는 용어에 묶이는 건 아닌 것 같습니다.

  • NPE
    879
    2020-08-23 23:05:56 작성 2020-08-24 10:44:34 수정됨

    디자인 패턴으로 얘기하면 흔히 GoF의 디자인패턴을 칭할텐데,

    이는 "객체"의 행위 중심으로 재사용한 가능한 패턴을 기술합니다.


    FP에서 디자인 패턴에 비견되는 것이라면 범주론(Category Theory) 구현체가 있겠네요.

    여러개의 함수 결합(Composition)에 있어서 재사용 가능한 패턴을 제공하는 라이브러리가 있습니다.

    예를 들어 Scala, Clojure의 Cats(https://typelevel.org/cats/https://funcool.github.io/cats/latest/)가 있겠네요.


  • 하두
    11k
    2020-08-24 00:59:39 작성 2020-08-24 01:01:00 수정됨

    Gof 디자인패턴 객체지향 java 범용화 되기전부터

    프로그램 패턴은 있었습니다.

  • 코딩요정바람돌이
    -1k
    2020-08-24 01:53:34 작성 2020-08-24 01:54:49 수정됨

    추상적이고 모호한 용어의 사용으로

    커뮤니케이션이 끝끝내 이루어지지 않는 오류에 빠지셨군요. ㅎ


    디자인패턴은 객체모델에 종속적인가라는 질문인데.

    싱글톤, 팩토리, 어댑터, 프록시, 옵저버등은 저도 유사하게 사용하는데..

    일단 객체모델에 종속되어 있는 코딩방식이라는 건 맞는 말이죠.

    디자인패턴은 함수포인터 정도를 사용하는 것이지

    펑터(갈호연산자)나 람다(캡쳐된객체)같은 것이

    반드시 필요한 디자인패턴은 없습니다.


    펑터나 람다는 문법적인 사용편의성에 불과하며

    다소의 수작업을 동반하면 다른 방법으로 대체하여 만들 수도 있습니다.

    근데 좀 귀찮죠~ㅎ (매크로를 사용하면 안 귀찮게도 가능합니다~)


  • 로그인을 하시면 댓글 을 등록할 수 있습니다.