자바

[모던 자바 인 액션] OOP와 FP의 조화: 자바와 스칼라 비교

__Minnie_ 2025. 5. 29. 00:02
자바와 스칼라를 비교하는 이유

 

스칼라는 객체지향과 함수형 프로그래밍을 혼합한 언어로, JVM에서 수행되며, 자바의 모든 라이브러리를 사용할 수 있는 언어다. 스칼라는 자바에 비해서 더 다양하고 심화된 기능을 제공하기 때문에, 스칼라와 자바를 비교함으로써 자바의 한계를 느낄 수 있다.

 

스칼라의 컬렉션

 

val authorsToAge = Map("Raoul" -> 23, "Mario" -> 40, "Alan" -> 53)

자바의 경우 맵 생성시에 복잡한 문법을 통해서 맵을 생성하지만 스칼라의 경우 -> 을 통해서 간편하게 생성할 수 있다. 또한 자바의 경우 생성시 변수의 형식을 지정해주어야 하지만, 스칼라에서는 따로 지정하지 않아서 자동으로 변수형을 추론한다. 또한 val, var이라는 두가지 키워드를 제공하는데 val은 변수가 읽기 전용임을 의미하고, var은 읽고 쓸 수 있는 변수를 의미한다.

 

또한 스칼라의 불변 컬렉션의 경우 앞에서 나온 영속이라는 개념을 가지고 있다. 따라서, 업데이트를 하는 경우 새로운 컬렉션을 만드는 방식으로 자료구조를 업데이트한다. 

 

스칼라의 컬렉션은 기본적으로 자바의 스트림과 비슷한 기능을 제공하여 filter, map같은 기능들이 제공된다. 또한 언더스코어와 같은 기능을 제공해서 더 간편하게 사용할 수 있다.

 

또한 자바에서는 제공하지 않는 pair를 스칼라에서는 튜플로 제공하고 있다. (자바에서는 Apache common 라이브러리를 통해서 사용 가능). 

 

스칼라에서도 스트림이라는 기능을 제공하는데, 자바의 스트림보다 더 다양한 기능을 제공한다. 자바와 다르게 스칼라는 이전 요소가 접근할 수 있도록 계산값을 기억하고, 스트림을 인덱스로 접근할 수 있다. 이런 특징 때문에 자바보다 메모리 효율성이 떨어진다.

 

또한 자바의 옵셔널과 동일한 기능을 제공하는 옵션도 제공한다. 

 

 

스칼라의 함수

 

스칼라의 함수는 일급값이며, 익명 함수 개념을 지원한다. 또한 자바에서는 지원되지 않는 클로저라는 개념을 지원한다. 클로저란 함수의 비지역 변수를 자유롭게 참조할 수 있는 함수의 인스턴스를 의미한다.

def main(args: Array[String]) {
	var count = 0
    val inc = () => count += 1
    inc()
    println(count)
    inc()
    println(count)
}

 

 

스칼라의 커링

 

커링이란 x, y라는 두 인수를 가진 f라는 함수가 있을 때, 하나의 인수를 받는 g라는 함수 그리고 g라는 함수는 다시 나머지 인수를 받는 함수로 반환하는 것을 의미한다. 스칼라에서는 기존 함수를 쉽게 커링할 수 있는 방식을 지원한다.

def multiplyCurry(x: Int)(y: Int) = x + y

var r = multiplycurry(2)(10)

 

 

스칼라의 클래스

 

스칼라의 클래스는 자바와 비슷한 클래스 문법을 제공한다. 단, 자바에서는 필드 리스트를 정의하고 각 필드 개수별로 게터와 세터를 설정해주어야 한다. 하지만, 스칼라에서는 생성자, 게터, 세터가 암시적으로 생성된다. 

 

 

스칼라의 트레이트

 

스칼라의 트레이트는 자바의 인터페이스와 유사한 기능이다. 트레이트는 추상메서드와 기본 구현을 가진 메서드를 구현할 수 있으며, 다중 상속이 가능하다. 트레이트는 다중 상속이 가능하다는 점에서 자바의 추상 클래스와 다르고, 상태를 가질 수 있다는 점에서 자바의 인터페이스와 구분된다. 독특한 점은 트레이트는 객체의 인스턴스화 타이밍에도 조합할 수 있다는 점이다. 

class Box
val b1 = new Box() with Sized