体験記_Androidでクイズアプリを作ってみた

# 本記事に記載されていること
・Android Studioでクイズアプリを作ってみた体験
・コードを書いていて、個人的に学びになったこと
・Udemyの講座に沿って初の個人開発の体験記（not released）

初の個人開発。Udemy通りだが。

https://www.udemy.com/course/java-intro-for-android/?couponCode=KEEPLEARNING

# 成果物について
できたのはクイズアプリである。内容は以下である。
・4択の問題が全5問出題される。
・最後に5問中何問正解だったかの結果画面が表示される
・正解数によって結果画面のメッセージと、いくつ星を黄色く表示するかが決まる
・解答するとその問題の結果が、ポップで表示される
・結果画面で「もう一度」ボタンを押下すると、1問目の出題画面が表示される
・問題は**ランダム**で出題され、選択肢の順番も**ランダム**で表示される
・リリースはしておらず、ローカルでのみ動作可能
・Javaとxmlで開発する
・Udemyの講座通りに実施


# 取り組む前の著者の開発力
・仕事でWebアプリケーションの一部分を開発することはあるが、一から全部開発するという経験は無し
・「ボタンの表示/非表示→活性/非活性に変更する」を開発
・「受注で使われる情報をテーブルにカラム追加して、その値で検索画面にて検索できるようにする」を開発
・「ボタン押下時、画面遷移する間にリダイレクトページを差し込む」を開発


# 個人開発に取り組もうと思ったきっかけ

なにか自分で作ってみたいという気持ちがあった。
エンジニアとして働きはじめて数年になるが、
個人開発経験は0だった。

このまま何も作れない状態が続くのでは？という不安と
いきなり0から開発はできないかもと思い、今回のUdemyの受講にいたった。


# コードを書いていて、個人的に学びになったこと

大きく6つある。

# 1.まず、エミュレータを用意する
開発を始める前に、動作確認ができる環境を用意すること。
今回はエミュレータで確認した。

動作確認はコードを書き終わってから〜という完璧主義は開発には必要ない。適宜、動作確認をおこなって書いたコードが正常に反映されているか、どういう影響を与えているかを確認することで開発しやすくなる。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
加えて、
最近見た記事で「人のやる気に最も影響を与えるのは、進むという感覚」
というのを読んだのを思い出した。
エミュレータで確認することは進んでいることを感じられる。

https://yuchrszk.blogspot.com/2015/09/blog-post_24.html

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

# 2.インターフェースと抽象について

文法についておさらいできたのが良かった。

まずはメソッドについて。
メソッドには大きく3種類ある。
・処理をするだけのメソッド（voidがつく）
・処理をして結果を返すメソッド（値の型を指定し、returnで返す）
・メソッド名、引数、戻り値のみ記載され、処理を書かないメソッド（abstractという修飾子がつく）

この3つ目の**抽象メソッド**について理解が深まった。
抽象メソッドを持つクラスを**抽象クラス**という。

抽象クラスを使うメリットは次の2点である。
**ⅰ.メソッドの種類を増やすのを防ぐ**
**ⅱ.メソッドを書き忘れる可能性を防ぐ**

メリットがわかったら次は使い方である。
まず、**拡張と継承**についてもおさらいしておく。
クラスを拡張することで、そのクラス内のコードを継承できるようになる。

抽象クラスを使うには、extendsで拡張する。
拡張したら、抽象メソッドの中身の処理は記載しないといけない。
メソッド名が同じでも実行する処理を変えることができる。


**抽象クラスの問題点**
extendsにはクラスを1つしか書けない。
→これを解決するのがインターフェース


**クラスとインターフェースの違い**


| 項目 | 抽象クラス | インターフェース |
|:-:|:-:|:-:|
| インスタンス変数（newキーワードによる）| 書ける | 書けない|
|定数| 書ける | 書ける | 
| 通常のメソッド | 書ける | 書けない ※1 |
| abstract修飾子 | 抽象メソッドに記載が必要 | 記載が不要<br>（暗黙的にpublicかつabstractのため） |
| クラス名のとなり | extendsを記載 | implementsを記載 |
| 抽象メソッド | 書かなくてもよい | 必ず1つ以上書く ※2 |
| 複数実装 | 1つのクラスに1つのみ | カンマで区切れば複数実装可能 |

:::note info
※1: Java8以降、静的メソッドとデフォルトメソッドを書ける
※2: Java8以降、デフォルトメソッドのみも可能
:::

抽象クラスとインターフェースより詳しく知りたくなりいろいろ調べた。
[こちら](https://qiita.com/yoshinori_hisakawa/items/cc094bef1caa011cb739)の記事が参考になった。

# 3.多次元配列について
多次元配列とは、配列の中に配列が入っているもののこと。
あるデータのまとまりをいくつか用意するときに使う。

:::note info
配列を宣言するとき
型 [ ][ ]　配列名　＝　new　型[個数][個数] ;
:::

:::note info
多次元配列に値を入れるとき（X番目の配列のY番目に値を入れる）
配列名[添字X][添字Y]　＝　値 ;
:::

# 4.ArrayListについて
配列のデメリットを解消している。

**配列のデメリット**
①要素の数を決めておく必要があある
②要素を削除できない
③正確な要素の長さを取得できない
（実際に要素を追加していなくても宣言の長さを取得してしまう）

**→ArrayListを使う！**

:::note info
ArrayListを宣言するとき
ArrayList<型>　名前　＝　new ArrayList<>();

基本型はArrayListの型として使えない
→ラッパークラスを使う
:::


:::note info
ArrayListの多次元配列は
ArrayList<ArrayList<String>> listArray = new ArrayList<>();
:::


追加はaddメソッド、削除はremoveメソッド、
要素の値の取得はgetメソッド、長さの取得はsizeメソッドを使う.
（要素を削除すると添字は自動的に詰められる）

https://docs.oracle.com/javase/jp/8/docs/api/java/util/ArrayList.html


# 5. シャッフルする

ArrayListを使うとよい。
CollectionsクラスにはArrayList、Map、Setが用意されており、Collections.shuffleメソッドを使える。
これで値の順序の入れ替えができる。

https://docs.oracle.com/javase/jp/8/docs/api/java/util/Collections.html

listとArrayListの違いってなんだろ、と思ったので[こちら](https://www.sejuku.net/blog/14886)の記事を参照した。



# 6.メソッドチェーン
メソッド呼び出しを繋げたもの。

メソッドチェーンについては軽く触れられていましたが、詳しい解説はなかった。
普段の業務中でもなんとなくだったので、色々調べることに。

こちらの記事が参考になった。

https://qiita.com/okm-uv/items/50ca7e058b8f74e8b19c


# まとめ

多くの実装テクニックが組み合わさってできていることを実感した。
高校数学とかも複数の定理を組み合わせて問題を解いていたなと思い出した。

ある機能はどういう技術を組み合わせてできているのか、と考えると面白い。
複雑そうに見えることでも分解して考えると自分でもできると自信につながった。
今回のクイズアプリでは特に選択肢のシャッフルはどうするのだろうと気になっていたが、分解して考えたら簡単だった。

また何か作ってみたい。