람다식이 가져다줄 자바프로그래밍의 변화는 무엇이 있을까요?

2013-07-10 10:21

요새 C#을 다루다보니 느낀게 있다면 람다식을 이용한 이벤트 처리가 손쉽다는 정도 입니다. a 클래스의 메소드가 처리될 시점에 a 클래스를 인스턴스변수로 구성중인 b클래스의 메소드를 실행할 수 있는 정도로요;; 물론 람다식에 대해 제대로 알고 쓰는건 아니고;; 예전에 한창 이벤트 기반 프로그래밍 얘길 군대에 있을때 들었던 것 같네요... 몇안되는 경험을 바탕으로 얘기를 꺼내보았습니다 ㅎㅎ

BEST 의견 원본위치로↓
2013-07-18 19:53

저는 2000년 후반의 큰 변화는 함수의 중요성을 재발견한 것이라고 생각합니다. 일단 프로그래밍을 DSL을 만드는 과정으로 보는 Lisp과 Smalltalk의 전통이 다시 조명을 받았고, OOP의 객체 수준 추상화가 아닌 함수 추상화의 가치가 인정 받았다고 생각합니다.

객체 수준의 추상화는 매우 강력한 도구임에도 불구하고 작은 일에 적용하기에는 비용이 비싼 도구인데 함수를 추상화(변하는 것과 변하지 않는 것을 분리)하는 고차함수를 통해 OOP를 적용할 만큼 큰 추상화가 아닌 경우에도 추상화가 가능해졌습니다.

사실 스프링의 JdbcTemplate 같이 콜백 객체를 넘기는 코딩 스타일이 자바 방식의 고차함수였다면, 이를 문법적으로 간결하고 쉽게 표현하도록 해준 것이 람다식입니다.

다음은 스프링 4에서 람다식을 사용하도록 변경될 jdbctemplate의 사용 예입니다.

t.query("SELECT name, age FROM person WHERE dep = ?", 
   ps -> { ps.setString(1, "Sales"); },
  (rs, rowNum) -> new Person(rs.getString(1), rs.getInt(2)));

지금은 이런 식이죠

t.query("SELECT name, age FROM person WHERE dep = ?", 
   new PreparedStatementSetter {
      public void setValues(PreparedStatement ps) {
         ps.setString(1, "Sales");
      }
   },
   new RowMapper<Person> {
      public Person mapRow(ResultSet rs, int rowNum) {
         return new Person(rs.getString(1), rs.getInt(2));
      } 
   }) 

즉 자바는 기존에도 클로저가 있었고 콜백도 가능했으나 문법적인 지원이 없어서 코드를 읽기도 힘들고 작성하는 비용도 무척 비쌌다면 람다식의 도입으로 훨씬 간결하게 코드를 작성하면서 함수를 추상화하기 좋게 되었습니다. 덕분에 함수 단위의 추상화가 활성화되게 되었습니다. op4j나 lambaj 같은 프로젝트를 보면 람다식이 도입된 이후의 모습을 약간 엿볼 수 있습니다.

KSUG 번역팀에서 번역하고 있는 글인데 함 읽어 보시면 도움이 될 겁니다.

http://java.dzone.com/articles/why-we-need-lambda-expressions http://java.dzone.com/articles/why-we-need-lambda-expressions-0

9개의 의견 from SLiPP

2013-07-10 13:36

@kimmunsu 람다식에 대해서 모르는 개발자가 많다고 생각한다. 네가 람다식에 대해서 좀 더 부연 설명해준다면 더 좋은 답변 받을 수 있지 않을까? 그리고 람다식은 C# 뿐만 아니라 이미 많은 언어에서 사용하고 있어서 친숙한 친구들도 많을 듯하다.

나도 람다식을 많이 사용해 보지 않아서(거의 자바 위주로 프로그래밍을 하다 보니까...) 변화를 이야기하기는 뭐하지만 한마디 남겨본다면...

람다식은 좀 더 프로그래밍을 간결하게 구현할 수 있고, 일단 그 맛을 본 사람은 람다식을 쓰고 싶은 욕구가 많을 듯하다. 자바로 구현하다가 C로 구현하면 짜증나는 부분이 많다고 느끼듯이.. 변화라고 한다면 람다 표현식을 잘 쓰던 개발자가 자바로 구현할 때 짜증나던 부분을 해소해 줄 수 있는 정도 아닐까? 그 외에 어느 정도의 변화가 있을지는 잘 모르겠다. 람다식에 대한 경험이 풍부한 사람이 답변해 주리라 믿는다.

2013-07-18 19:53

저는 2000년 후반의 큰 변화는 함수의 중요성을 재발견한 것이라고 생각합니다. 일단 프로그래밍을 DSL을 만드는 과정으로 보는 Lisp과 Smalltalk의 전통이 다시 조명을 받았고, OOP의 객체 수준 추상화가 아닌 함수 추상화의 가치가 인정 받았다고 생각합니다.

객체 수준의 추상화는 매우 강력한 도구임에도 불구하고 작은 일에 적용하기에는 비용이 비싼 도구인데 함수를 추상화(변하는 것과 변하지 않는 것을 분리)하는 고차함수를 통해 OOP를 적용할 만큼 큰 추상화가 아닌 경우에도 추상화가 가능해졌습니다.

사실 스프링의 JdbcTemplate 같이 콜백 객체를 넘기는 코딩 스타일이 자바 방식의 고차함수였다면, 이를 문법적으로 간결하고 쉽게 표현하도록 해준 것이 람다식입니다.

다음은 스프링 4에서 람다식을 사용하도록 변경될 jdbctemplate의 사용 예입니다.

t.query("SELECT name, age FROM person WHERE dep = ?", 
   ps -> { ps.setString(1, "Sales"); },
  (rs, rowNum) -> new Person(rs.getString(1), rs.getInt(2)));

지금은 이런 식이죠

t.query("SELECT name, age FROM person WHERE dep = ?", 
   new PreparedStatementSetter {
      public void setValues(PreparedStatement ps) {
         ps.setString(1, "Sales");
      }
   },
   new RowMapper<Person> {
      public Person mapRow(ResultSet rs, int rowNum) {
         return new Person(rs.getString(1), rs.getInt(2));
      } 
   }) 

즉 자바는 기존에도 클로저가 있었고 콜백도 가능했으나 문법적인 지원이 없어서 코드를 읽기도 힘들고 작성하는 비용도 무척 비쌌다면 람다식의 도입으로 훨씬 간결하게 코드를 작성하면서 함수를 추상화하기 좋게 되었습니다. 덕분에 함수 단위의 추상화가 활성화되게 되었습니다. op4j나 lambaj 같은 프로젝트를 보면 람다식이 도입된 이후의 모습을 약간 엿볼 수 있습니다.

KSUG 번역팀에서 번역하고 있는 글인데 함 읽어 보시면 도움이 될 겁니다.

http://java.dzone.com/articles/why-we-need-lambda-expressions http://java.dzone.com/articles/why-we-need-lambda-expressions-0

의견 추가하기

연관태그

← 목록으로