데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Java 와 Javascript 함수형 프로그래밍에 대해

      박제영 24.04.09
      2,847 7 0
      DEVOTEE 요약
      Java와 JavaScript는 서로 다른 언어이며, 각각 객체지향 프로그래밍과 프로토타입 기반 프로그래밍을 지원합니다. 둘 다 함수형 프로그래밍을 지원하며, 순수 함수와 부수 효과를 최소화하는 패러다임을 따릅니다. JavaScript는 ES5 이후에 함수형 프로그래밍을 더욱 간결하게 작성할 수 있게 되었고, Java는 버전 8부터 람다 표현식을 통해 함수형 인터페이스를 지원하게 되었습니다.
      DEVOTEE 추천 블로그

      Java 와 Javascript 의 함수형 프로그래밍에 대해 알아 보겠습니다.

      먼저, 다들 아시겠지만 Java 와 Javascript 는 왠지 이름이 비슷해 보이지만 전혀 다른 언어 입니다.


      Java

      Java는 썬마이크로 시스템에 근무하던 제임스 고슬링과 그의 동료들이 만든 프로젝트에서 시작되어 1995년 1.0 버전을 치최초로 공개한 언어 입니다.

      image.png

      당시에 객체지행 개념과 멀티 쓰레드를 지원하는 웹 프로그래밍의 지원으로 개발자들에게 널리 확산되어 자리를 잡을 수 있었고,

      JVM 이라는 가상 머신기반에서 OS와 독립적으로 돌아가는 구성은 컴퓨터 뿐만이 아니고 여러 소형 전자기기에서도 사용할 수 있기 때문에

      많은 관심과 다양한 Library 들의 지원도 받을 수 있었죠.


      Javascript

      Javascript 는 자바보다 비슷한 시기인 1995년.5월에 공개되었으며 당시 인터넷 브라우저의 높은 점유율을 보이고 있던 네스케이프 사에서 동적인 브라우저 구성을 위해

      브랜든 아이크를 영입해서 개발한 모카라는 언어의 이름을 당시 자바 언어의 인기에 살짝 묻어 가기 위해 "자바 스크립트" 로 변경했다고 합니다.

      image.png


      함수형 프로그래밍

      두 언어는 각기 서버 분야와 웹 클라이언트 분야에서 많은 Eco-System 들을 구성하면서 발전을 하게 됐습니다.


      Java 는 아시다시피 객체지행 개념을 공부하고 학습하고 적용하기에 좋은 언어입니다.

      그런데 자바 스크립트도 혹시 개체지행을 완벽히 지원한다는 것을 아시나요?

      자바와는 약간 다르지만 Prototype 기반의 객체지행을 지원하기 때문에 자바 스크립트도 객체지행 언어로 봐야 합니다.


      자바와 자바스크립트 모두 "함수형 프로그래밍" 을 지원 합니다.

      먼저 함수형 프로그램이 무엇인지 살펴 보겠습니다.


      함수형 프로그램은 '부수효과(Side-Effect)' 가 없는 순수한(Pure) 함수 기반의 프로그래밍 패러다임 이라고 보시면 될것 같습니다.


      여기서 말하는 부수효과란 멱등성(여러 번 실행해도 항상 동일한 결과를 가져오는) 을 완벽히 지원하고 외부의 상태를 변경하거나 참조하지 말아야 하는 것을 말합니다.


      Javascript의 예를 보겠습니다.

      "use strict";
      
      let env = 10;
      
      function sum(value) {
        env = env + value;
        return env;
      }
      
      console.log(sum(10)); // 20
      console.log(sum(10)); // 30

      동일한 함수에 동일한 값인 10을 지정했지만 함수를 호출할 때마다 다른 값을 리턴 합니다.

      이는 외부 변수인 env 를 함수가 참조하고 있기 때문이죠.

      (여기서 잠깐! 아직도 변수 선언시 var 를 사용하실 수 있는데 이제는 let, const 를 사용하셔야 합니다 ^^)

      "use strict";
      
      function sum(value) {
        let env = 10; // 클로저(함수가 종료되도 참조값이 존재하게 된다)
      
        return function () {
          return env + 10;
        };
      }
      
      console.log(sum(10)()); // 20
      console.log(sum(10)()); // 20

      위에 함수처럼 외부참조를 하지않고, 함수 내에서 클로저를 사용하면 여러번 호출해도 동일한 값을 출력하게 됩니다.


      자바 스크립트에서 함수는 일급함수(first-class function) 입니다.


      일급함수에 대한 기본 조건이 있지만,

      저는 간단하게 함수를 값으로 취급할 수 있으며 함수에 함수를 인자(arguments) 로 전달할 수 있게 결과값으로 함수를 리턴할 수도 있다 라고 이해를 했습니다.


      함수에 함수를 전달함으로써 얻는 프로그래밍의 이점은 함수가 간결해질 수 있다는 점인데요..

      이 말은 예를 들어 두 함수가 90% 정도 유사한 기능인데 10% 정도만 다른 기능을 가질 경우 공통의 함수를 만들고, 차이점을 함수의 인수로 전달 받을 수 있게 만들 수 있다는 것입니다.

      이와 같이 하면 callback 함수를 사용해서 비동기 프로그래밍도 쉽게 구사할 수 있게 되겠죠.

      (자바 스크립트의 놀라운 점은 비동기 프로그램을 아주 손쉽게 만들 수 있다는 점인것 같습니다)


      자바 스크립트의 큰 변화가 생긴 ES5(ECMA Script) 이후부터 화살펴 함수(arrow-function)을 사용함으로써 더욱더 간결하게 함수형 프로그래밍을 작성할 수 있게 됐습니다.

      "use strict";
      
      function sum(value) {
        let env = 10; // 클로저(함수가 종료되도 참조값이 존재하게 된다)
      
        return () => {
          let result = env + 10;
          return result;
        };
      }
      
      console.log(sum(10)());
      console.log(sum(10)()); 

      자바도 자바8 부터 함수형인터페이스(Functional Interface) 를 통해서 함수형 프로그래밍을 지원하게 됐고

      Lambda 표현식을 사용함으로써 자바스크립처럼 화살표 함수로 간결하게 표현할 수 있게 됐습니다.

      (자바는 ->, 자바 스클비트는 => 입니다 ^^)


      함수형 인터페이스는 추상메서드가 단 하나인 인터페이스를 얘기하며,

      자주 사용하는 함수형태를 미리 인터페이스로 구성을 해 놓은 것이라고 보면 될것 같습니다.

      Predicate, Function, Consumer, Supplier, BIConsumer 등..

      @FunctionalInterface
      public interface Predicate<T> {
      
          /**
           * Evaluates this predicate on the given argument.
           *
           * @param t the input argument
           * @return {@code true} if the input argument matches the predicate,
           * otherwise {@code false}
           */
          boolean test(T t);

      여기, 사과의 색과 무게로 사과를 필터링 하는 프로그램이 있다고 생각해 보겠습니다.


      Apple.java

      @Getter
      @Setter
      @ToString
      public class Apple {
          public String color;
          public int weight;
              public Apple() {
          }
      
          public Apple(String color, int weight) {
              this.color = color;
              this.weight = weight;
          }

      무게를 필터링 하는 isHevayWeight() 와 녹색인 사과를 필터링하는 isGreenApplie 이 있습니다.

      이 두 함수는 사과를 넘겨받아서 녹색인지를 판단하고, 무게가 일정 이상인지를 판단하는 함수이며 대부분 일치하지만 색상비교와 무게비교라는 부분만 틀립니다.

      이 경우 아래처럼 filterApplie 이라는 함수를 사용해서 간략하게 표시할 수 있습니다.

      public class App {
      
          private static final String GREEN = "GREEN";
      
          public static boolean isGreenApple(Apple apple){
              return GREEN.equals(apple.getColor());
          }
      
          public static boolean isHeavyApple(Apple apple){
              return apple.getWeight() > 150;
          }
      
          static List<Apple> filterApple(List<Apple> inventory, Predicate<Apple> p){
              List<Apple> result = new ArrayList<>();
      
              for(Apple apple:inventory){
                  if(p.test(apple)) result.add(apple);
              }
      
              return result;
          }
      
          public static void main(String[] args) {
              Apple apple1 = new Apple("GREEN", 150);
              Apple apple2 = new Apple("RED", 180);
              Apple apple3 = new Apple("GREEN", 170);
      
              List<Apple> apples = List.of(apple1, apple2, apple3); 
      
            filterApple(apples, a -> a.getWeight() > 150);
              filterApple(apples, a -> a.getColor().equals(GREEN));
              filterApple(apples, a -> a.getWeight() > 150 && a.getColor().equals(GREEN));
               
          }
      }

      또는 자바 8의 메서드참조를 이용해서, 더 간결하게 표시할 수 있겠죠.

      System.out.println(filterApple(apples, App::isHeavyApple));
              System.out.println(filterApple(apples, App::isGreenApple));

      filterApple() 메서드의 인수로 지정한 Predicate 함수는 함수형 인터페이스 입니다.


      자바스크립트와 자바는 분명 다른 언어지만, 각기 객체지행 개념을 완벽히 가지고 있고 또한 함수형 프로그래밍을 할 수 있습니다.

      객체지행과 함수형 프로그래밍 패러다임은 다른 의미이지만 상호 보완 개념이라고 볼 수 있겠습디다.


      함수형 프로그래밍에서 사용하는 클로저 개념을 사용하면 보안에도 더욱 안전한 프로그래밍을 만들 수 있습니다.


      이번 포스트는 자바와 자바스크립트의 함수형 프로그래밍에 대해 아주 간략하게 알아봤으며, 다음 기회에 좀 더 자세한 예를 포스트 하겠습니다.


      읽어 주셔서 감사합니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      박제영 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기