스칼라 튜토리얼

⚡ 스마트 요약

Scala 튜토리얼은 객체 지향 프로그래밍과 함수형 프로그래밍을 결합한 정적 타입의 JVM 기반 언어인 Scala를 소개합니다. 이 가이드에서는 설치, 구문, 핵심 기능 및 프레임워크를 다루며, 이를 통해 Scala는 동시성, 확장성 및 간결성을 갖춘 최신 애플리케이션을 구축하는 데 이상적입니다.

  • 🔘 하이브리드 패러다임: Scala는 JVM에서 객체 지향 프로그래밍과 함수형 프로그래밍을 융합하여 개발자가 불변성, 일급 함수 및 전통적인 클래스 계층 구조를 결합할 수 있도록 합니다.
  • ☑️ 간결한 구문: 타입 추론, 익명 함수 및 패턴 매칭은 기존의 상용구 코드를 줄여줍니다. Java 키와 함께ping 코드가 표현력이 풍부하고 읽기 쉽습니다.
  • IntelliJ를 이용한 설정: 커뮤니티 에디션 IDE를 설치하고, Scala 플러그인을 추가한 다음, App 클래스를 상속하는 객체를 생성하여 첫 번째 "Hello World" 프로그램을 실행하세요.
  • 🧪 기능적 구성 요소: 지연 평가, 커링, 고차 함수, 그리고 `val`을 통한 불변성은 깔끔하고 예측 가능한 코드를 지원합니다.
  • 🛠️ 동시성 및 프레임워크: Akka 배우, 미래, 놀이, 리프트, 그리고 Spark Scala는 분산 시스템, 웹 애플리케이션 및 데이터 엔지니어링에 강력한 선택지가 될 수 있습니다.

스칼라 튜토리얼

스칼라란 무엇인가?

스칼라 Scala는 객체 지향 프로그래밍과 함수형 프로그래밍을 결합하여 애플리케이션의 확장성을 향상시키는 정적 타입 프로그래밍 언어입니다. Scala는 주로 JVM 플랫폼에서 실행되며, 개발자는 Scala-Native를 통해 네이티브 플랫폼용 소프트웨어를 작성하거나 ScalaJs 및 기타 라이브러리를 통해 브라우저용 소프트웨어를 작성할 수도 있습니다. JavaScript 실행 시간.

Scala는 여러 플랫폼용 소프트웨어를 개발하는 데 사용되는 확장 가능한 언어로, 이름에서도 알 수 있듯이 다양한 플랫폼에서 사용 가능합니다. 이 언어는 기존 언어에서 발견되는 장황함 문제를 해결하기 위해 설계되었습니다. Java 간결함을 유지하면서도. 스칼라는 마틴 오더스키가 설계했으며, 첫 공개 버전은 2004년에 출시되었습니다.

스칼라를 배워야 하는 이유

다음은 스칼라 프로그래밍 언어를 배워야 하는 주요 이유입니다.

  • Scala는 객체 지향 프로그래머에게 배우기 쉽습니다. Java 개발자들 사이에서 인기를 얻으며 최근 몇 년 동안 가장 인기 있는 언어 중 하나가 되었습니다.
  • Scala는 사용자에게 최고 수준의 기능을 제공합니다.
  • Scala는 다음에서 실행될 수 있습니다. JVM이는 다른 언어와의 상호 운용성을 위한 길을 열어줍니다.
  • 이 언어는 동시성, 분산성, 복원력이 뛰어난 메시지 기반 애플리케이션을 위해 설계되었으며, 이러한 특징 덕분에 이번 10년 동안 가장 수요가 높은 언어 중 하나가 되었습니다.
  • 간결하면서도 강력한 언어이며, 사용자의 요구에 따라 빠르게 확장될 수 있습니다.
  • 이 언어는 객체 지향적이며 함수형 프로그래밍의 여러 기능을 포함하고 있어 개발자에게 코드를 작성하는 방식에 있어 많은 유연성을 제공합니다.
  • Scala는 Duck Ty를 제공합니다.ping 구조적 유형을 통해.
  • 정형화된 문구가 더 적습니다. Java.
  • Scala로 작성된 Lift와 Play 프레임워크는 지속적으로 발전하고 인기를 얻고 있습니다.

스칼라 설치 방법

Scala 프로그램을 작성하려면 먼저 컴퓨터에 Scala를 설치해야 합니다. 설치하려면 공식 웹사이트(https://www.scala.com/)를 방문하세요. https://www.scala-lang.org/download/ Scala의 최신 버전을 다운로드하려면.

링크를 따라가면 Scala를 설치하는 두 가지 옵션이 나타납니다. 이 Scala 튜토리얼에서는 다음 방법을 사용하겠습니다. IntelliJ IDEA이 플랫폼은 뛰어난 Scala 지원 기능을 기본적으로 제공합니다.

스칼라 설치 방법

다운로드 링크를 방문하시면 IntelliJ IDE의 두 가지 버전을 찾으실 수 있습니다.

이번 Scala 튜토리얼에서는 무료로 제공되며 Scala 프로그램을 작성하는 데 필요한 모든 것이 포함된 Community Edition을 다운로드하겠습니다.

IntelliJ 커뮤니티 에디션 다운로드 페이지

단계 1) 커뮤니티 에디션을 선택하세요.
해당 페이지에서 커뮤니티 에디션 드롭다운 메뉴를 클릭하세요.

이 옵션은 JDK 구현이 포함된 JBR과 함께 IntelliJ IDE를 다운로드할 수 있도록 제공합니다.Java Scala가 코드를 컴파일하고 실행하는 데 필요한 OpenJDK와 같은 개발 키트.

IntelliJ with JBR을 다운로드하세요.

단계 2) 설치 프로그램을 실행하세요.
IntelliJ를 다운로드한 후 설치 프로그램을 두 번 클릭하고 화면에 나타나는 마법사를 따라 진행하세요.

IntelliJ 설치 마법사

단계 3) 위치를 선택하십시오.
IDE를 설치할 위치를 선택합니다.

설치 폴더를 선택하세요

JDK가 포함된 번들을 다운로드하지 않은 경우에도 설치 프로그램은 설치 과정 중에 체크박스를 통해 JDK를 추가하도록 안내합니다.

설치 중 JDK 체크박스 선택

단계 4) 다음을 클릭하십시오.
나머지 기본 설정은 그대로 두고 다음을 클릭하세요.

설치 프로그램 기본 옵션

스칼라 Hello World 프로그램

단계 5) 시작 아이콘을 클릭하세요.
설치가 완료되면 시작 메뉴에서 IntelliJ IDE 시작 아이콘을 클릭하여 일반 애플리케이션처럼 실행하세요.

IntelliJ 시작 화면

IntelliJ에 Scala 플러그인을 추가해야 합니다. 화면 오른쪽 하단의 구성 메뉴 드롭다운을 클릭하고 플러그인 옵션을 선택하세요.

플러그인 설정 메뉴

IntelliJ 플러그인 마켓플레이스

마켓플레이스 탭에서 Scala를 검색하세요. 플러그인은 언어 태그 아래에서 첫 번째 결과로 나타납니다.

단계 6) 플러그인을 설치하십시오.
Scala 플러그인 다운로드를 시작하려면 설치를 클릭하십시오.

Scala 플러그인을 설치하세요

단계 7) IDE를 다시 시작하세요.
다운로드가 완료되면 설치된 플러그인이 작동할 수 있도록 IDE를 다시 시작하라는 메시지가 표시됩니다.

IntelliJ 프롬프트를 다시 시작하세요

재시작 후에는 이전과 동일한 페이지로 돌아가지만, 이제 Scala 플러그인이 설치되어 사용할 준비가 되어 있습니다.

단계 8) '프로젝트 생성'을 선택하면 프로젝트에 사용할 언어를 선택할 수 있는 페이지로 이동합니다.

IntelliJ에서 새 프로젝트를 생성하세요

단계 9) Scala 확인란을 선택하여 Scala를 선택하고 다음을 클릭합니다.

Scala 언어를 선택하세요

단계 10) 프로젝트 파일을 저장할 위치를 선택하고 프로젝트 이름을 지정하세요.

프로젝트 이름과 위치를 알려주세요.

해당 디렉터리가 존재하지 않으면 IntelliJ에서 폴더 생성 권한을 요청합니다. '수락'을 클릭하고 '완료'를 클릭하세요. 그러면 현재 Scala 코드가 없는 Scala 프로젝트 화면으로 이동합니다.

인덱스를 로드하는 데 시간이 다소 걸리므로 하단에 진행률 표시줄이 표시되는 동안 IDE와 상호 작용할 수 없더라도 걱정하지 마세요. IDE가 Scala를 실행하고 자동 완성 기능을 제공하는 데 필요한 파일을 로드하고 있는 중입니다.

단계 11) IDE 왼쪽의 프로젝트 탭을 클릭하고 확장하여 프로젝트 내용을 확인하세요.

프로젝트 탭을 펼치세요

이 시점에서 프로젝트는 비어 있으며 IDE에서 생성된 .idea 폴더와 hello-world.iml 파일만 포함되어 있습니다. 여기서 중요한 것은 프로젝트의 소스 코드가 들어 있는 src 폴더입니다. 바로 이 폴더에 첫 번째 Scala 파일을 작성하게 됩니다.

단계 12) src 폴더를 마우스 오른쪽 버튼으로 클릭하여 메뉴를 열고 새 Scala 파일을 생성하세요.

새 스칼라 파일 만들기

파일 이름을 선택하세요. 이 Scala 튜토리얼에서는 다음 이름을 사용하세요. 안녕하세요그런 다음 Scala 파일의 콘텐츠 유형에 대한 드롭다운 메뉴에서 '객체'를 선택합니다.

객체 종류를 선택하세요

이렇게 하면 코드를 실행하는 데 사용할 싱글턴 객체가 포함된 Scala 파일이 생성됩니다.

싱글턴 객체가 생성되었습니다.

이제 Hello 객체가 포함된 Scala 파일이 있으므로, App 키워드를 사용하여 생성한 객체를 확장하는 첫 번째 프로그램을 작성해 보세요.

객체에 App을 추가하면 컴파일러에게 프로그램 시작 시 실행할 코드를 알려줍니다. App을 추가한 직후 왼쪽에 녹색 화살표가 나타나는데, 이는 프로그램이 이제 실행 가능함을 나타냅니다.

IntelliJ에서 화살표를 실행하세요

Hello 옵션 실행

Hello 객체 안에 println() 함수를 작성하여 콘솔에 텍스트를 출력하세요. 초록색 화살표를 클릭하여 프로그램을 실행하세요.

화살표를 클릭하면 "Run Hello" 옵션이 나타납니다. 이 옵션을 선택하면 코드가 컴파일되고 몇 초 후 프로그램 출력 결과가 IntelliJ 콘솔에 표시됩니다.

콘솔에 "Hello World" 출력

이제 Scala를 성공적으로 설치하고 첫 번째 프로그램을 실행했습니다.

스칼라로 할 수 있는 일

Scala는 유연성과 JVM과의 상호 운용성 덕분에 다양한 분야에서 널리 사용됩니다. 일반적인 사용 사례는 다음과 같습니다.

  • ScalaJS를 이용한 프런트엔드 웹 개발.
  • 모바일 개발 Android 그리고 Scala Native를 사용한 iOS 개발.
  • HTTP4S, Akka-Http, Play Framework와 같은 서버 측 라이브러리.
  • 사물인터넷(IoT) 애플리케이션.
  • 게임 개발.
  • ScalaNLP 라이브러리 제품군을 사용한 자연어 처리.
  • 함수형 프로그래밍과 객체 지향 프로그래밍과 같은 고급 기술을 함께 연습합니다.
  • Erlang에서 영감을 받은 JVM용 라이브러리인 액터를 사용하여 고도로 동시적인 통신 애플리케이션을 구현합니다.
  • Figaro와 같은 확률 프로그래밍 라이브러리 및 Apache를 사용한 머신 러닝 Spark 대규모 데이터 처리를 위해.

익명 기능

Scala 언어는 익명 함수(익명 함수라고도 함)를 지원합니다. 함수 리터럴스칼라는 함수형 언어이기 때문에 개발자들은 종종 큰 문제를 여러 개의 작은 작업으로 나누고 많은 함수를 생성합니다. 이를 쉽게 하기 위해 스칼라는 함수를 다음과 같이 정의할 수 있도록 합니다. 이름 없이 인스턴스화됨이들을 변수에 직접 할당하거나 정의에 사용할 수 있습니다. def다음 Scala 예제에서 볼 수 있듯이:

val multiplyByTwo = (n:Int) => n * 2
def multiplyByThree = (n:Int) => n * 3

그런 다음 매개변수를 전달하여 일반 함수처럼 사용할 수 있습니다.

multiplyByTwo(3)
//6

multiplyByThree(4)
//12

이러한 방법들은 깔끔하고 간결한 코드를 작성할 때 유용합니다. 익명 함수는 작은 메서드를 정의하고 본문에 많은 코드를 필요로 하지 않을 때 유용합니다. 익명 함수는 매우 간단하며 특별한 절차 없이 쉽게 생성할 수 있습니다.

이러한 메서드는 인수를 받는 함수에만 국한되지 않고 인수를 받지 않는 메서드를 인스턴스화하는 데에도 사용할 수 있습니다.

val sayHello = () => { println("hello") }

이러한 익명 함수들은 대부분 코드의 다른 부분에서 빠르게 함수를 구현해야 할 때 사용됩니다. 이러한 이유로 익명 함수는 '익명 함수'라고도 불립니다. 인라인 함수익명 함수를 사용하는 것은 컬렉션 라이브러리 전반에서 컬렉션에 대한 빠른 작업을 수행하기 위해 흔히 나타나는 패턴입니다.

예를 들어, filter 메서드는 인라인 함수를 인수로 받아 익명 함수에 정의된 기준을 충족하는 요소만 포함하는 다른 컬렉션을 생성합니다.

val myList = List(1,2,3,4,5,6,7)

val myEvenList = myList.filter((n: Int) => n % 2 == 0)
//List(2,4,6)

val myOddList = myList.filter((n:Int) => n % 2 != 0)
//List(1,3,5,7)

여기서 익명 함수는 리스트의 값이 홀수인지 짝수인지 확인하고 일치하는 항목을 반환합니다.

//the one checking that the value is even
(n: Int) => n % 2 == 0

//the one checking that the value is odd
(n:Int) => n % 2 != 0

Scala에서는 익명 함수 매개변수에 이름이 지정되지 않은 경우 와일드카드를 사용할 수도 있습니다. 예를 들면 다음과 같습니다.

var timesTwo = (_:Int) * 2

timesTwo(5)
//10

이 시나리오에서는 매개변수 이름을 지정하지 않습니다. 밑줄(_)을 사용하여 매개변수를 나타냅니다.

게으른 평가

대부분의 언어는 변수와 함수 매개변수를 순차적으로 하나씩 평가합니다. 스칼라에서는 키워드가 lazy 참조될 때까지 평가하고 싶지 않은 값들을 다루는 데 도움이 됩니다.

지연 평가(lazy evaluation)로 표시된 변수는 정의된 시점에서는 평가되지 않습니다. 이는 일반적으로 즉시 평가(eager evaluation)라고 알려져 있습니다. 해당 변수는 코드의 뒷부분에서 참조될 때만 평가됩니다.

이는 값 평가에 비용이 많이 드는 계산이 필요한 경우에 유용할 수 있습니다. 값이 항상 필요한 것이 아니라면, 변수를 지연 평가 방식으로 설정하여 소프트웨어 속도를 저하시킬 수 있는 비용이 많이 드는 계산을 생략할 수 있습니다.

lazy val myExpensiveValue = expensiveComputation

def runMethod() = {
    if(settings == true) {
        use(myExpensiveValue)
    } else {
        use(otherValue)
    }
}

지연 변수의 활용 사례는 이것만이 아닙니다. 코드의 순환 종속성 문제를 해결하는 데에도 도움이 됩니다.

설정 플래그가 false이면 myExpensiveValue를 사용할 필요가 없으므로 비용이 많이 드는 계산을 수행할 필요가 없습니다. 이렇게 하면 읽히지 않는 값에 리소스가 낭비되지 않아 사용자가 원활한 경험을 누릴 수 있습니다.

게으름은 함수 인자에도 도움이 되는데, 인자는 함수 내부에서 참조될 때만 사용됩니다. 이러한 개념을 이름 기반 호출(Call-by-name) 매개변수라고 합니다.

def sometimesUsedString(someValue:String, defaultValue: => String) = {
 if(someValue != null) {
   use(defaultValue)
 } else {
   use(someValue)
   }
 }

많은 프로그래밍 언어는 인자를 평가할 때 값 전달 방식을 사용합니다. 이름으로 전달된 매개변수는 함수 본문 내에서 필요할 때만 평가됩니다. 값이 평가되면 저장되어 나중에 다시 평가하지 않고 재사용할 수 있는데, 이를 메모이제이션이라고 합니다.

유형 추론

스칼라에서는 변수마다 타입을 명시적으로 선언할 필요가 없습니다. 스칼라 컴파일러가 표현식의 우변에서 타입을 추론할 수 있기 때문입니다. 덕분에 코드를 더욱 간결하게 작성할 수 있고, 타입이 명확한 부분에서는 불필요한 반복 코드를 작성할 필요가 없습니다.

var first:String = "Hello, "
var second:String = "World"
var third = first + second
//the compiler infers that third is of type String

고차 함수

고차 함수는 함수를 인수로 받고 함수를 반환 타입으로 사용할 수 있는 함수입니다. 스칼라에서는 함수를 일급 객체로 취급합니다. 이러한 방식으로 함수를 사용하면 구축할 수 있는 프로그램의 종류에 있어 매우 유연성을 확보할 수 있습니다. 함수를 동적으로 생성하고 다른 함수에 기능을 동적으로 전달할 수 있습니다.

def doMathToInt(n:Int, myMathFunction:Int=>Int): Int = {
    myMathFunction(n)
}

위 함수에서는 값을 전달합니다. Int 그리고 입력을 받는 함수 Int 그리고 반환합니다 Int해당 시그니처를 가진 함수라면 어떤 함수든 전달할 수 있습니다. 여기서 시그니처란 함수의 입력과 출력을 의미합니다. 시그니처는 다음과 같습니다. Int => Int 이는 함수가 정수를 입력으로 받아 정수를 출력으로 반환한다는 것을 의미합니다.

서명 () => Int 입력값을 받지 않고 정수(Int)를 출력값으로 반환하는 함수를 의미합니다. 예를 들어, 임의의 정수를 생성하는 함수가 이러한 함수의 예입니다.

def generateRandomInt() = {
 return scala.util.Random.nextInt()
}

위 함수의 시그니처는 다음과 같습니다. () => Int.

함수는 시그니처를 가질 수도 있습니다. () => Unit이는 함수가 아무런 입력도 받지 않고, 반환 값도 지정하지 않는다는 것을 의미합니다. 대신 함수는 상태를 변경하거나 미리 정해진 동작을 수행할 수 있습니다.

이러한 방식은 시스템에 알 수 없는 방식으로 영향을 미치는 블랙박스처럼 작동할 수 있기 때문에 권장되지 않습니다. 또한 테스트하기도 어렵습니다. 명시적인 입력 및 출력 유형을 사용하면 함수의 동작을 추론할 수 있습니다.

고차 함수는 다른 함수를 반환할 수도 있습니다. 예를 들어, 숫자를 입력받아 거듭제곱을 적용하는 거듭제곱 함수를 반환하는 메서드를 만들 수 있습니다.

def powerByFunction(n:Int): Int=>Int = {
  return (x:Int) => scala.math.pow(x,n).toInt
}

위 함수는 정수형(Int)을 입력으로 받습니다. 반환 타입은 정수형을 입력으로 받는 익명 함수입니다. x 그리고 이를 거듭제곱 함수의 인수로 사용합니다.

카레링

스칼라에서는 두 개의 인수를 받는 함수를 한 번에 하나의 인수만 받는 함수로 변환할 수 있습니다. 인수를 하나 전달하면 해당 인수가 부분적으로 적용되어 나머지 인수를 받아 함수 호출을 완료합니다. 커링을 사용하면 인수를 부분적으로 더하는 방식으로 함수를 구성할 수 있습니다.

이는 모든 인수를 확보하기 전에 함수를 동적으로 생성하는 데 유용합니다.

def multiplyTwoNumbers(n:Int)(m:Int): Int = {
  return n * m
}

특정 숫자를 곱하는 함수가 필요한 경우, 별도의 곱셈 메서드를 만들 필요가 없습니다. 커링된 함수에 하나의 인수를 적용하고 결과를 재사용할 수 있습니다.

def multiplyTwoNumbers(n:Int)(m:Int): Int = {
  return n * m
}

var multiplyByFive = multiplyTwoNumbers(5) _

multiplyByFive(4)

//returns 20

패턴 매칭

Scala에는 변수가 특정 조건을 충족하는지 확인하는 강력한 내장 메커니즘이 있는데, 이는 SQL의 switch 문과 매우 유사합니다. Java 또는 if/else 문의 연속체일 수도 있습니다. 이 언어는 패턴 매칭을 지원하므로 변수가 특정 유형인지 확인할 수 있습니다. Scala의 패턴 매칭은 강력하며, 구조 분해 할당이 있는 구성 요소를 분해할 수 있습니다. unapply 일치하는 변수에서 원하는 필드를 직접 가져오는 방법입니다.

Scala의 패턴 매칭은 switch 문보다 더 보기 좋은 구문을 제공합니다.

myItem match {
  case true => //do something
  case false => //do something else
  case  _ => //if none of the above do this by default
}

변수를 여러 옵션과 비교합니다. 변수가 조건을 충족하면 굵은 화살표(=>) 오른쪽에 있는 표현식이 평가되어 일치 결과로 반환됩니다.

밑줄은 코드에서 일치하지 않는 경우를 포착하며, 이는 switch 문의 기본 케이스 동작과 유사합니다.

class Animal(var legs:Int, var sound:String)
class Furniture(var legs:Int, var color:Int, var woodType:String)

myItem match {
case myItem:Animal => //do something
case myItem:Furniture => //do something else
case _ => //unknown type, do something else
}

위 코드에서 타입을 감지할 수 있습니다. myItem 변수를 기준으로, 그 변수를 바탕으로 특정 코드로 분기합니다.

패턴 매칭은 변수가 각 사례에 순서대로 일치하는지 확인합니다.

밑줄(_)은 다른 case 문에서 충족되지 않는 조건을 만족하는 자리 표시자 역할을 합니다. 변수를 사용합니다. myItem 그리고 전화 match 방법.

  • 확인 여부 myItem is true 그리고 굵은 화살표 "=>"의 오른쪽에 논리를 실행하세요.
  • 코드에 정의된 case 문 중 어느 것과도 일치하지 않는 모든 항목을 일치시키려면 밑줄(_)을 사용하십시오.

케이스 클래스를 사용하면 클래스를 구조 분해하여 다음과 같이 표현할 수 있습니다.trac객체 내부의 필드.

을 사용해서 바이 sealed `@Class` 키워드를 사용하여 클래스를 정의하면 컴파일러가 일치시키려는 모든 경우를 철저히 검사하고, 처리하지 못한 경우가 있으면 경고를 표시해 주는 이점을 얻을 수 있습니다.

불변성

Scala에서는 다른 함수에서 변경할 수 없는 값을 생성하는 것이 가능합니다. val 키워드. 이는 다음과 같이 달성됩니다. Java ~을 사용하여 final 키워드. 스칼라에서는 a를 사용합니다. val 변수를 생성할 때 대신에 var이는 가변 변수의 대안입니다.

변수를 사용하여 정의합니다. val 키워드는 읽기 전용인 반면, 정의된 키워드는 다음과 같습니다. var 이 값은 다른 함수나 코드 내의 사용자에 의해 나중에 읽고 변경될 수 있습니다.

var changeableVariable = 8

changeableVariable = 10
//the compiler does not complain, and the code compiles successfully

println(changeableVariable)
//10

val myNumber = 7

myNumber = 4

//this will not compile

값을 할당하려고 합니다 myNumber 그것을 다음과 같이 선언한 후에 val 컴파일 시 오류가 발생합니다: "val에 재할당".

불변성을 사용하는 이유는 무엇입니까?

불변성은 코드나 다른 프로그래머가 예기치 않게 값을 변경하는 것을 방지하여 예측 불가능한 결과를 막는 데 도움이 됩니다. 값을 사용하는 쪽에서 값을 변경해야 할 경우, 복사본을 만들 수 있습니다. 이러한 방식으로 여러 주체가 동일한 변수를 변경하여 발생하는 버그를 방지할 수 있습니다.

클래스와 객체

객체는 현실 세계의 실체이며, 클래스는 객체를 정의하는 템플릿입니다. 클래스는 상태와 동작을 모두 가지고 있습니다. 상태는 값 또는 변수이며, 동작은 Scala에서 메서드입니다.

다음 섹션에서는 Scala에서 클래스를 정의하고, 인스턴스를 생성하고, 사용하는 방법을 보여줍니다.

여기에 두 개의 값과 두 개의 함수를 가진 Rectangle이라는 클래스가 있습니다. 매개변수도 사용할 수 있습니다. l b 프로그램의 필드로 직접 사용합니다. main 메서드를 가진 객체가 두 개의 값으로 클래스를 인스턴스화합니다.

예:

class Rectangle(l: Int, b: Int) {
  val length: Int = l
  val breadth: Int = b
  def getArea: Int = l * b
  override def toString = s"This is a rectangle with length $length and breadth $breadth"
}
object RectObject {
  def main(args: Array[String]) {
    val rect = new Rectangle(4, 5)
    println(rect.toString)
    println(rect.getArea)
  }
}

Scala에서는 모든 필드와 메서드가 기본적으로 public입니다. 따라서 이를 활용하는 것이 필수적입니다. override 때문에 toString Scala에서는 모든 객체에 대해 이미 정의되어 있습니다.

계승

Scala는 단일, 다단계, 다중, 계층형 및 하이브리드 상속을 포함한 여러 유형의 상속을 지원하며, 이는 전통적인 상속 방식과 많은 공통점을 가지고 있습니다. Java클래스와 특성 모두에서 상속받을 수 있습니다. 한 클래스의 멤버를 다른 클래스로 상속받으려면 `inherit` 키워드를 사용합니다. extends이는 재사용성을 가능하게 합니다.

하나의 클래스 또는 여러 클래스로부터 상속받을 수 있습니다. 또한, 자체적으로 상위 클래스를 가진 하위 클래스로부터 상속받아 상속 계층 구조를 만들 수도 있습니다.

아래 Scala 예제에서 기본 클래스는 다음과 같습니다. Circle그리고 파생 클래스는 다음과 같습니다. Sphere원에는 반지름이라는 값이 있으며, 이 값은 Sphere 클래스에 상속됩니다. calcArea 키워드를 사용하여 재정의됩니다. override.

예:

class Circle {
  val radius = 5
  def calcArea = {
    println(radius * radius)
  }
}
class Sphere extends Circle {
 override def calcArea = {
    println(radius * radius * radius)
  }
}
  object SphereObject {
    def main(args : Array[String]) {
      new Sphere().calcArea
    }
  }

ABStrac기

Scala에서는 abs를 생성할 수 있습니다.tracabs를 사용한 t 메서드 및 멤버 필드tract 클래스와 특성. abs 내부trac클래스와 특성을 정의할 때 abs를 사용할 수 있습니다.trac해당 필드를 구현하지 않고도 t 필드를 사용할 수 있습니다.

예:

trait MakesSound {
    var nameOfSound:String
    def sound():String
}
abstract class HasLegs(var legs:Int) {
    val creatureName:String

    def printLegs():String = {
        return s"$creatureName has this number of legs: $legs"
    }
}

이러한 필드는 해당 특성 또는 추상 클래스를 확장하는 클래스에 의해 구현됩니다.tract 클래스. 특성을 사용하여 con을 만들 수 있습니다.trac애플리케이션이 무엇을 해야 하는지에 대한 ts를 작성한 다음, 나중에 해당 메서드를 구현합니다.

trait DatabaseService {
    def addItemName(itemName:String)
    def removeItem(itemId:Int)
    def updateItem(itemId:Int, newItemName:String)
}

이렇게 하면 메서드를 구현하지 않고도 애플리케이션의 모습을 계획할 수 있습니다.ping 다양한 방법들이 어떻게 나타날지 상상해 보세요. 이는 복습 프로그래밍이라고 알려진 패턴을 따릅니다.trac실제 구현보다는 논의에 초점을 맞추는 것입니다.

수업은 다음과 같이 시작됩니다. abstract 키워드에는 abs와 bbs가 모두 포함될 수 있습니다.tract 및 비절대tract 메서드가 있습니다. 하지만 abs에서는 다중 상속이 지원되지 않습니다.tract 클래스이므로 하나의 복근만 확장할 수 있습니다.tract 클래스.

싱글톤 객체

싱글턴은 프로그램에서 단 한 번만 인스턴스화되는 클래스입니다. 이는 "싱글턴 패턴"이라는 인기 있고 유용한 프로그래밍 패턴에서 유래했습니다. 싱글턴은 프로그램 전체에서 자주 접근되고 수명이 긴 인스턴스를 생성할 때 유용하며, 특히 시스템 내 이벤트 조정에 필수적인 상태를 가진 인스턴스에 적합합니다. 스칼라에서는 싱글턴을 쉽게 생성할 수 있는데, 스칼라는 `singleton` 메서드를 사용하여 싱글턴을 생성하는 간단한 방법을 제공하기 때문입니다. object 예어.

object UserProfile {
    var userName = ""
    var isLoggedIn:Boolean = false
}

그러면 프로그램 전체에서 이 객체를 참조할 수 있으며, 객체의 인스턴스가 하나뿐이므로 프로그램의 모든 부분이 동일한 데이터를 볼 수 있다는 것을 보장할 수 있습니다.

def getLoggedInStatus():Boolean = {
   return UserProfile.isLoggedIn
}

def changeLoggedInStatus():Boolean = {
    UserProfile.isLoggedIn = !UserProfile.isLoggedIn
    return UserProfile.isLoggedIn
}

스칼라에는 정적 멤버라는 개념이 존재하지 않기 때문에 클래스의 정적 멤버처럼 동작하는 싱글턴 객체를 사용합니다.

암시적 클래스

암묵적 클래스는 버전 2.10에 추가된 기능으로, 주로 기존의 폐쇄형 클래스에 새로운 기능을 추가하는 데 사용됩니다.

The implicit `@` 키워드는 클래스, 객체 또는 트레이트에 정의되어야 합니다. 암시적 클래스의 기본 생성자는 첫 번째 매개변수 목록에 정확히 하나의 인자만 가져야 합니다. 또한 추가적인 암시적 매개변수 목록을 포함할 수 있습니다.

아래 Scala 예제에서는 문자열의 모음을 *로 바꾸는 새로운 기능이 추가되었습니다.

object StringUtil {
  implicit class StringEnhancer(str: String) {

    def replaceVowelWithStar: String = str.replaceAll("[aeiou]", "*")
  }
}

해당 클래스를 사용하는 클래스에서 암시적 클래스를 임포트해야 합니다.

import StringUtil.StringEnhancer

object ImplicitEx extends App {
  val msg = "This is Guru99!"
  println(msg.replaceVowelWithStar)
}

객체 지향 프로그래밍(OOP) vs. 함수형 프로그래밍(FP)

객체지향 프로그래밍(OOP)에서 프로그램은 그룹별로 구성됩니다.ping 데이터와 해당 데이터에 작용하는 함수들을 고도로 연결된 단위로 묶습니다. 객체는 필드에 데이터를 저장하고, 메서드는 이 필드를 조작합니다. 이러한 프로그래밍 방식에서 핵심은 다음과 같습니다.trac핵심은 데이터입니다. 왜냐하면 생성된 메서드는 데이터를 기반으로 작동하도록 설계되었기 때문입니다.

기능적 프로그래밍반면에 데이터와 데이터를 조작하는 함수를 분리합니다. 이를 통해 개발자는 함수를 절대적인 연산 도구로 취급할 수 있습니다.trac프로그램 모델링 시 핵심 요소이자 원동력입니다.

Scala는 함수를 일급 객체로 취급하여 다른 함수에 값으로 전달하거나 반환할 수 있도록 함으로써 함수형 프로그래밍을 가능하게 합니다. 이러한 두 가지 패러다임의 결합 덕분에 Scala는 데이터 과학과 같은 산업 분야에서 복잡한 소프트웨어를 구축하는 데 매우 적합한 언어가 되었습니다.

Scala의 중요한 프레임워크

다음은 Scala에 중요한 몇 가지 프레임워크입니다.

  • 연극 다음을 사용하는 오픈 소스 웹 애플리케이션 프레임워크입니다. MVC 아키텍처2007년에 출시되어 현재 아파치 라이선스로 배포되는 이 프레임워크는 2013년까지 GitHub에서 가장 인기 있는 프레임워크 중 하나가 되었습니다. LinkedIn과 같은 회사들이 이 프레임워크를 사용하고 있습니다. Walmart삼성과 Eero는 이 프레임워크를 사용합니다.
  • 승강기 Lift는 2007년에 출시된 Scala로 작성된 또 다른 무료 웹 프레임워크입니다. Foursquare는 Lift 프레임워크를 사용합니다. Lift는 성능이 뛰어나고 구축 속도가 빠른 프레임워크입니다.
  • 아카 JVM에서 고도의 동시성, 분산성 및 복원력을 갖춘 메시지 기반 애플리케이션을 구축하기 위한 툴킷을 제공합니다.
  • 고양이 abs를 제공하는 라이브러리입니다.trac함수형 프로그래밍을 위한 지침.
  • Spark 대규모 데이터 처리를 위한 통합 분석 엔진으로, 빅데이터 및 머신러닝 워크플로우에서 널리 사용됩니다.

동시성 지원

  • 스칼라의 값은 기본적으로 불변이므로 동시성 환경에 매우 적합합니다.
  • Scala는 동시 실행 애플리케이션에 이상적인 여러 기능을 가지고 있습니다.
  • Future와 Promises를 사용하면 비동기적으로 데이터를 더 쉽게 처리할 수 있어 병렬 처리가 지원됩니다.
  • Akka는 액터 동시성 모델을 사용하는 툴킷입니다. 액터는 메시지를 수신할 때 동작을 수행합니다.
  • 스레드를 사용한 동시성 Java Scala에서도 지원됩니다.
  • 스트림 처리는 데이터를 지속적으로 실시간으로 처리할 수 있게 해주는 또 다른 훌륭한 기능입니다.

Scala에는 최고의 동시성 라이브러리가 있습니다. Java 생태계:

  • 출신 Java 스레드.
  • Vertx와 같은 라이브러리의 파이버.
  • ZIO는 동시성 및 비동기 연산을 처리하는 데 도움이 되는 기본 기능을 제공하는 라이브러리입니다.
  • 트랜잭션 처리를 위한 소프트웨어 트랜잭션 메모리(STM).
  • Future는 Scala 언어에 내장된 기능입니다.

Java 대 스칼라

여기에 주요 차이점 Java 그리고 스칼라.

스칼라 Java
더욱 간결하고 명료합니다. 상대적으로 더 큰 코드 덩어리.
객체지향적이면서도 함수형 프로그래밍 방식을 지향하도록 설계 및 개발되었습니다. 동시성 및 불변성 등 다양한 함수형 프로그래밍 기능을 지원합니다. 원래 객체 지향 언어로 개발되었지만 최근 버전에서 함수형 프로그래밍 기능을 지원하기 시작했습니다. 하지만 함수형 프로그래밍 측면에서는 여전히 Scala만큼 강력하지는 않습니다.
동시성 지원을 위해 액터 모델을 사용합니다. 동시성을 위해 기존 스레드 기반 모델을 사용합니다.
Play 및 Lift와 같은 프레임워크를 지원합니다. Spring, Grails 등 다양한 확장 프로그램을 지원합니다.
지연 평가를 지원합니다. 지연 평가를 기본적으로 지원하지 않습니다.
고정 멤버가 없습니다. 정적 멤버를 포함합니다.
연산자 과부하를 지원합니다. 연산자 오버로딩을 지원하지 않습니다.
소스 코드 컴파일은 비교적 느립니다. 소스 코드 컴파일 속도가 Scala보다 빠릅니다.
특성은 다음과 같이 작용합니다. Java 8개의 인터페이스. Java 8개의 인터페이스는 클래스와 인터페이스 사이의 간극을 메우려고 합니다.
버전 업그레이드 시 재작업이 필요한 경우가 있습니다. 일반적으로 버전 간 재작성은 필요하지 않습니다.
타입 안정성은 코드의 신뢰성을 높여주지만, 절대적으로 버그가 없다는 것을 보장하지는 않습니다. 강한 정전기ping 런타임 오류를 줄이는 데 도움이 됩니다.
주요 버전 간에 하위 호환성 제한이 있습니다. 장기적인 하위 호환성이 뛰어납니다.
Operators는 메서드 호출로 처리됩니다. Operators는 특수한 구문이며 메서드 호출이 아닙니다.
특성을 이용한 다중 상속을 지원합니다. 클래스를 이용한 다중 상속은 지원하지 않고, 대신 인터페이스를 사용합니다.
Code 간결한 형태로 작성되었습니다. Code 더 장황한 형태로 쓰여 있습니다.
스칼라에는 static 키워드가 없습니다. Java static 키워드가 포함되어 있습니다.

자주 묻는 질문

Scala는 다른 언어보다 학습 곡선이 더 가파르다. Java 객체지향 방식과 함수형 방식을 결합했기 때문입니다. 하지만 개발자들은 Java 경험이 쌓이면 기본기는 금방 익힐 수 있습니다. 작은 프로젝트와 Scala REPL을 활용한 연습은 학습 속도를 높여줍니다.

네. Scala는 Akka를 사용하는 기업에서 대규모 시스템을 구동하는 데 계속해서 사용되고 있습니다. Spark그리고 Kafka도 있습니다. JVM 성능과 함수형 프로그래밍이 중요한 데이터 엔지니어링, 핀테크 및 분산 시스템 분야에서 수요가 여전히 강합니다.

네. 최신 AI 코딩 도우미는 Scala 구문, 타입 시스템, 그리고 Akka와 같은 프레임워크를 이해합니다. Spark이러한 도구들은 기본 코드를 생성하고, 함수형 패턴을 제안하고, 컴파일 오류를 설명하고, 코드를 리팩토링하여 초보자와 전문가 모두의 개발 속도를 높이는 데 도움을 줍니다.

Scala는 Apache를 구동합니다. SparkAI 파이프라인에서 대규모 데이터 처리를 위한 선도적인 엔진인 Scala는 Breeze, Smile, Figaro와 같은 라이브러리를 통해 수치 계산, 머신 러닝, 확률 모델링을 지원하여 프로덕션 데이터 과학에 강력한 선택지가 됩니다.

`val`은 즉시 평가되는 불변 바인딩을 생성합니다. `var`는 재할당 가능한 가변 바인딩을 생성합니다. 지연 평가 `val`은 값이 처음 접근될 때까지 평가를 연기한 다음, 이후 읽기를 위해 결과를 캐시합니다.

이 게시물을 요약하면 다음과 같습니다.