관리 메뉴

피터의 개발이야기

[Scala] 스칼라 함수형 프로그래밍 본문

Programming/Scala

[Scala] 스칼라 함수형 프로그래밍

기록하는 백앤드개발자 2024. 9. 11. 10:10
반응형

 


수학은 이해하는게 아니라 익숙해지는것이다.
폰노이만

 

ㅁ 들어가며 

[Scala] 스칼라 기본 문법 정리에서 스칼라의 개념과 기본 문법을 정리하였다. 스칼라는 함수형 프로그래밍을 강력하게 지원하는 언어이다. 이 글은 스칼라에서 함수형 프로그래밍을 적용하는 주요 방법들을 정리해 보았다.

 

ㅁ 불변성(Immutability) 활용

val immutableList = List(1, 2, 3)

ㅇ 스칼라에서는 val 사용하여 불변 변수를 선언할 수 있다. 

ㅇ 이를 통해 side effect를 줄이고 코드의 예측 가능성을 높일 수 있다.

 

ㅁ 순수 함수(Pure Functions) 사용

def add(x: Int, y: Int): Int = x + y

ㅇ 순수 함수는 동일한 입력에 대해 항상 동일한 출력을 반환하며, 외부 상태를 변경하지 않는다.

 

ㅁ 고차 함수

ㅇ 고차 함수는 함수를 인자로 받거나 함수를 반환하는 함수이다.

// 고차 함수 정의
def operateOnNumbers(a: Int, b: Int)(operation: (Int, Int) => Int): Int = {
  operation(a, b)
}

// 고차 함수 사용
val sum = operateOnNumbers(5, 3)((x, y) => x + y)
val product = operateOnNumbers(5, 3)(_ * _)

println(sum)     // 8
println(product) // 15

// 익명의 고차 함수
val numbers = List(1, 2, 3, 4, 5)
val doubled = numbers.map(x => x * 2)

ㅇ operateOnNumbers는 두 숫자와 연산 함수를 인자로 받는 고차 함수이다.

ㅇ 이 함수는 다양한 연산을 수행할 수 있어 유연성이 높다.

val numbers = List(1, 2, 3, 4, 5)
val doubled = numbers.map(x => x * 2)

ㅇ 스칼라에서는 함수를 다른 함수의 인자로 전달하거나 반환값으로 사용할 수 있다.

 

ㅁ 재귀(Recursion)

def factorial(n: Int): Int = {
  if (n <= 1) 1
  else n * factorial(n - 1)
}

ㅇ 반복문 대신 재귀를 사용하여 문제를 해결할 수 있다.

ㅇ 스칼라는 재귀 최적화를 지원한다.

 

ㅁ 패턴 매칭(Pattern Matching)

def describe(x: Any): String = x match {
  case 5 => "five"
  case true => "truth"
  case "hello" => "hi!"
  case Nil => "the empty list"
  case _ => "something else"
}

ㅇ 복잡한 조건문 대신 패턴 매칭을 사용하여 코드를 더 선언적으로 작성할 수 있다.

 

ㅁ 컬렉션 연산

val list = (1 to 10)
val sum = list.reduce(_ + _) // 55

ㅇ 스칼라는 map, filter, reduce 등 함수형 스타일의 컬렉션 연산을 제공한다.

 

ㅁ 옵션 타입(Option Type)

def divide(x: Int, y: Int): Option[Int] = 
  if (y != 0) Some(x / y) else None

ㅇ null 대신 Option을 사용하여 값의 부재를 표현한다.

ㅇ 이 부분은 코틀린의 null safe가 더 좋아 보인다.

 

ㅁ 불변 데이터 구조

val immutableMap = Map("key1" -> "value1", "key2" -> "value2")

ㅇ 스칼라는 불변 리스트, 벡터, 맵 등의 컬렉션을 제공한다.

 

ㅁ 마무리

  이러한 기법들을 활용하면 스칼라에서 함수형 프로그래밍 스타일로 코드를 작성할 수 있다. 함수형 프로그래밍은 코드의 가독성을 높이고, 병렬 처리를 용이하게 하며, 버그를 줄이는 데 도움이 된다. 또한 스칼라는 객체지향 프로그래밍과 함수형 프로그래밍을 혼합하여 사용할 수 있어, 상황에 따라 적절한 패러다임을 선택할 수 있는 유연성을 제공한다. 개인적으로 코틀린을 먼저 공부하고 스칼라를 공부하여 유사한 점이 많아 쉽게 이해할 수 있는 부분도 있었지만, null-safe나 scope 연산자가 있는 코틀린이 더 유용해 보인다.

 

ㅁ 함께 보면 좋은 사이트

스칼라 문서 및 Playground

스칼라 문법 총정리

반응형

'Programming > Scala' 카테고리의 다른 글

[Scala] flatMap과 match을 사용하는 법  (0) 2024.11.26
[Scala] 스칼라 기본 문법 정리  (2) 2024.09.10
Comments