Scala 고급 인터뷰 질문 및 답변

이 게시물을 읽기 전에 “Scala Basic” 및 “Scala Intermediate” 인터뷰 질문과 답변 게시물 두 개를 읽어 Scala 언어에 대한 기본 지식을 습득하십시오.

Scala Advanced Interview Questions

이 게시물에서는 Scala 고급 개념 및 실제 프로젝트 관련 개념과 관련된 일부 고급 Scala 인터뷰 질문에 대해 논의할 것입니다. 참고: 이 목록이 이미 매우 크게 되었으므로 나머지 질문과 답변이 포함된 다른 게시물을 제공하려고 합니다. 해당 게시물은 다음 위치에서 참조하십시오: “Scala Intermediate and Advanced Interview Questions and Answers”. 우리는 또한 시니어 또는 경험 많은 Scala/Java 개발자에게 유용한 Scala/Java 동시성 및 병렬성 인터뷰 질문과 답변을 논의할 것입니다.

Scala Advanced Interview Questions

이 섹션에서는 모든 Scala 중급 인터뷰 질문을 나열하고 다음 섹션에서는 자세히 논의할 것입니다.

  1. 현재 최신 버전의 Scala는 무엇인가요? Scala 2.12의 주요 변경 사항 또는 업데이트는 무엇인가요?
  2. Scala에서 Option은 무엇인가요? Some과 None은 무엇인가요? Scala에서 Option/Some/None 디자인 패턴은 무엇인가요?
  3. Scala에서 Either는 무엇인가요? Left와 Right는 무엇인가요? Scala에서 Either/Left/Right 디자인 패턴을 설명해주세요.
  4. Scala의 Option과 동등한 구조는 Java SE 8에서 무엇인가요? Scala에서 Option의 사용 목적은 무엇인가요?
  5. 함수형 프로그래밍 (FP)의 장점 또는 순수 함수의 장점은 무엇인가요?
  6. RESTful 웹 서비스 또는 REST API를 개발하기 위한 인기 있는 Scala 기반 프레임워크는 무엇인가요?
  7. Scala 기반 애플리케이션의 REST API 문서를 생성하기 위한 최상의 프레임워크는 무엇인가요?
  8. Java 기반 애플리케이션의 Hibernate와 같은 인기있는 ORM 프레임워크는 Play/Scala 기반 애플리케이션에서 사용할 수 있나요?
  9. MongoDB NoSQL 데이터 저장소에 데이터를 영속화하기 위해 Play/Scala 애플리케이션 개발에 가장 적합한 도구는 무엇인가요?
  10. Play와 Scala를 사용하여 애플리케이션을 개발하는 인기있는 클라이언트는 누구인가요?
  11. Play 프레임워크에서 사용할 수 있는 최상의 언어는 Scala인가요 아니면 Java인가요?
  12. Scala는 고도로 확장 가능하고 고성능 애플리케이션을 어떻게 지원하나요?
  13. Play와 Scala 기반 애플리케이션 개발을 위한 사용 가능한 빌드 도구는 무엇인가요?
  14. SBT는 무엇인가요? Play와 Scala 애플리케이션을 개발하기 위한 최상의 빌드 도구는 무엇인가요?
  15. Play와 Scala 기반 애플리케이션에 대한 사용 가능한 단위 테스트, 기능 테스트 및/또는 BDD 프레임워크는 무엇인가요?
  16. Play와 Scala 기반 애플리케이션에 대한 최고의 코드 커버리지 도구는 무엇인가요?
  17. Play와 Scala 기반 애플리케이션에 대한 최고의 Scala 스타일 체커 도구는 무엇인가요?
  18. 어떤 IDE가 Play와 Scala 기반 애플리케이션 개발을 지원하며 그 방법은 무엇인가요?
  19. Play의 기본 단위 및 기능 테스트 프레임워크는 무엇인가요? Play의 기본 빌드 도구는 무엇인가요? Play의 기본 템플릿 엔진은 무엇인가요? Play 프레임워크에서 사용 가능한 내장 웹 서버는 무엇인가요?
  20. Scala가 Java보다 더 좋은 이유는 무엇인가요? Scala의 Java(Java 8)에 비해 장점은 무엇인가요? Java에 비해 Scala의 주요 장점이나 혜택은 무엇인가요?
  21. Scala에서 익명 함수는 무엇인가요? Scala에서 함수 리터럴은 무엇인가요? Scala에서 익명 함수/함수 리터럴의 장점은 무엇인가요?
  22. 고차 함수(Higher-Order Function, HOF)란 무엇인가요?
  23. Case 클래스와 일반 클래스의 차이점은 무엇인가요?
  24. 웹 애플리케이션을 개발하기 위한 Play/Scala 스택의 장점은 무엇인가요?
  25. Call-by-name이란 무엇인가요? Scala와 Java는 call-by-name을 지원하나요? 호출 기준에 따른 함수 매개변수의 값 전달 방식(call-by-value)과 호출 기준에 따른 함수 매개변수의 값 전달 방식(call-by-name)의 차이점은 무엇인가요?
  26. Scala에서 지원하지만 Java에서 지원하지 않는 Java의 객체 지향 프로그래밍(OOP) 구성요소는 무엇인가요? Java에서 지원하지만 Scala에서 지원하지 않는 Scala의 객체 지향 프로그래밍(OOP) 구성요소는 무엇인가요? Scala에서 도입된 Java에서 지원하지 않는 새로운 OOP 구성요소는 무엇인가요?
  27. 웹 애플리케이션을 개발하기 위한 Scala 언어의 인기있는 MVC 프레임워크는 무엇인가요?
  28. 자바 기반과 스칼라 기반 메이븐 프로젝트의 구조의 주요 차이점은 무엇인가요?
  29. 스칼라에서의 추출자(Extractor)란 무엇인가요? 스칼라에서 생성자(Constructor)와 추출자(Extractor)의 차이점은 무엇인가요? 스칼라에서 추출자의 사용 목적은 무엇인가요?
  30. 스칼라 기반 애플리케이션에서 ‘???’의 사용 목적은 무엇인가요?
  31. 스칼라 컬렉션 API에서 List와 Stream의 주요 차이점은 무엇인가요? 이 차이점을 어떻게 증명할 수 있나요? 언제 Stream을 선택해야 하나요?
  32. 스칼라에서 ::#::의 차이점은 무엇인가요? 스칼라에서 :::#:::의 차이점은 무엇인가요?
  33. 풀스택 스칼라 개발자가 되기 위해 어떤 기술 스택을 배워야 할까요?

스칼라 고급 인터뷰 질문과 답변

이 섹션에서는 위 목록의 각 질문을 하나씩 선택하여 필요한 경우 적절한 예제와 함께 자세히 설명합니다. 이 개념을 예제와 함께 깊이 이해하려면 이전에 작성한 스칼라 튜토리얼 섹션을 참조해주세요.

현재 Scala의 최신 버전은 무엇인가요? Scala 2.12에서 주요 변경 사항이나 업데이트는 무엇인가요?

현재 Scala의 안정 버전은 2.11.7입니다. 이 버전은 Java SE 7을 지원합니다. Scala 2.12 버전에서의 주요 변경 사항은 Java SE 8 이상 버전만을 지원한다는 것입니다. Scala 2.12는 2.11.x 시리즈와는 이진 호환성이 없습니다. 현재는 Mile Stone Builds 상태입니다.

Scala에서 Option은 무엇인가요? Some과 None은 무엇인가요? Scala에서의 Option/Some/None 디자인 패턴은 무엇인가요?

Scala에서 Option은 존재할 수도 있고 존재하지 않을 수도 있는 선택적인 값 표현에 사용됩니다. Option은 추상 클래스입니다. Option은 두 개의 하위 클래스인 Some과 None을 가지고 있습니다. 이 세 가지(Option, Some, None)는 “scala.Option”과 같은 “scala” 패키지에 정의되어 있습니다. Option은 Scala에서 제한된 컬렉션이며, 요소가 0개 또는 1개만 포함됩니다. Option이 0개의 요소를 포함하면 None이고, 1개의 요소를 포함하면 Some입니다. Some은 존재하는 값을 나타내기 위해 사용되고, None은 존재하지 않는 값을 나타냅니다. 예시:-

def get(val index: Int): Option[String]

이 메소드가 List에서 온 것으로 가정해 봅시다. 이 메소드의 반환 유형은 Option[String]입니다. List에 요소가 포함되어 있으면이 get 메소드는 해당 인덱스 위치에 있는 “Some[String]” 요소를 반환합니다. 그렇지 않으면 “None” (즉, 요소가 없음)을 반환합니다. Some은 케이스 클래스이고 None은 객체입니다. 둘 다 케이스 클래스/객체이므로 패턴 매칭에서 잘 사용할 수 있습니다. 이 세 가지 정의의 조합은 스칼라에서 옵션/썸/논 디자인 패턴으로 알려져 있습니다.

스칼라에서 Either는 무엇인가요? 스칼라에서 Left와 Right는 무엇인가요? Either/Left/Right 디자인 패턴을 스칼라에서 설명해주세요.

스칼라에서 Either는 추상 클래스입니다. 이는 두 가지 가능한 유형 중 하나의 값을 나타내기 위해 사용됩니다. 두 개의 유형 매개 변수를 사용합니다: Either[A,B]. 왼쪽과 오른쪽이라는 두 개의 하위 유형이 있습니다. Either[A,B]가 인스턴스 A를 나타내면 왼쪽이라는 뜻입니다. 인스턴스 B를 나타내면 오른쪽이라는 뜻입니다. 이를 스칼라에서 Either/Left/Right 디자인 패턴이라고 합니다.

Java SE 8에서 Scala의 Option에 해당하는 구문은 무엇인가요? Scala에서 Option의 사용 목적은 무엇인가요?

Scala의 Option은 Java SE 8의 Optional과 비슷합니다. Java SE 8에서는 기존 값이나 존재하지 않는 값을 나타내기 위해 새로운 유틸리티 클래스 Optional이 도입되었습니다. Optional은 java.util 패키지에서 사용할 수 있습니다. Scala의 Option과 Java SE 8의 Optional은 모두 선택적인 값을 나타내는 데 사용됩니다. 둘 다 불필요한 null 체크와 NullPointerException을 피하기 위해 사용됩니다.

함수형 프로그래밍 (FP) 또는 순수 함수의 장점은 무엇인가요?

다음은 함수형 프로그래밍 (FP) 또는 순수 함수의 장점입니다:

  • 더 모듈화
  • 이해하기 쉬움 또는 논리적인 이해 용이
  • 테스트하기 쉬움
  • 버그가 발생하기 적음
  • 재사용하기 쉬움
  • 병렬화와 일반화에 용이

RESTful 웹 서비스를 개발하기 위한 많은 Scala 기반 프레임워크가 있습니다. 가장 인기 있는 프레임워크는 다음과 같습니다:

  • Play Framework
    Play에서는 REST API URL을 라우트라고 부릅니다. Play 프레임워크에서는 모든 라우트를 한 곳에 배치합니다. 상태를 가지지 않는 웹 프레임워크로서 REST API를 쉽게 개발할 수 있습니다.- Scalatra Framework
    REST API를 개발하기 위한 매우 간단하고 쉬운 Scala 기반 웹 프레임워크입니다.- Spray Framework
    아카 프레임워크를 기반으로 한 매우 간결한 프레임워크로 Actor 모델을 사용하여 REST API를 개발하는 데 적합합니다.- Lift Framework
    Pattern Matching 개념을 사용하여 라우팅을 할 수 있습니다.

Scala 기반 애플리케이션의 REST API 문서를 생성하기 위한 최상의 프레임워크는 무엇인가요?

Swagger는 이 목적에 가장 적합한 도구입니다. Scala 기반 애플리케이션의 REST API 문서를 생성하기 위한 매우 간단하고 오픈 소스인 도구입니다. JSON을 사용하여 REST API 문서를 생성합니다.

  • Play with Scala를 사용하여 REST API를 개발하고, REST API 문서화를 위해 play-swagger 모듈을 사용합니다.
  • Spray with Scala를 사용하여 REST API를 개발하고, REST API 문서화를 위해 spray-swagger 모듈을 사용합니다.

Java 기반 애플리케이션의 JPA, Hibernate, Toplink 등과 같이, Play/Scala 기반 애플리케이션에서 사용할 수 있는 많은 ORM 프레임워크가 있습니다. Play/Scala 기반 애플리케이션에서 인기 있는 ORM 프레임워크:

  • Slick
  • Anorm
  • SORM(Scala ORM)
  • Squeryl

MongoDB NoSQL 데이터 저장소에 데이터를 지속적으로 저장하기 위해 Play/Scala 애플리케이션을 개발하는 데 가장 적합한 도구는 무엇인가요?

ReactiveMongo는 MongoDB NoSQL 데이터 저장소에 데이터를 지속적으로 저장하기 위해 Play/Scala 애플리케이션을 개발하는 데 최적인 스칼라 드라이버입니다. 이는 완전한 비차단 및 비동기 I/O 작업을 지원합니다.

수천 명의 클라이언트가 프로덕션에서 Play와 Scala를 사용하고 있습니다. 다음은 활발하게 Play와 Scala를 사용하는 인기 있는 클라이언트 목록입니다.

  • LinkedIn
  • The Guardian
  • Ocado
  • LuchidChart
  • GOV.UK

Play 프레임워크에서 사용하기 가장 좋은 언어는 Scala인가요 아니면 Java인가요?

Play 2는 완전히 Scala로 작성되었습니다. Play 프레임워크에서 Java를 사용하는 경우 Java는 FP 기능을 완전히 지원하지 않기 때문에 많은 문제에 직면해야 합니다. Scala는 고도로 확장 가능하며 더 나은 성능, 동시성/병렬성 및 낮은 지연 시간 애플리케이션을 개발하기 위해 Play 프레임워크와 함께 사용하기 가장 좋은 옵션입니다. 이는 다음과 같은 이유로 인합니다:

  • Play 2는 완전히 Scala로 작성되었습니다.
  • 그것은 완전한 FP 기능을 지원합니다.
  • 그것은 자바보다 더 표현 언어입니다.
  • 그것은 Akka Actor 모델을 매우 쉽게 지원합니다.
  • 그것은 특성 같은 일부 새로운 OOP 기능을 지원합니다.
  • Play의 내장 템플릿은 스칼라로 개발되었습니다.

스칼라는 고성능 및 확장 가능한 애플리케이션을 어떻게 지원하나요?

스칼라는 다중 패러다임 프로그래밍(OOP와 FP 모두)을 지원하며 액터 동시성 모델을 사용하기 때문에 매우 확장 가능하고 고성능의 애플리케이션을 쉽게 개발할 수 있습니다.

Play와 스칼라 기반 애플리케이션을 개발하기 위해 사용할 수 있는 빌드 도구는 무엇인가요?

다음 세 가지는 Play와 스칼라 애플리케이션을 개발하기 위해 가장 인기있는 빌드 도구입니다:

  • SBT
  • Maven
  • Gradle

SBT는 무엇인가요? Play 및 Scala 애플리케이션을 개발하기 위한 최고의 빌드 도구는 무엇인가요?

SBT는 Scala Build Tool의 약자입니다. 이는 Scala 기반 애플리케이션을 개발하기 위한 간단한 빌드 도구입니다. 대부분의 사람들은 Play 및 Scala 애플리케이션을 개발하기 위해 SBT 빌드 도구를 사용합니다. 예를 들어, IntelliJ IDEA Scala 플러그인은 기본적으로 이를 위해 SBT를 사용합니다.

Play 및 Scala 기반 애플리케이션을 위한 사용 가능한 단위 테스트, 기능 테스트 및/또는 BDD 프레임워크는 무엇인가요?

다음은 Play/Scala 기반 애플리케이션을 위한 가장 인기 있는 단위 테스트, 기능 테스트 및/또는 BDD 프레임워크입니다:

  • Spec2
  • ScalaTest
  • ScalaCheck
  • Mokito

Play 및 Scala 기반 애플리케이션에 대한 최고의 코드 커버리지 도구는 무엇인가요?

SCoverage는 Play 및 Scala 기반 애플리케이션에 대한 코드 커버리지 도구입니다. SCoverage는 Scala 코드 커버리지 도구를 의미합니다. 다음 빌드 도구를 지원하기 위해 세 개의 별도 플러그인을 가지고 있습니다:

  • SBT
  • Maven
  • Gradle

Play 및 Scala 기반 애플리케이션에 대한 최고의 Scala 스타일 체커 도구는 무엇인가요?

자바 기반 애플리케이션의 Checkstyle과 같이, Scalastyle은 Play 및 Scala 기반 애플리케이션에 대한 최고의 Scala 스타일 체커 도구입니다. Scalastyle은 Scala 소스 코드를 분석하여 잠재적인 문제를 표시합니다. 다음 빌드 도구를 지원하기 위해 세 개의 별도 플러그인을 가지고 있습니다:

  • SBT
  • Maven
  • Gradle

또한 다음 두 개의 IDE를 지원하기 위해 두 개의 별도 플러그인을 가지고 있습니다:

  • IntelliJ IDEA
  • Eclipse IDE

어떤 IDE가 Play 및 Scala 기반 애플리케이션 개발을 지원하며, 그 방법은 무엇인가요?

다음 두 가지 인기있는 IDE가 Play 및 Scala 기반 애플리케이션 개발을 지원합니다:

  • IntelliJ IDEA
  • Eclipse IDE

이들은 Eclipse IDE의 Scala IDE와 같은 Scala 플러그인을 사용하여 Play 및 Scala 기반 애플리케이션 개발을 지원합니다. IntelliJ IDEA는 “Scala Plugin for IntelliJ IDEA”와 같은 플러그인을 사용하여 “Scala, SBT 및 Play 2 Framework” 기반의 애플리케이션을 지원합니다.- Play의 기본 Unit 및 Functional Testing Framework는 Spec2입니다. Spec2 Framework를 사용하면 Play/Scala 기반 애플리케이션을 매우 쉽게 테스트할 수 있습니다. Play Framework의 기본 내장 템플릿은 “Twirl”입니다. 이는 Scala로 개발되었습니다. 이러한 템플릿을 사용하여 Play/Scala 기반 애플리케이션을 매우 쉽게 개발할 수 있습니다. Play Framework의 내장 또는 기본 웹 서버는 Netty Server입니다.

Scala가 Java보다 더 좋은 이유는 무엇인가요? Java 8과 비교하여 Scala의 장점은 무엇인가요? Java와 비교하여 Scala의 주요 장점이나 이점은 무엇인가요?

Scala는 다음과 같은 추가 기능을 지원하기 때문에 Java 8보다 더 우수합니다:

  • 완전한 FP 기능
  • 더 많은 표현 언어
  • 패턴 매칭
  • Akka Actor Model에 대한 더 나은 지원
  • Trait를 통한 상속 다이아몬드 문제에 대한 자동 해결
  • Akka 프레임워크를 사용한 비동기 및 논블로킹 IO 프로그래밍
  • 완전한 반응형 스트리밍 API

Scala에서 익명 함수란 무엇인가요? Scala에서 함수 리터럴이란 무엇인가요? Scala에서 익명 함수/함수 리터럴의 장점은 무엇인가요?

익명 함수는 함수이지만 함수 이름이 없습니다. 함수 리터럴로도 알려져 있습니다. 스칼라에서 익명 함수/함수 리터럴의 장점은 다음과 같습니다:
익명 함수/함수 리터럴의 장점:

  • 함수 리터럴을 변수에 할당할 수 있습니다.
  • 함수 리터럴을 다른 함수/메소드에 전달할 수 있습니다.
  • 함수 리터럴을 다른 함수/메소드의 결과/반환 값으로 반환할 수 있습니다.

고차 함수(Higher-Order Function, HOF)란 무엇인가요?

고차 함수(HOF)는 함수이지만 다음 중 하나, 둘 또는 둘 다를 수행합니다:

  • 다른 함수를 인수로 받습니다.
  • 함수를 결과로 반환합니다.

Case 클래스와 일반 클래스의 차이점은 무엇인가요?

Case 클래스도 클래스입니다. 하지만 일반 클래스와 비교했을 때 다음과 같은 추가 기능 또는 이점이 있습니다:

  • 기본적으로 Case 클래스의 생성자 매개변수는 ‘val’입니다. ‘val’로 매개변수를 선언할 필요가 없습니다.
  • 기본적으로 Case 클래스의 생성자 매개변수는 클래스 필드가 됩니다.
  • 이러한 메서드는 자동으로 추가됩니다: toString, equals, hashCode, copy, apply 및 unapply.
  • Companion object도 자동으로 생성됩니다.
  • Case 클래스의 인스턴스를 생성할 때 ‘new’ 키워드를 사용할 필요가 없습니다.
  • 패턴 매칭에서 쉽게 사용할 수 있습니다.

이러한 모든 기능은 스칼라 컴파일러에 의해 컴파일 시간에 추가됩니다. 일반 클래스로는 이러한 기능을 구현할 수 없습니다.

웹 애플리케이션 개발에 Play/Scala 스택을 사용하는 장점은 무엇인가요?

다음은 Play/Scala 스택을 사용하여 웹 애플리케이션을 개발하는 주요 장점입니다:

  • 오픈 소스
    Play는 웹 애플리케이션을 개발하기 위한 오픈 소스 무료 소프트웨어 프레임워크입니다. – 더 나은 생산성
    Play 프레임워크의 자동 리로드 기능은 개발자의 생산성을 향상시킵니다. 변경 사항을 빌드, 배포 및 테스트할 필요가 없습니다. 변경 사항을 수행하고 페이지를 새로 고침하여 변경 사항을 확인할 수 있습니다. – 상태가 없고 개발하기 쉬운 REST API
    Play는 HTTP 기반의 상태 없는 모델로 웹 요청을 처리하므로 REST API 또는 RESTful 웹 서비스를 개발하기가 매우 쉽습니다. – 더 나은 오류 처리
    Play 프레임워크를 사용하여 웹 애플리케이션을 개발하면 브라우저에서 매우 유용한 형식으로 모든 오류를 표시합니다. 오류 메시지, 파일 위치, 오류가 발생한 줄 번호, 오류를 쉽게 이해하기 위해 코드 스니펫을 강조 표시합니다. – 고성능 및 더 나은 확장성과 반응형
    Play 프레임워크는 반응형 디자인 패턴을 따르고 Netty 서버를 기반으로 구축되어 비차단 IO 기능을 활용합니다. 이 기능 덕분에 매우 확장 가능하고 성능 뛰어난 애플리케이션을 쉽게 개발할 수 있습니다. – 확장하기 쉽습니다
    Play는 매우 유연한 프레임워크이며 플러그인 개발을 지원하여 기능과 기능을 쉽게 확장할 수 있습니다. – 고도로 동시성 및 더 나은 병렬 처리
    Scala와 Play 모두 함수형 프로그래밍을 지원하기 때문에 고도로 동시성 및 더 나은 병렬 처리 애플리케이션을 쉽게 개발할 수 있습니다. 함수형 프로그래밍은 불변성, 순수 함수 (부작용이 없는 함수), 패턴 매칭, 액터 모델 등을 지원하기 때문입니다. – 더 나은 재사용성, 쉬운 테스트 및 더 모듈화
    Scala와 Play 모두 함수형 프로그래밍을 지원하므로 더 모듈화되고 재사용 가능한 애플리케이션을 개발할 수 있습니다. 또한 더 모듈화된 애플리케이션을 테스트하기가 매우 쉽습니다.

Scala에서 지원하지 않는 Java의 OOP 구성 요소는 무엇인가요? Java에서 지원하지 않는 Scala의 OOP 구성 요소는 무엇인가요? Scala에서 도입된 새로운 OOP 구성 요소 중 Java에서 지원하지 않는 것은 무엇인가요?

Scala에서 지원하지 않는 Java의 OOP 구성 요소:

  • Scala에서는 인터페이스 개념이 없습니다.
  • Scala에서는 Enum 개념이 없습니다.

Java에서 지원하지 않는 Scala의 OOP 구성 요소 또는 Scala에서 도입된 새로운 OOP 구성 요소:

  • Scala 트레이트
  • 상속 다이아몬드 문제를 자동으로 해결합니다.

call-by-name은 무엇인가요? Scala와 Java는 call-by-name을 지원하나요? call-by-value와 call-by-name 함수 매개변수의 차이점은 무엇인가요?

call-by-name은 필요하거나 접근할 때에만 메소드/함수 매개변수를 계산합니다. 사용하지 않으면 계산하지 않습니다. Scala는 call-by-value와 call-by-name 둘 다 지원하지만, Java는 call-by-value만을 지원합니다. call-by-value와 call-by-name의 차이점: 이 둘의 주요 차이점은 아래와 같이 설명됩니다:

  • call-by-name에서는 함수 매개변수가 함수 호출될 때가 아닌 필요할 때에만 계산됩니다.
  • call-by-value에서는 함수 매개변수가 함수 호출될 때 계산됩니다.
  • call-by-value에서는 매개변수는 함수 실행 전에 계산되며, 함수 내에서 몇 번 사용하든 한 번만 계산됩니다.
  • call-by-name에서는 매개변수는 접근할 때마다 계산되며, 함수 내에서 사용할 때마다 계산됩니다.
  • Scala 구문 차이점:
    call-by-value:
def myFunction(a: Int, b: Int) { }

여기에서 a와 b는 myFunction에 대해 Call-by-value 매개 변수입니다. Call-by-name:

def myFunction(a: Int, b: => Int) { }

여기에서 a는 Call-by-value 매개 변수이고 b는 Call-by-name입니다.

다음은 Scala 언어로 웹 애플리케이션을 개발하기 위해 가장 인기있는 MVC 프레임워크입니다:

  • Play Framework
  • Scalatra Framework
  • Spray Framework
  • Lift Framework

Java 기반과 Scala 기반 Maven 프로젝트의 구조의 주요 차이점은 무엇인가요?

대부분의 Java 기반 프로젝트는 Maven을 빌드 도구로 사용합니다. 그러나 대부분의 사람들은 Scala 기반 응용 프로그램을 개발하기 위해 빌드 도구로 SBT를 사용하지만 일부 팀은 Scala 기반 응용 프로그램을 개발하기 위해 Maven을 사용하기도 합니다. Java 기반 및 Scala 기반 프로젝트의 Maven 폴더 구조는 거의 동일하며 아래 다이어그램에서 나타낸 것처럼 폴더 이름만 변경됩니다: java 및 scala 폴더 이름. Java 기반 Maven 프로젝트 폴더 구조: Scala 기반 Maven 프로젝트 폴더 구조:

Scala에서 Extractor란 무엇인가요? Scala에서 Constructor와 Extractor의 차이점은 무엇인가요? Scala에서 Extractor의 사용은 무엇인가요?

자바와 스칼라뿐만 아니라 대부분의 객체 지향 프로그래밍 언어에서 생성자는 객체나 클래스의 인스턴스를 생성하거나 조립하는 데 사용됩니다. 엑스트랙터는 생성자와는 반대로 작동합니다. 스칼라에서 엑스트랙터는 객체를 구성 요소 또는 매개변수로 분해하는 데 사용됩니다. 스칼라에서 apply 메소드는 생성자입니다. 내부적으로, 엑스트랙터는 unapply 메소드를 사용하여 객체를 구성 요소로 분해합니다. 스칼라에서 엑스트랙터는 주로 패턴 매칭 개념에서 사용됩니다. 패턴 매칭 개념에 대해서는 곧 논의할 예정입니다.

스칼라 기반 애플리케이션에서 ‘???’의 사용은 무엇인가요?

이 ‘???’ 세 개의 물음표는 스칼라에서 연산자나 메소드가 아닙니다. 이는 ‘진행 중인’ 메소드를 표시하기 위해 사용됩니다. 개발자는 해당 메소드에 대한 구현을 제공해야 합니다. 이 메소드는 아래의 scala.PreDef 클래스에 정의되어 있습니다:

def ??? : Nothing = throw new NotImplementedError

구현을 제공하지 않고 이 메소드를 실행하면 다음과 같이 ‘NotImplementedError’ 오류가 발생합니다.

scala> def add(a:Int, b:Int) : Int = ???
add: (a: Int, b: Int)Int

scala> add(10,20)
scala.NotImplementedError: an implementation is missing

스칼라 컬렉션 API에서 List와 Stream의 주요 차이를 설명해주세요. 이 차이를 어떻게 증명할 수 있을까요? 언제 Stream을 선택해야 할까요?

스칼라에서 List와 Stream은 모두 컬렉션 API에서 제공되며 거의 유사하게 작동합니다. 두 컬렉션 모두 변경할 수 없는(Immutable) 컬렉션입니다. 그러나 List와 Stream의 주요 차이점은 다음과 같습니다: List의 요소는 즉시 평가되고, Stream의 요소는 지연 평가됩니다. 즉, 요소에 접근할 때까지 평가되지 않습니다.

scala> var list1 = List(1,2,3,4)
list1: List[Int] = List(1, 2, 3, 4)

여기서 확인할 수 있듯이, List의 모든 요소는 List 객체를 생성할 때 평가됩니다. 그러나 Stream에 대해 동일한 작업을 수행하면 모든 요소를 볼 수 없습니다. 첫 번째 평가된 요소만을 볼 수 있고, 나머지 요소는 지연 평가됩니다. 아래의 예시를 참고하세요:

scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)

요소에 접근할 때만 평가되는 Lazy 컬렉션이 필요한 경우 Stream을 사용하는 것이 좋습니다.

Scala에서 ::#::의 차이점은 무엇인가요? Scala에서 :::#:::의 차이점은 무엇인가요?

Scala Collection API에서,

  • :::::는 List 클래스에서 사용 가능한 메소드입니다.
  • #::#:::는 Stream 클래스에서 사용 가능한 메소드입니다.
  • List 클래스에서, :: 메소드는 리스트의 시작 부분에 요소를 추가하는 데 사용됩니다.
scala> var list1 = List(1,2,3,4)
list1: List[Int] = List(1, 2, 3, 4)

scala> list1 = 0 :: list1
list1: List[Int] = List(0, 1, 2, 3, 4)
  • List 클래스에서, ::: 메소드는 주어진 리스트의 요소를 이 리스트의 앞에 연결하는 데 사용됩니다.
scala> var list1 = List(3,4,5)
list1: List[Int] = List(3, 4, 5)

scala> val list2 = List(1,2) ::: list1
list2: List[Int] = List(1, 2, 0, 1, 2, 3, 4)
  • Stream 클래스에서, #:: 메소드는 주어진 요소를 스트림의 시작 부분에 추가하는 데 사용됩니다. 이때 추가된 요소만이 평가되며, 이어지는 스트림 요소들은 게으르게 평가됩니다.
scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> s1 = 0 #:: s1
s1: scala.collection.immutable.Stream[Int] = Stream(0, ?)
  • Stream 클래스에서, #::: 메소드는 주어진 스트림을 스트림의 시작 부분에 연결하는 데 사용됩니다. 이때 추가된 요소만이 평가되며, 이어지는 스트림 요소들은 게으르게 평가됩니다.
scala> var s1 = Stream(1,2,3,4)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> val s2 = Stream(-1,0) #::: s1
s2: scala.collection.immutable.Stream[Int] = Stream(-1, ?)
  • :: 메소드는 List 클래스의 cons 연산자로 작동하며, #:: 메소드는 Stream 클래스의 cons 연산자로 작동합니다. 여기서 ‘cons’는 생성자를 의미합니다.
  • ::: 메소드는 List 클래스의 연결 연산자로 작동하며, #::: 메소드는 Stream 클래스의 연결 연산자로 작동합니다.

만약 전체 스칼라 개발자가 되고 싶다면, 어떤 기술 스택을 배워야 할까요?

전체 스칼라 개발자가 되기 위해서는 다음과 같은 기술 스택을 배워야 합니다:

  • 스칼라 2.11.7
  • Play 2.4.6 프레임워크
  • Akka 2.3 프레임워크
  • 빌드 도구 중 하나: SBT/Maven
  • JS 프레임워크 중 하나: CoffeeScript/JavaScript
  • 통합 개발 환경 중 하나: IntelliJ IDEA 15/ Eclipse IDE 4.x
  • TDD 및 BDD 프레임워크 중 하나: ScalaTest,Spec2,ScalaCheck,Mockito
  • Play와 스칼라를 이용한 마이크로 서비스
  • SCoverage
  • Scalastyle
  • 함수형 프로그래밍 디자인 패턴
  • 스칼라를 이용한 머신 러닝

{
“error”: “Upstream error…”
}

Source:
https://www.digitalocean.com/community/tutorials/scala-advanced-interview-questions