雑多に技術メモと他色々

主に自分用な技術メモが多くなる気がする。他色々が書かれるかどうかは不明。

Javaの基本的なことを勉強するための課題

ふわっとJava書けるとは言うものの、細かいところはちょっとずつ知らなかったりするわけで、認識共有を図るために課題提示と一部はざっくばらんに説明をする試み。
ついでに自分も基礎知識をおさらい。
課題で確認したい観点や、それに対する説明は別途書いてみる。

想定する対象者

  • 一般的なJava文法は一通り理解している。
  • 完全なゼロベースじゃないにしてもアプリケーションをプログラミングした経験がある。

課題&講義時に想定する環境

  • 手元にJavaの開発環境は整っている。
  • 勉強会参加者複数人ができれば対面集合した状況。
  • 課題を解いている間は不明点をシークレットに質問できる仕組みがあると尚可。(個別チャットとか)

課題

1. equalsによるオブジェクト比較

文字列型のStringなどが同一のものであるかチェックするためにはequalsメソッドを利用するのは周知の事実。
という中でこんな課題。

1-1. 比較演算子との違い

Objectのequalsによる比較と「==」による比較の違いを説明してください。

1-2. equalsの実装

下記の仕様を満たすEqualsSampleクラスを作り、equalsメソッドを正しく実装してください。
(手段は問わないけど素で実装する場合に気を使う点は一応把握+説明してほしい)

  • java.lang.Integerクラスのフィールドidを持つ。
  • java.lang.Stringクラスのフィールドnameを持つ。
  • 引数なしコンストラクタを持つ。
  • 各フィールドはgetterとsetterで値を取得/設定できる。
  • 2つのオブジェクト間でidの同士が一致、nameの文字列同士が一致する場合、オブジェクトが同一だと判定するequalsメソッドを持つ。
  • フィールドに設定される値に制約はない。

※ IntegerやStringがフルパッケージなのは「Stringという独自クラスを作った!」的なケースは除きたかったからというだけ。

package com.sample;
// コードのテンプレ
public class EqualsSample {

	private Integer id;
	private String name;

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

	// TODO equalsメソッドを正しく実装してください。
}

2. toStringについて

2-1. toStringメソッドの用途

toStringメソッドが利用されるシーンを挙げてください(ブレスト)。

2-2. デフォルトのtoStringメソッド

toStringメソッドを独自実装していない場合に出力される文字列が何か説明してください。

2-3. toStringメソッドの実装方法

toStringメソッドを独自実装する場合、どのような方法を利用するか話し合ってください(ブレスト)。

3. スコープ

3-1. スコープの種類

メソッドやフィールドに付与できるpublic, privateなどのスコープがあります。
ということで、ここに付与できるスコープを公開範囲が狭い方から順に全て並べてください。
加えて公開範囲がどのように異なるかも説明してください。

3-2. スコープの用途

どのようなケースで各スコープを利用するか話し合ってください(ブレスト)。

4. Collection

よく使うけど実は知らなかったり...

4-1. 代表的なCollection

頻繁に利用するCollectionとして、下記のインタフェースについてどのような性質を持つかそれぞれ説明してください。

4-2. プリミティブとObjectの管理の違い(もはやjavaじゃないし難易度高い?)

int, long, charなどのプリミティブ型の変数と、各種Objectの変数の違いをポインタなどの概念を用いて説明してください。
※ 特にvar1=var2;といったといった代入を行った場合に、Objectだと同一のものを指している点の概念を説明してほしい。

4-3. 配列が要するメモリ領域(これも結構めんどい?)

配列を利用した場合、必須となるヒープの連続領域がある点について説明してください。

5. throwできるものの種類

javaのコード中でthrow可能なものは何か、知っているものを列挙してください。
複数挙げられる場合、その性質の違いを説明してください。

6. 特殊な文字列表現

標準出力に"はろー"と出力するJavaコードを書いてください。
ただし、ソースコードに利用して良い文字はASCIIに限り、ソースからコンパイルした.classファイル以外の外部リソースに頼ることも禁止します。

7. 特殊な数値表現

下記の出力結果を答えてください。

  • System.out.println(010);
  • System.out.println(0x10);

ざっくばらんな説明

import文あれこれ

importを書くとどうなるのかとか、static importの話とか。

色々なstatic

classにつけた場合、フィールドにつけた場合、メソッドにつけた場合。

javadocの書き方

どんな風にjavadocを書くか。
javadocのテンプレはどこから引っ張ってくるのか。

getterやsetterについて

不要論とか、とはいっても必要な時はあるんだよ的な話とか、現状はもはや無いと不便なケースもあるとか。

オーバーロード・オーバーライド・曖昧な呼び出し

それぞれどんなものなのかざっくり。