관리 메뉴

피터의 개발이야기

[Scala] 스칼라 기본 문법 정리 본문

Programming/Scala

[Scala] 스칼라 기본 문법 정리

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

ㅁ 들어가며

ㅇ AI팀으로 이동하면서 다양한 언어를 배우고 있다. 

ㅇ 스칼라의 개념과 기본 문법을 정리하였다.

ㅇ 문법 중에서도 함수형 코딩을 [Scala] 스칼라 함수형 프로그래밍에 정리하였다.

 

ㅁ Scala란?

ㅇ 2004년 마틴 오더스키가 발표한 멀티-패러다임 프로그래밍 언어
ㅇ 객체지향과 함수형 프로그래밍을 결합한 하이브리드 언어

 

ㅁ 주요 특징

순수 객체지향: 모든 값이 객체이며, 함수도 객체로 취급
함수형 프로그래밍: 순수 함수, 익명 함수, 고차 함수 지원
JVM 기반: 자바 가상 머신 위에서 동작하여 자바 라이브러리 사용 가능
바이트 코드 최적화: 자바보다 약 20% 빠른 속도
동시성 강화: 불변 변수와 순수 함수를 통한 병렬 프로그래밍 지원

 

ㅁ 스칼라의 프레임워크

ㅇ 스칼라에는 다양한 프레임워크가 있다. 주요 스칼라 프레임워크들을 정리하면 다음과 같다.

웹 프레임워크

Play Framework:

 ㄴ 가장 인기 있는 스칼라 웹 프레임워크 중 하나

 ㄴ RESTful 애플리케이션 개발에 적합하며, 높은 확장성과 성능을 제공
Akka HTTP: Akka 액터 시스템을 기반으로 한 경량 웹 프레임워크로, 비동기 및 스트리밍 처리에 강점
http4s: 순수 함수형 프로그래밍 스타일의 HTTP 서버 및 클라이언트 라이브러리

빅데이터 및 분산 시스템

ㅇ Apache Spark: 대규모 데이터 처리를 위한 분산 컴퓨팅 프레임워크로, 스칼라로 작성되었습니다.
ㅇ Akka: 분산 시스템 및 동시성 애플리케이션 개발을 위한 툴킷입니다.

데이터베이스 액세스

Slick: 함수형 관계형 매핑(FRM) 라이브러리로, 타입 안전한 데이터베이스 쿼리를 작성할 수 있습니다.
Doobie: 순수 함수형 JDBC 레이어로, 타입 안전한 데이터베이스 액세스를 제공합니다.

테스트 프레임워크

ScalaTest: 스칼라를 위한 유연한 테스트 프레임워크입니다.
Specs2: 소프트웨어 명세와 테스트를 위한 라이브러리

 

ㅁ 주요 문법 정리

변수 선언

val x = 1 // x는 변경 불가
var y = 2 // y는 변경 가능

ㅇ 스칼라에서는 두 가지 방식으로 변수를 선언할 수 있다.

  • val: 변경 불가능한(immutable) 변수 선언
  • var: 변경 가능한(mutable) 변수 선언
val z: Int = 3

ㅇ 타입을 명시적으로 지정할 수도 있다.

함수 정의

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

ㅇ 함수는 def 키워드를 사용하여 정의한다.

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

ㅇ 함수 본문이 한 줄인 경우 중괄호를 생략할 수 있다.

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

ㅇ 반환 타입은 컴파일러가 추론할 수 있어 생략 가능하다.

클래스와 객체

ㅇ 클래스는 다음과 같이 정의한다.

class Person(name: String, age: Int)

ㅇ 싱글톤 객체는 object 키워드로 선언한다.

object Calculator {
  def add(x: Int, y: Int) = x + y
}

트레이트(Traits)

ㅇ 트레이트는 자바의 인터페이스와 유사하지만 구현을 포함할 수 있다.

trait Greeting {
  def greet(name: String): Unit = {
    println(s"Hello, $name!")
  }
}

class EnglishGreeter extends Greeting

컬렉션과 반복문

ㅇ 스칼라는 다양한 컬렉션 타입을 제공한다. 예를 들어 리스트는 다음과 같이 생성할 수 있다.

val numbers = List(1, 2, 3, 4, 5)

ㅇ for 문을 사용한 반복은 다음과 같다.

for (i <- numbers) {
  println(i)
}

패턴 매칭

ㅇ 스칼라의 강력한 기능 중 하나인 패턴 매칭은 다음과 같이 사용한다.

val x = 5
x match {
  case 1 => println("One")
  case 2 => println("Two")
  case _ => println("Other")
}

함수형 프로그래밍 기능

ㅇ 스칼라는 함수형 프로그래밍을 지원한다. 예를 들어, map과 reduce 함수를 사용할 수 있다.

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

ㅇ 스칼라에서 순수 함수, 익명 함수, 고차 함수의 지원은 함수형 프로그래밍의 핵심 요소이다.

순수 함수

def add(a: Int, b: Int): Int = a + b

println(add(3, 4)) // 항상 7을 반환

ㅇ 순수 함수는 동일한 입력에 대해 항상 동일한 출력을 하며, 부작용(side effect)이 없는 함수이다.

ㅇ 외부에 영향을 미치지 않기 thread-safe하여, 병렬처리가 가능하다.

ㅇ 이 add 함수는 외부 상태를 변경하지 않고, 입력값에만 의존하여 결과를 반환하므로 순수 함수이다.

익명 함수 (람다)

ㅇ 익명 함수는 이름 없이 정의되는 함수로, 주로 다른 함수에 인자로 전달될 때 사용된다.

val numbers = List(1, 2, 3, 4, 5)

// 익명 함수를 사용한 map 연산
val doubled = numbers.map(x => x * 2)

println(doubled) // List(2, 4, 6, 8, 10)

ㅇ 여기서 x => x * 2는 익명 함수이다.

ㅇ 전통적인 명령형 언어는 함수에 이름이 꼭 필요하였지만, 함수형은 익명 함수를 생성하여 코드가 더욱 간결해졌다.

고차 함수

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

// 고차 함수 정의
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

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

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

ㅁ 함께 보면 좋은 사이트

스칼라 문서 및 Playground

스칼라 문법 총정리

반응형

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

[Scala] 스칼라 함수형 프로그래밍  (0) 2024.09.11
Comments