【入門者向け】Java演習問題:オブジェクト指向編

javaオブジェクト指向の演習問題
  • このエントリーをはてなブックマークに追加
  • Pocket

このページではJavaオブジェクト指向の演習問題をご用意してみた。

時間があるときにスキルアップとして、トライしてみていただければと思う。

Javaオブジェクト指向の演習問題

オブジェクト指向とはなんぞや?という方は下記を先に確認いただくのが良い。

解答方法

・入力値は問題で定められた規則に従い、正しく入力されるものとし、入力ミスなどは考慮しなくてよい。

問題1(継承)

以下のプログラムを参考にし、以下のAbstractAutomobileクラス(自動車クラス)を継承したMyCarクラスを作成しなさい。

継承元となるクラス

MyCarクラスは、以下の条件とする。

  • 車種区分:普通者
  • 車種(モデル):自家用ワンボックス車
  • 乗車定員:7人

作成したクラスは、以下のMainクラスを使用して実行する

実行例:

  • 車種(モデル)は自家用ワンボックス車です
  • 乗車定員は7人です
  • 車種区分は普通者です

問題2(インターフェースの実装)

4つの項目を持つCSV(カンマ区切り)ファイルを読み込み、指定された順序に並び替えて表示するプログラムを作成しなさい。

4つの項目はそれぞれ

・日付

・最高気温

・最低気温

・平均気温

となっており、表示する順序は

・最高気温の高い順

・最低気温の高い順

・平均気温の高い順

・日付の古い順

の4つの順序の優先順位とし、表示時の列順序も同様とする。

なお、読み込みファイルは「data」を使用すること。

また、プログラムの作成においては、並び替えの順序判定を行う為のTemperature Comparatorクラスを作成し、Collectionsクラスによるソートを利用するものとする。

実行例(「data.csv」を利用した場合)

 

 

 

 

 

 

 

以下、回答

問題1 解答/解説

解答例

オブジェクト指向に関する問題だ。

オブジェクト指向を学ぶ際に、例え話として車を表すCarクラスとバスやトラックなどを表すクラスの関係を用いることがある。実際にどのような形で使われるのかを確認する問題と考えていただければと思う。

抽象化

解答例を見て、コード量の少なさに驚いた方もいるかもしれない。

継承元となっているAbstractAutomobileクラスには各種メソッドが用意されており、実体となるMyCarクラスでは、その「差」になる部分だけを用意すれば良い。

また、AbstractAutomobileクラスは継承されることを前提とした「abstract」で定義されており、継承したクラスが用意すべきメソッド(getCapacity、getCarModel)を指定している。

このように「abstract」が指定されたクラスやメソッドを抽象クラス、抽象メソッドと呼び、このようなクラス・メソッドを定義する事を「抽象化」と呼ぶ。

抽象化は実体を宣言するのでは無く、継承先のクラスに実装を求めるものだ。

Javaをはじめとするオブジェクト指向言語では、この抽象化によって、オブジェクトにバリエーションを持たせる手法が多い。

最も身近に利用されるのが、java.io.InputStreamやjava.io.OutputStreamだろう。

InputStreamは、データ読み込みの為の基本的な機能を備えているが、その読み込む媒体によって実装を分けている。

ファイルを読み込む為にはFileInputStreamを用いるし、テキストデータであればStringBufferInputStream、バイナリデータであればByteArrayInputStreamを用いる。

いずれも、データを読み込む為のread()メソッドを実装しており、InputStreamで用意したread(byte[] b)やread(byte[] b,int off,int len)などを利用する事も可能だ。

プログラム作成過程には、「プログラム設計」と呼ばれる、どのようなクラスやメソッドを作成すべきかを検討する段階があるが、オブジェクト指向言語を利用する場合には、抽象化と継承を効率よく利用し、機能の共通化を図るとスマートなソースコードが書けるだろう。

問題2 解答/解説

解答例

interfaceの実装に関する問題だ。

まず、Mainクラスの処理だが、こちらはCSVファイルを読み込んでカンマ区切りの処理を行っているだけなので、詳細は割愛する。

注目すべきは①のTemperatureComparatorを生成している個所と、その次のCollections.sort()メソッドを呼び出している個所だ。

Collections.sort()メソッドは、Listオブジェクトの並び替えを行うためのメソッドで、Collectionsクラスの政的メソッド(static)として定義されている。

静的クラスなので、インスタンスを生成する必要なく利用可能だ。

このメソッドに対し、

  • 並び替えを行うリストオブジェクト
  • 並び替えのルール(順序付けの判定)を実装したTemperatureComparatorクラスのオブジェクト

を渡すことで、リストオブジェクトの中身を並び替えてもらうことが可能なのだ。

次に、TemperatureComparatorクラスのソースを確認してみよう。

まず、クラス宣言後半の、「implements Comparator」という記述に注目してもらいたい。implementsは実装するインターフェースを記述する際のもので、ここでは「Comparatorインターフェースを実装する」とう意味を表している。

インタフェースの実装とは何か?

ここで「インターフェースの実装」とは何かを整理しておこう。

簡単に言ってしまうと、インターフェースとはプログラムの実体部分を持たず、その実装されるクラス(ここではTemperatureComparatorクラス)にその実体部分を持つという事になる。

インターフェースとなるクラスでは、メソッドの型(引数や戻り値の型)だけを定めており、このメソッドを抽象メソッドと呼ぶ。

抽象クラスでは、そこに定められる抽象メソッドにはabstractの記述が必要だったが、インターフェースでは、そこに定められるメソッドはすべて抽象メソッドであるため、abstractの記述は不要だ。

Comparatorインターフェースにはcompare()メソッドとequals()が抽象メソッドとして定められている。

compare()メソッドでは、2つのオブジェクトを自身で定める基準に従って「どちらが大きいか」の順序付けを行う。

equals()メソッドでは、2つのオブジェクトが「等しい」とされるかどうかを判断する。

Comparatorインターフェースを実装するクラスでは、この2つのメソッドを用意しなければならない。

模範解答では、TemperatureComparatorクラスを

public class TemperatureComparator implements Comparator<String[]>

と定義しており、String配列を比較するルールを定めなければならない。

compare()メソッドでは、問題の指示に従い、

・最高気温の高い順

・最低気温の高い順

・平均気温の高い順

・日付の古い順

の4つの基準で大小を判定している。

この比較結果により、List<String[]>が並び替えられ、出力結果となっている。

また、観察力の鋭い方は、TemperatureComparatorクラスがequals()メソッドを実装していないことに気が付くだろう。

本来であればString配列を題意に従って比較し、同一であることを判断する為のequals()メソッドを実装するべきなのだが、ここでは省略している。

省略といっても、equals()メソッドが無いのではなく、TemperatureComparatorクラスは親クラスとなっているjava.lang.Objectクラスのequals()メソッドを継承しており、Comparatorインターフェースのequals()メソッドの実装としては、java.lang.Objectクラスのequals()メソッドが使用されることになる。

単なる並び替え処理の場合ではあまり問題にならないため、今回の解答例ではequals()メソッドを省略しているが、Comparatorを使用する一部のクラスでは、equals()メソッドを正しく実装しなければならないこともあるので注意してもらいたい。

「正しく実装」とは、compare()メソッドが「0」を返すケースと、equals()メソッドがtrueを返すケースが同じになるような実装を言う。

まとめ

このページではJavaオブジェクト指向の演習問題を2つご用意してみた。ぜひ回答を見る前にトライをしていただければ幸いだ。

  • このエントリーをはてなブックマークに追加
  • Pocket

このページの続きや関連ページは下記から一覧で確認できる。

短期間でエンジニアになる方法

・「まったくの初心者だけどエンジニアになりたい!」

・「プログラマーとして転職をしたい!」

という方はリナックスアカデミーの資料を見てみてください。短期間で未経験からエンジニアになることができるスクールとして15年間選ばれ続けてきた理由やノウハウが載った資料です。

エンジニアの入り口に立つために必要な勉強技術の最新動向本当に使えるIT資格学習に役立つ国からの奨励金などの情報が詰まっています。

無料で2,3日中にお手元にお届けします。


資料を見てみる

SNSでもご購読できます。

コメントを残す

*

ゼロからエンジニアを目指す方へ
短期間でエンジニアになる方法

必要な勉強や技術の最新動向、本当に使えるIT資格、学習に役立つ国からの奨励金などの情報を無料でお届け

資料を見てみる