About Programming Languages :)

contributors

daewon
@blueiur


Why throw has a type: Nothing in Scala

Scala에서 throw 는 왜 타입이 필요할까? 아래 예문을 살펴보자.

def error(message: String): Nothing = throw new RuntimeException(message)
def divide(x: Int, y: Int): Int = {
  if (y != 0) x / y
  else error("can't divide by zero")
}

몇가지 특이한 점을 발견할 수 있다.

  1. divid 함수의 반환 타입은 Int이다. 그런데 divid 함수의 본문은 if/else 뿐이며 ifelse의 반환 타입이 다르다.
  2. error 함수의 반환 타입은 Nothing이다. 그런데 error함수의 본문은 throw 뿐이다. throw가 되면 실행이 중지될 텐데 타입이 왜 필요할까?

Read more...

자바에서는 일반적으로 loop를 기반으로 컬렉션을 다룬다.

차세대 자바 프로그래밍 스타일 에서도 살펴본 것과 같이 loop가 컬렉션을 다루는 가장 좋은 방법은 아니다. loop는 코드의 가독성을 빠르게 망가뜨린다. 함수가 1급 객체인 언어들에서는 이러한 loop를 명시적으로 노출시키지 않고 고차 함수 로 추상화 시킨다. 이런 추상화 덕분에 컬렉션을 다루는 방법이 매우 간결하고 직관적이다.

자바에서도 함수형 스타일로 컬렉션을 다루고자 한 시도로 lambdaj 프로젝트가 있다.

lambdaj가 만들어진 이유는 다음과 같다

복잡한 데이터 모델을 다루는 프로젝트에서 비즈니스 로직의 상당 부분은 어떤 작업을 위해서 비지니스 객체의 컬렉션을 순회하는 일의 반복이다. loop는 조건이 추가되거나 중첩되기 시작하면 코드를 작성하는것 보다 읽기가 더 어려워진다. 그렇기 때문에 비지니스 로직이 조금 더 기술적인 부분과 분리되어 작성되기를 원한다.


Read more...

[1, 2, 3].map(parseInt)를 실행하면 어떤 결과가 나올까?

wrongresult

결과는 [1, Nan, Nan]이 나오는데 원인은 map 함수의 구현과 가변 인자 때문에 발생한다.

먼저 아래 식에 실행 결과를 확인해 보자

['1', '2', '3'].map( function(v, i, o){ 
    return parseInt(v) 
}; // [1, 2, 3]

Read more...

차세대 자바 프로그래밍 스타일

많은 회사와 개발자들이 자바로부터 새로운 언어인 Ruby, Python, Groovy, Erlang, Scala 등으로 이동했다.

여전히 자바를 사용하고 있을지 모르겠지만, 자바를 사용하더라도 프로그래밍 스타일을 바꿀 수 있고, 새로운 언어로부터 여러 이점을 취할 수 있다.

최근 15년 동안 자바의 프로그래밍 스타일은 매우 많이 변했다.

  • Final is your new love

Read more...