Scala面接トップ25問と回答——PDFガイド
初心者からベテラン開発者まで、理想の役割を獲得するための簡潔でエキスパートが作成したScala面接質問と回答をご紹介します。
1) Scalaとは何か?
Scalaはオブジェクト指向と関数型プログラミングパラダイムを融合した強力な静的型付け言語です。表現力と簡潔さを設計目標とし、Java仮想マシン上で動作し、Javaライブラリとシームレスに統合されます。
2) ScalaのSetとは? セット操作はどう行うか?
Scalaの Set は、同じ型のユニークな要素のコレクションです。mutable.Set と immutable.Set の両方を提供し、それぞれ add、remove、contains、union、intersect、diff などの集合論的操作メソッドを備えます。
3) ScalaのMapとは?
Map はキー・バリューペアのコレクションです。キーはユニークで、対応する値の効率的な検索を可能にします。値は重複可能。Scalaの Map APIには get、put、contains、mapValues などの関数的変換が含まれます。

4) Scalaの利点
- 定型コードを削減する簡潔で表現力豊かな構文
- 強力な型推論とパターンマッチングで安全なコード
- デフォルトでイミュータブルなコレクション、スレッドセーフティ向上
- Javaとのシームレスな相互運用性
- 組み込み並行処理サポート(Akka、Futures)
- 豊富なライブラリ/フレームワークエコシステム(Spark、Play)
5) Scalaが他言語を凌駕する点
- ジェネリクスがファーストクラスで、型システムと緊密に統合
- イミュータブルな
valがミュータブル/イミュータブルデータを明確に区別 ifやfor-yield等の制御構造が値を直接返し、三項演算子が不要- シングルトンオブジェクトがstatic構造に代わるクリーンな設計
- 永続イミュータブルコレクションが標準ライブラリに含まれる
- ネイティブタプルサポートと簡潔な構文で定型コード削減
- 過度なボイラープレートコードなし
6) Scalaの変数
Scalaはイミュータブルな値(val)とミュータブルな変数(var)を区別します。val は一度代入すれば参照を変更不可、var は再代入可能。
例:var myVar: Int = 0val myVal: Int = 1
7) クラスとオブジェクトの違い
クラス はオブジェクト生成の青写真で、状態と振る舞いを定義。オブジェクト はクラスのシングルトンインスタンスで、単一のグローバルにアクセス可能なインスタンスを提供。Scalaでは各オブジェクトがコンパイル時に匿名サブクラスを暗黙的に生成します。
8) Scalaの末尾再帰
末尾再帰とは、関数が最終アクションとして自身を呼び出すことです。Scalaコンパイラは末尾再帰呼び出しを反復ループに最適化し、深い再帰でのスタックオーバーフローを防ぎます。
9) ScalaのTraitとは?
Trait はクラスにミックスインできる抽象および具象メンバーのセットを定義します。継承を必要とせず再利用可能で合成可能な振る舞いを実現し、フィールドとメソッド実装を含められます。
10) Traitを使うべき場面
- 無関係なクラス間で振る舞いを再利用する場合
- 型振る舞いの多重継承が必要な場合
- Java相互運用性重視ならabstract classを優先
- パフォーマンスクリティカルなコードなら具象クラスを検討
- 再利用可能ライブラリ配布時、Traitは外部プロジェクトでコンパイル・再利用可能
経験者向けScala面接質問
11) ケースクラスとは?
ケースクラスは特別なイミュータブルクラスで、equals、hashCode、copy を自動生成し、パターンマッチングをサポート。コンストラクタパラメータはデフォルトでpublic valフィールドになります。
12) Scalaのタプルの用途
タプルは固定数の異種値を単一のイミュータブル構造にグループ化。専用クラスを定義せずにメソッドから複数の値を返す際に有用。
13) Scalaの関数カリー化
カリー化は複数引数を取る関数を、単一引数を取る関数の連鎖に変換します。部分適用を容易にし、合成性を高めます。
14) 暗黙パラメータとは?
暗黙パラメータは、明示的な引数がない場合にコンパイラが自動的に引数を供給できるようにします。implicit キーワードで定義され、スコープレベルの探索で解決されます。
15) クロージャとは?
クロージャは周囲のスコープから変数を捕捉する関数で、外側の関数が返った後もそれらの変数を使用可能にします。
16) モナドとは?
モナドは計算コンテキスト(Option、Future、List 等)をカプセル化し、コンテキストを保持しながら計算を連鎖する flatMap と map 操作を定義する抽象化です。
17) 匿名関数とは?
匿名関数(関数リテラル)は (args) => body 構文でインライン定義され、引数として渡したり変数に代入したりできます。
18) 高階関数の説明
高階関数は他の関数をパラメータとして受け取るか、関数を返します。例:
object Test { def main(args: Array[String]): Unit = println(apply(layout, 10)) def apply(f: Int => String, v: Int) = f(v) def layout[A](x: A) = s"[$x]" }
実行すると [10] と出力されます。
19) var と val の違い
詳細な比較は セクション6 を参照。
20) Option、Some、Noneとは?
Option はオプショナルな値を表現:Some(value) または None で、null 参照を排除しより安全なコードを実現。
21) Listへの要素追加方法
単一要素には :+、コレクションには ++= 演算子を使用:
var myList = List.empty[String]
myList :+= "a"
myList :+= "b"
myList :+= "c"
myList ++= List("a", "b", "c")
22) 文字列フォーマット方法
format メソッドまたは文字列補間を利用:
val formatted = "%s %i".format(myString, myInt) // または val formatted = s"$myString $myInt"
23) なぜScalaはイミュータビリティを推奨するか?
イミュータビリティは偶発的な状態変更を防ぎ、コードの推論を簡素化し、安全な並行・並列プログラミングに不可欠です。
24) Scala識別子の種類
- 英数字識別子(例:
myVar) - 演算子識別子(例:
++) - 混合識別子(例:
_foo) - リテラル識別子(例:
`my var`)
25) Scalaリテラルの種類
- 整数、浮動小数点、ブーリアン、シンボル、文字、文字列、複数行文字列リテラル
これらの質問は口頭面接の準備にも役立ちます。
Java
- Java BufferedReader完全ガイド:効率的な文字ストリーム処理
- Javaプログラミング言語:進化、バージョン、応用分野
- Java徹底解説:定義、特徴、プラットフォーム概要、バージョン履歴
- Java split() メソッド完全マスター:実践ガイドとコード例
- Javaでフィボナッチ数列を生成:for文、while文、再帰の実装例
- Javaネットワークプログラミング入門: java.netでソケット通信・TCP/UDP・ServerSocket/InetAddressをマスター
- Java ConcurrentHashMap完全マスター:操作、実例、ベストプラクティス
- Java 9モジュールシステム:リンクタイムとカスタムランタイムイメージ
- Java再帰処理の理解:仕組み、例、トレードオフ
- Java 抽象化マスター:抽象クラス、抽象メソッド、実践例
- Javaシングルトンパターン完全解説:安全な実装と活用法