alan
1k
2018-04-13 18:35:02 작성 2018-04-13 18:37:24 수정됨
8
1157

함수형 프로그램 배우는 중 불편하다고 생각하는 점


단순히 함수를 1급 객체로 사용하고

map, reduce 좀 쓰면 함수형 프로그래밍인 줄 알았는데

공부를 하니까 프로그래밍 개념이 객체지향프로그래밍하고 차이가 많이 나네요

객체지향 프로그래밍에서는 호이스팅이 당연한 것처럼 생각합니다. (제가 지금까지 해온바로는)

함수형 프로그래밍에서는 호이스팅 최대한 안하고 함수를 다 상수로 받는데

뭔가를 추가하려면 절차적인 걸 생각을 해야 되니까 뭔가 좀 많이 불편한 것 같아요

함수형 프로그램에서는 상수로 받다보니 호이스팅을 못하는 건지 호이스팅도 제한해야 할만한 이유가 있는 건지 궁금합니다.

현재 리액트 공부하면서 같이하고 있는데요. 이런 특징이 함수형 프로그램의 전반적 특징이 아니라 javascript의 문제인 걸까요?

0
0
  • 답변 8

  • LichKing
    14k
    2018-04-13 18:36:36

    음..호이스팅이 뭐길래 객체지향프로그래밍에서 당연하죠?

    제가 아는 호이스팅은 자바스크립트 호이스팅밖에 없는데..


    0
  • alan
    1k
    2018-04-13 18:39:31

    메서드나 함수를 부를 때 전체 코드에서 찾아서 사용하는 걸 호이스팅으로 알고 있는데

    제가 개념을 좀 잘못잡고 있는 걸까요

    자바에서 같은 클래스내에서 메서드를 부를 때 메서드의 위치는 상관이 없는데

    이것도 호이스팅으로 알고 있거든요.


    0
  • 콰스웩스익조트
    425
    2018-04-13 20:06:54

    자바스크립트는 인터프리터 언어이고 인터프리터 언어의 특징이 코드를 한줄 한줄 읽어서 번역 및 실행 합니다.그렇기 때문에 만약 같은 컨텍스트 범위의 100번째 라인에서 130번째에서 정의된 함수를 실행하려고 하면 130번째 라인은 실행된 적이 없기때문에 그 함수는 존재하지 않아서 원래라면 에러가 떠야 해요. 이런 제약을 없애주는 자바스크립트 특성이 호이스팅입니다..

    반면에 자바는 컴파일 언어라서 애초에 상황이 달라요.

    그래서 작성자님이 지금 햇갈려 하시는 부분인 함수형 프로그래밍과 호이스팅은 별로 연관성이 없습니다..

    0
  • alan
    1k
    2018-04-13 20:34:27

    제가 호이스팅이라는 용어를 잘못 이해했네요.

    그러면 호이스팅이라는 단어는 배제를 하고

    아래 있는 메서드나 함수를 사용할 수 있는 경우와 아닌 경우는

    컴파일이냐 인터프리터냐의 문제가 아니라 절차우선이냐 아니냐로 생각해야 되는데요.

    자바도 Function fn = new Function() { ... }

    으로 함수를 사용하려면 절차적으로 먼저 할당 되어야 사용할 수 있으니까요.

    혼선이 있으니 객체지향이라는 개념도 배제하겠습니다.

    제 요점을 정리하면

    코드상 아래 있는 메서드나 함수를 사용할 수 있는 것은 상당히 편리합니다.

    리액트로 함수형 프로그래밍을 하고 있다고 생각하고 있는데요.

    소개된 코드들은 함수들을 모두 변수에 할당하고 있습니다.

    그런데 이런 식으로 하면 중간에 새로운 함수를 넣을 때마다 절차를 생각해야 되니

    상당히 불편합니다. 그런데 이런 방식을 강요(?)하는 이유가 궁금합니다.


    0
  • LichKing
    14k
    2018-04-13 22:50:51

    사실 댓글로 이어쓴 질문도 이해는 안갑니다만...

    자바는 컴파일시점과 런타임시점이 있습니다. 예로들어주신 객체생성은 런타임시점에 작동합니다. 동적할당이죠. 코드는 위에서 아래로흐릅니다. 그렇기때문에 동적할당이 이뤄진다음에 그 객체에서 메서드를 호출해야하는겁니다.

    그럼 클래스 내에서 어떻게 위에있는 메서드가 아래있는 메서드를 호출하느냐? 이건 컴파일타임에 결정나게됩니다. 그 클래스에 어떤 메서드가 있고없고는 컴파일타임에 체크하기때문에 메서드위치에 상관없이 호출할 수 있습니다.


    아래있는 함수를 호출할수있냐없냐는 함수형이랑은 전혀 상관이 없습니다.

    0
  • taeWoo
    552
    2018-04-14 00:39:54

    자바스크립트에서 호이스팅이 되는건 자바스크립트는 맨 처음 전역스코프에 있는 함수나 변수를 먼저 위로 올려서 보기땜에 그렇고요,

    자바 같은 경우에는 위에 댓글대로고,

    함수형 언어는 잘 모르는데 함수형 언어도 객체지향처럼 만들어서 쓰면 되긴할텐데, 그것도 객체 정의 위에서 객체를 불러서 쓰면 안되겠죠??(함수형 언어 잘 모름)

    0
  • alan
    1k
    2018-04-14 01:33:03

    호이스팅이 무엇인지 어떻게 아래쪽에 있는 함수를 불러오냐가 중요한 것은 아닌데 제가 처음부터 글을 잘못썼네요 ㅜㅜ

    저는 지금까지 보통 메서드로 로직을 빼낼 때 바로 아래쪽에다 배치를 했습니다.

    그래야 찾아보기도 쉽고요.

    계속 추가하다보면 위치가 좀 꼬이겠죠.

    그거 위치 좀 꼬인다고 프로그램이 잘못되지는 않습니다.

    그런데 리액트 관련 책을 보는데(Learning React(O'reilly) )

    function functionName() { } 이런식으로 선언을 하지 않고

    const functionName = () => { } 이런식으로 선언을 합니다.

    이러면 선언순서를 신경써야 되는데 거의 모든 함수를 이런식으로 선언합니다.

    이게 함수형 프로그래밍의 특징중 하나라고 생각을 했고 뭔가 불편함을 느낀겁니다.

    꼭 이렇게 안해도 프로그래밍을 할 수 있으니까요.

    물론 저렇게 다 변수로 빼 놓으면 ES6 이후 적용된 여러 편리한 문법을 적용할 수 있습니다.

    또 네임스페이스를 만들어 관리할 수도 있고요.

    어떻게 하다보니 자문 자답이 됐는데

    모듈화해서 export하기 위해서는 어느정도 강제된 측면이 있네요.

    이런식 프로그래밍을 공부한지 얼마 안되서 이상한 점이 많았습니다.

    답변 해주신 분들 감사합니다.

    0
  • LichKing
    14k
    2018-04-14 12:17:39

    말씀하신게 호이스팅과 연관이 있네요.

    function name(){}

    형태로 선언하면 호이스팅에 의해 함수가 아래 정의되어있어도 호출할 수 있습니다.

    (함수선언식과 표현식에 따라 좀 다른데 둘다 호이스팅으로 변수는 선언되지만 선언식은 함수레퍼런스까지 갖게되고 표현식은 변수만 선언됩니다. 이건 더 깊은 얘기니 따로 찾아보심이..)

    const 및 애로우함수는 ES6 스펙인데 이건 호이스팅이 되지않기때문에 사용하는곳보다 위에서 선언해야하고요.

    마찬가지로 함수형 프로그래밍과는 별 연관은 없고 자바스크립트 스펙을 공부해보시는게 좋을것같아요.

    1
  • 로그인을 하시면 답변을 등록할 수 있습니다.