Q & A

フォーマット記述子とは何ですか

System.out.printf に渡す%sなどの表示形式を指定するための文字列です. Java言語の場合,C言語とほぼ同じですが,Javaの場合は型がより多彩ですので,どの記述子にすべきかを注意する必要があります. 記述子が対応しない型の値を対応づけると実行時エラー(IllegalFormatConversionException)が発生します. フォーマット記述子と対応する型を以下に示します.

なぜ\nではなく,%nを利用するのでしょうか

C言語では,\nで改行を表していましたが,Javaでは明示的に \n を使うことはありません. 改行のみを出力するときは,System.out.println(); とし, 改行付きで出力するときは,printlnメソッドの引数に出力したい内容を渡します. また,System.out.printf でも,\nは使わず%n を利用する方が良いとされています.

なぜなら,改行コードはプラットフォーム(WindowsやmacOSなど)で異なるためです. Windows では,改行は\r\nの2バイトで表されており,macOSやLinuxは\nで改行を表しています. 古いmacOS(MacOS 9以前)は\rで改行を表していました.

一方で,Java は,一度書けばどこでも動く(Write Once, Run Anywhere)ことを重要視しています. そのため,環境ごとの違いをどこかで吸収する必要があります. macOSでは改行されるのに,Windowsでは改行されない,のようなプログラムがあっては困るわけです. そのため,改行コードを直に書くことは避け,改行コードを表す記号を利用する方が良いとされているわけです.

改行が必要な場合は,printlnprintf%nを渡すようにしましょう.

import 文とは何ですか

Javaの型は必ずパッケージに所属しています. パッケージとは,ディレクトリのようなもので,階層構造が存在します. パッケージには,サブパッケージと型が属します. 型が約4,000個存在するため,パッケージを導入して分類しなければ混乱するためです. 標準的には,java.langパッケージに所属する型が利用できます. しかし,java.langパッケージに所属する型以外を利用する場合は,どのパッケージの型を利用するのかを指定しなければいけません. その指定を行うのが,import文です.

Java言語の型一覧は次のURLから確認できます. https://docs.oracle.com/javase/jp/8/docs/api/

なお,java.langパッケージには,String型やInteger型,Double型, System 型などが所属しています.

可視性とは何ですか

Javaでは実は,publicprotectedprivate というキーワードをクラス,メソッド,フィールドに付けられます. このキーワードの付け方により,どこからアクセスできるのかを制御できるようになります.

可視性のデフォルトはなしprivateより弱く,protectedよりも強い制限です. この可視性を使うときは,publicは最低限にする方が良いとされています.

リンクリストとは何ですか

順序を持つデータ集合を実現する方法の一つ. 各要素が次の要素へのリンクを持つことで順序を持つデータ構造を実現しています.

下のようにNode型が次の要素へのリンクであるNode型のフィールドと, 要素である valueフィールドを持ちます. 最初の要素さえ持っていれば,最後まで順番に辿れるようになります.

リンクリスト

Wikipediaの連結リストも参照すると良いでしょう.

インデントが面倒です

1行ずつ手作業でインデントしていくのは面倒な作業です. そのような作業はPCに任せましょう. ほとんどのエディタには,対象のプログラムを一括でインデントしてくれる機能が揃っています. そのような方法を調べて,利用してください.

変数のスコープが短い方が良いのはなぜですか?

変数のスコープとは,変数の有効範囲のことであると学びました. プログラムを書く時には,一般的にこの有効範囲は狭い方が良いとされています.

スコープが広い場合,一度にいろんな変数のことを把握しておかなければプログラムの挙動がわかりません. 一方スコープが狭いと,ある場所(関数,メソッドやブロック)に関係する変数自体が少なくなります. すなわち,その場所に書かれた内容の理解がより容易であると言えます.

メソッド冒頭の変数宣言を止めよう

同様に,変数宣言も必要な箇所で行うようにしましょう. 関数,メソッドの冒頭に必要な変数をまとめて宣言するのは,宣言する箇所が決められていた時代の名残です. 今現在のC言語ですら,変数は関数の冒頭以外でも宣言できます. 必要な時に必要な変数を宣言するようにしましょう.

なぜmainメソッドに処理を書かない方が良いのでしょうか

Java言語は全てのプログラムが型(クラス)として作成されます. staticキーワードが付けられていないメソッド,フィールドは,実体に対して1つ存在します(newすると異なる実体が作成され,実体ごとに同じ定義ながらも異なる値を持つ).

対するstatic キーワードが付けられたメソッド,フィールドは,型に対して1つ存在することになります. Java言語では実体を作成してプログラムをするのに,型に対して1つしか存在できないstaticが付けられたメソッドに処理を書くのはJavaの書き方としてはあまり適当とは言えません.

プログラムを課題として捉えて,一度書けばあとは捨てると言う考えではある程度以上は上達しません. 後からどのように利用されるか,どのように拡張されるのか,と言う視点も持って取り組むようにしましょう. そのためには,使い捨てになりがちな悪習を止める必要があります. mainの処理を最小限にし,ifforなどがないようなプログラムを書いていきましょう. その指針として,クラス定義の基本形を挙げていますので,この指針に従ってプログラムを書いていきましょう.

キャメルケースって何ですか?

キャメルケース(CamelCase)とは,プログラム中で名前を書くための方法の1つです. クラス名や変数名,メソッド名は,内容を表すために,複数の単語から構成されます. その各単語の頭文字のみを大文字にし,そのまま繋げたものです. ラクダのコブのような形になることから付けられています. 一番最初の単語の頭文字が大文字の場合をアッパーキャメルケース(UpperCamelCase),小文字のものをローワーキャメルケース(lowerCamelCase)と呼びます.

一方,各単語をアンダーバー(_)で繋げる方法をスネークケース(sanke_case),ハイフン(-)で繋げる方法をケバブケース(kebab-case)と呼びます. スネークケースはC言語などで,ケバブケースはHTMLなどで用いられることが多いです. 変数名の付け方は各言語で推奨される方法がありますので,その方法に従うことをお勧めします.

Javaでは一般的に次のような規則で命名されます.

各命名方法で書いてみると次のようになります.

System.exit は使わない方が良い?

Javaのプログラムを終了するための手段として,System.exit(0)が用意されています. System.exitに渡す数値がステータスコードとなり,プログラムが終了します. これは,他の如何なる処理が動作中であっても強制的に終了させます.

なぜmainメソッドに処理を書かない方が良いのでしょうか」にも示した通り,Javaは型を作成します. これは,作成したプログラムは他のプログラムからも呼び出される可能性がある,と言うことを指します. そのようなJavaプログラムで闇雲に System.exit を呼び出して,プログラムを終了させていると,予想外の動作となることでしょう. 特に,WebアプリケーションをJavaで作っている時に,System.exitを呼び出すと,Webアプリケーション全体を終了させることになります. そのようなことがないよう,System.exitの代わりに,returnで値を返すなどし,System.exitmainメソッド内のみにするなどしましょう.

講義資料に間違いを見つけました.

講義資料に間違いを見つけた場合は,間違いの報告をお願いします. 報告は,バグレポートから行えます. 具体的な報告方法は,こちらを参照してください.

GitHub にアカウントを持っている場合,匿名で報告する場合の2通りがありますので, 上記バグレポートに記載されている説明にしたがって報告をお願いします.

バグ報告は以下からお願いします.どちらも同じところに報告されますので,どちらで報告してもらっても良いです.