throw
has a type: Nothing
in Scalathrow
는 왜 타입이 필요할까? 아래 예문을 살펴보자.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")
}
몇가지 특이한 점을 발견할 수 있다.
Int
이다. 그런데 divid 함수의 본문은 if/else
뿐이며 if
와 else
의 반환 타입이 다르다.Nothing
이다. 그런데 error함수의 본문은 throw
뿐이다. throw
가 되면 실행이 중지될 텐데 타입이 왜 필요할까?차세대 자바 프로그래밍 스타일 에서도 살펴본 것과 같이 loop가 컬렉션을 다루는 가장 좋은 방법은 아니다. loop는 코드의 가독성을 빠르게 망가뜨린다. 함수가 1급 객체인 언어들에서는 이러한 loop를 명시적으로 노출시키지 않고 고차 함수 로 추상화 시킨다. 이런 추상화 덕분에 컬렉션을 다루는 방법이 매우 간결하고 직관적이다.
자바에서도 함수형 스타일로 컬렉션을 다루고자 한 시도로 lambdaj 프로젝트가 있다.
lambdaj가 만들어진 이유는 다음과 같다
복잡한 데이터 모델을 다루는 프로젝트에서 비즈니스 로직의 상당 부분은 어떤 작업을 위해서 비지니스 객체의 컬렉션을 순회하는 일의 반복이다. loop는 조건이 추가되거나 중첩되기 시작하면 코드를 작성하는것 보다 읽기가 더 어려워진다. 그렇기 때문에 비지니스 로직이 조금 더 기술적인 부분과 분리되어 작성되기를 원한다.
[1, 2, 3].map(parseInt)를 실행하면 어떤 결과가 나올까?
결과는 [1, Nan, Nan]이 나오는데 원인은 map 함수의 구현과 가변 인자 때문에 발생한다.
먼저 아래 식에 실행 결과를 확인해 보자
['1', '2', '3'].map( function(v, i, o){
return parseInt(v)
}; // [1, 2, 3]
많은 회사와 개발자들이 자바로부터 새로운 언어인 Ruby, Python, Groovy, Erlang, Scala 등으로 이동했다.
여전히 자바를 사용하고 있을지 모르겠지만, 자바를 사용하더라도 프로그래밍 스타일을 바꿀 수 있고, 새로운 언어로부터 여러 이점을 취할 수 있다.
최근 15년 동안 자바의 프로그래밍 스타일은 매우 많이 변했다.