Kazyの自己啓発日記

【プログラミング】損しないJava等オブジェクト指向言語の勉強方法

今回は、プログラミング言語の一種「オブジェクト指向言語」の勉強方法を紹介します。

 みなさん、こんにちは、こんばんわ。Kazyです。

 さて、いきなりですが、あなたに質問です。

「オブジェクト指向型の言語、どうやって勉強していますか??」

 オブジェクト指向型言語として有名なものを挙げていくと、JavaやC++、Dartなどが挙げられます。

 それらの言語、ちゃんと思いのままにかけているでしょうか。オブジェクト指向型言語に慣れていないとおそらく答えはNoになるのではないでしょうか。

 かくいう私も、昔初めてオブジェクト指向型言語としてDartを書く機会があり、その時はクラスの定義やそのオブジェクトをどこにストックさせるのかというので散々悩みました。

 がしかし、悩んだ挙句、勉強の方法で学習効率が全く違うという事がわかったのです。

 そして、今回、私と同じような悩みを持っていて、業務として新しくJavaやDart、C++を描き始めた方もいらっしゃると思います。

 今回は、そんなあなたにJava等のオブジェクト思考型言語の勉強方法を公開していこうかと思います。

 それでは今回のコンテンツです。


~ 本記事のコンテンツ ~



オブジェクト指向型言語とは?

 第1章として紹介するのが、オブジェクト指向型言語についての説明です。

 あなたはそもそもオブジェクト指向型言語のJavaやDartがどういった性質があるのかお分かりでしょうか。

 また、手続き型言語の”C言語”や”GO言語”とどのような違いがあるのか説明できるでしょうか。

 この章ではその点を解明していきます。

  • オブジェクト指向型言語の特徴
  • 手続き型言語の特徴
  • オブジェクト指向型言語が人気な理由

 それでは一つ一つ見ていきましょう。


 オブジェクト指向型言語の特徴

そもそもオブジェクト指向型言語がどんな特色を持っているのかご存知でしょうか。

 さて、まずお話ししてくのが、オブジェクト指向型言語の特徴について。

 オブジェクト思考が多言語の特徴として挙げられるのが「is-a」の関係と「has-a」の関係があるという事です。

 それぞれ見ていくと、まずis-aは継承関係があるということを示し、has-aは包含関係があるということを示しています。


is-a(継承関係)

 is-a(継承関係)にあるということは、サブクラスでスーパークラスの機能を引き継げるというのがあります。

 例えば、役所というクラスを継承した(性質を引き継ぐ)区役所や市役所などは、役所の機能の他に区役所や市役所での機能を加えたものになります。

 この場合、「市役所 is a 役所」「区役所 is a 役所」といった関係が生まれます。

 これが継承の関係です。


has-a(包含関係)

 そして、has-a(包含関係)にあるということは、クラス内でのクラス内でオブジェクトを保存する事ができ、カプセル化などを可能とする性質になります。

 例えば、市役所や区役所はコピー機を持っているし、住民情報を持っています。窓口に行けば住民票を得ることもできるでしょう。これがhas-aの関係です。

 「市役所&区役所 has a コピー機」「市役所&区役所 has a 住民情報」「市役所&区役所 has a 住民票の発行権」というイメージです。

 住民情報に関しては、例えば電子情報だとすると、どこの市役所や区役所でも得る事ができると思います。がしかし、コピー機はその場でしか使えません。

 これがカプセル化です。同じクラス内でしか使えないオブジェクト(フィールド)を設定する事ができます。

 オブジェクト指向型言語では、has-aの関係のようにクラスがフィールドやコンストラクタ、メソッドを持つ事ができるという性質がある特色があります。


 オブジェクト指向型言語の特徴として「is-a(継承関係)」「has-a(包含関係)」の2つがあります。

 いかがでしょうか。オブジェクト思考型言語の特徴を掴むことはできたでしょうか。

 次に手続き型の言語の特徴を述べていこうかと思います。


手続き型言語の特徴

CやGOなどの手続き型言語はどのような特徴があるのでしょうか。

 さて、次に紹介するのが、手続き型言語の特徴についてです。

 ここでは軽くしか紹介しませんが、特徴として、オブジェクト指向型言語の特徴からis-aとhas-aの関係を取り除いたものに似ているイメージを持って貰えば結構です。

 どういうことかというと、プログラムがただ上から一番下まで一方通行で実行されるという事です。

 メソッドを使いたければ、呼び出し前(上)にメソッドの定義をしないと使用できません。

 また、メソッドをどんどん繋げていき、最終的な値を入手したりします。これが手続き型言語と言われる所以です。

 手続き型言語の特徴として性質上、上から上から処理が書かれているので、上からソースコードを見ていけばどのような処理が行われているのかが一目でわかります。

 なので、CやGOなどの言語で書かれたソースコードを見ると、ちゃんと上から処理が書かれていますし、メソッドがどんどん連なっているのがわかると思います。


オブジェクト指向型言語が人気な理由

なぜオブジェクト指向型言語が人気を集めているのでしょうか。

 そして、次に紹介するのがオブジェクト指向型言語が人気を集めている理由についてです。

 オブジェクト指向型言語がメリットに感じられるのは以下の点でしょう。

  • 学習コストが低い
  • 不具合が起きた時のメンテナンス性が良い
  • ソースコードに変更を加えやすい

 それでは一つ一つ紹介していきます。


学習コストが低い

 JavaやDartなどのオブジェクト指向型言語は、その言語の性質上オブジェクトを扱う概念になります。

 つまり、継承関係や包含関係があるため手続き型言語に比べてプログラムの組み立てが比較的簡単になります。

 もちろん、オブジェクト思考が多言語の中でも学習コストのランクはあり、C++やScalaなどは中でも難しい言語として知られています。

 がしかし、一般的な手続型の言語のFortranやC言語に比べると、簡単な言語のPythonやJava等の方が学習コストが低いのは確実です。

 プログラミング初心者や学習コストを減らしたい方はオブジェクト指向型言語を選ぶ傾向にあります。


不具合が起きた時のメンテナンス性が良い

 そして、何より大事なのがメンテナンス性が高いという事が挙げられます。

 継承関係や包含関係があるからこそ、クラスごとにメンテナンスを行う事ができ、テストも比較的簡単に行う事ができます。

 また、クラスをモジュールとして用意する事がでたり、オーバーライド(継承による上書き)も可能なため、メンテナンスを簡単に行う事ができます。


ソースコードに変更を加えやすい

 設計の段階で、ソースを変えて表示結果を変更したい場合のことを考えてみましょう。

 オブジェクト指向型言語の場合は、表示結果を変えるオブジェクトだけ変更すれば大丈夫なのです。

 がしかし、手続き型言語の場合は、その表示するまでの過程も変更を加えないといけません。

 後々に変更を加えるようなプログラムは必ずオブジェクト指向型言語で作っておいた方がソースに変更を加えやすいので、人気があるのです。



エンジニアのプログラムを組み立てる思考術

 さて、第2章で紹介していくのが、エンジニアの思考術について。

 プログラミングを行うにあたってどのような思考回路でプログラムを組み立てているのでしょうか。

 今回は以下の点に絞って紹介していきます。

  • アウトプットから考えて組み立てていく
  • 必要があれば小さく分解していく
  • 視認性の良いプログラムを意識する

アウトプットから考えて組み立てていく

結論として何が欲しいのかを理解しておくとプログラムを記述しやすくなるでしょう

 さて、まず一つ目に紹介していくのが、コーディングを始める時の思考術について。

 プログラムのコーディングを始める時に意識することは、まずアウトプットから考えていくということです。

 例えば、1画面を表示させるようなプログラムがあったとします。

 この時、結論としてアウトプットが欲しいので、画面を表示させる処理を記述しようとします。

 がしかし、その画面表示をする処理を行うために必要な要素が必ず存在するはずです。

 また、その繰り返しで後ろから後ろから考えていき、プログラムを組み立てていきます。

 必要があればプログラムの初めの方に変数を用意したり、繰り返しが行われそうならばFor文やWhile文を用いて書いていきます。

 アウトプットから書くことによって、今書いているプログラムにどのような処理が必要なのかを考える事ができ、スムーズにコーディングをする事ができます。


必要があれば小さく分解していく

同じような処理を行うときはモジュール化して小さく分解していきましょう。

 さて、次に紹介するのが小さく分解してくという必要性について。

 まず結論から言うと、プログラム自体は小さく分解せずに長々と記述しても動いたりします。これは全ての言語で当たり前のように成り立ちます。

 がしかし、ここで言いたいのは、そのような冗長なプログラムをメンテナンスしたりする時に迷惑になってしまうと言う事です。

 そのようなソースだと、コンパイルエラーがどこで起こっているのか分かりにくかったりします。

 なので、繰り返し処理や同じような処理が行われそうなものは一つ一つをメソッドで定義してモジュール化し、小さく分解してく事が大事になってきます。

 変数も同じような構造が何回も続くときはクラスを用いてカプセル化して小さく分けておく事で、使いたい時に使いやすくなります。

 オブジェクト指向型言語の特徴である継承関係や包含関係が良い特徴として存在しているので、メリットを活かすためにも小さく分解する事を考えていきます。


視認性の良いプログラムを意識する

視認性が良いプログラムだと他の人が見る時に理解がしやすかったり、自分が理解しやすかったりします。

 さて、3つ目に紹介するのが、視認性の良いプログラムを意識すると言うことについて。

 視認性が良いプログラムか否かというのが一番顕著に現れてくるのが、コメントアウトの有無ではなく、変数の定義だったりします。

 例えば、Javaプログラムでメッセージを文字型のString型で定義した時に、変数名としてmを記述するということは使用上は可能です。

 がしかし、mという一文字だけをみてどんな変数なのか分かりますでしょうか。

 良い例としては、どんなメッセージなのかまで書いておくように、エラー用のメッセージだとmsgForErrorやerrorMsgなどでしょうか。

 Boolean型のメソッド名を設定する時は、「 is〜()」や「isNot~()」で設定したりすることで英語っぽく読むこともできます。if(A.isB()){~}みたいな感じです。

 For文で回す時のインクリメント用の変数はincrementやindexなどの頭文字をとって「i」と設定したりする事も大事です。

 一文字変数を使ってはダメというわけではないのですが、時と場合によっては分かりにくいソースになってしまうので特に自分で設定する値は必ず視認性が良いものを記述しましょう。



JavaやDartの勉強術

 さて、第3章で紹介していくのが、JavaやDartなどのオブジェクト指向型言語の勉強方法について。

 私自身がDartやJavaを勉強してきたので、その勉強方法や他のプログラマーが実践していることを紹介してきます。

 今回はレベル別に簡単な点から上級者向けの点の順に、以下のようなポイントに絞って紹介をします。

  • 簡単なプログラムから始めてみる
  • 完成されているサービスを見て学ぶ
  • 実際にサービスを自分で作ってみる

 それでは一つ一つ紹介していきます。


簡単なプログラムから始めてみる

まず、プログラミング言語の基本文法などを学んでおくとかなり良いでしょう。

 さて、まずは簡単なものから始めてみるという基礎的なものについて。

 当然のお話ながら、言語が異なれば文法は似ているものもありますが、基本は全く違います。

 if文もすぐに()が必要な言語、必要ない言語があったりします。他にもラムダ式の組み立て方などなどがわかっていないと先に進みません。

 そのため、まずは基本の文法から学んでいきましょう。

 もし仮に難しいようであれば型推論がかなり強力なPythonなどの言語から始めてみるのもいいと思います。

 これらの言語はデータ型を書かなくても勝手にプログラムが考えてくれるので、初手の学習言語としてはかなり良いと思います。

 ここで何が大事なのがというと、急ぎすぎないという事です。

 「簡単だから実際に書かなくてもいいや」とスピードを上げたままにすると、後々に文法がわからなくなってしまうので痛い目に遭います。

 自分のペースに合わせて文法は学習していきましょう。文法はあくまでもツールです。学習の本来の目的ではないことに注意しましょう。


完成されているサービスを見て学ぶ

基本文法がわかれば、実際の処理のフローなどがわかったりしてくるので、今度はプロダクトを見て学びます。

 そして、次のステップとして紹介するのが、すでに完成されているサービスのソースを見て学ぶという方法です。

 方法としては、すでに存在しているソースをVS Codeなどのエディタにコピー&ペーストを行い、ソースを後ろから見ていきます。

 もう一度言います。大事なこととしては、アウトプットが何かと言う事です。ソースを後ろから見るのです。

 そして、処理の途中で何をしているのかをコメントアウトとして説明を書いていき、理解を深めていきます。

 進めていくと、その際に新しく出てくる文法が必ず存在します。また、謎の標準ライブラリを用いて処理を行っている箇所もあります。

 そうしてその処理を見つけては前の基本文法を学ぶ段階に戻ったりしてその言語の理解を深めていきます。

 ここで大事なこととしては、をすべての処理をなんとなくで理解した後、細分化してプロダクトの処理のフローを理解していくということです。

 初めから全てを完璧にしようとしたら必ず頭はパンクします。そのため、まずは全体像を見て、その後に小さく見ていくのです。

 そうすると、ソースコード自体が大きなプログラムの塊の集合体として見えてきて、何を処理していくのか理解する事ができるので応用がしやすくなります。


実際にサービスを自分で作ってみる

元々あるサービスのソースを少し変更したりした後に、自分でも似たようなサービスを作ってみましょう。

 さて、学習方法の最後として紹介するのが、実際にサービスを作ってみるということです。

 手順としては、先ほどの段階で理解した現存するサービスのソースを自分で少し変更してみましょう。

 ここでいう変更というのは、ただ単に文字を変えるということではなく、文字の格納場所を他フォルダに変更してみたり、メソッドを追加して機能を追加してみたりすることです。

 そうして、言語特有のエラーの検出方法や実行速度などの言語の仕様、必要性について考える事ができます。

 言語特有の理解を繰り返していくと「その言語で何ができるのか」ということに気づき始める事ができます。実は学習では一番ここが大事だったりします。

 結局、作るプロダクトによって使う言語が決まるので、何を作るのかによって言語の使い分けをすることができれば、良い学習ができている証拠です。

 そうして、言語の特有性を理解してきた段階で、最後にその言語を用いて自分でサービスを作ってみましょう。現存するサービスを簡単に自分で作ってみるのです。

 例えば、TwitterのようなSNSを作ってみたり、Lineのようなチャットサービスを作ってみたり。

 言語の性質がわかっている状態なので、言語的に何ができてできないのかが分かり、自分のプロダクトを作成することは意外に簡単だったりします。

 最終的に自分で使ってみて使いやすいのかどうなのか、改善点はどのようなところなのかを頭の中でプログラム単位で想像する事ができ、実際に変更を加えていくことができれば学習は終了です。

 あとは、繰り返しサービスを作ってみて、スキルを磨いていき、いずれ世に作ったサービスをリリースする事ができれば最高ですね。



初心者がやってしまいがちなNG集

 さて、最終章として紹介するのが、初心者がやってしまいがちなNG学習法について。

 この記事を読んでいるあなたは、おそらく今からオブジェクト指向型言語を学習しようとしたり、もっと理解を深めようとしている方だと思います。

 なので、今回は、初心者がやってしまいがちな、やっていはいけない学習方法について以下の点に絞って紹介していきます。

  • 書籍で黙々と1人で学習する
  • パソコンを使わずにノートで勉強する
  • 外部のサービスを使わない
  • 目的を持たずにコーディングする

 さて、それでは一つ一つ紹介していきます。


書籍で黙々と1人で学習する

質問ができない環境での学習は初心者には厳しいでしょう。

 さて、まず初めに紹介するNGは書籍で1人で黙々と勉強するということです。

 この方法は、言語を複数学習してプログラミングに知見がある人が行う勉強方法の一つなので、初心者の人にはお勧めできません。

 何が良くないのかというと、相談する相手がいないという事です。

 どうしても学習の初めの方は進め方や文法などを質問したくなってしまいます。また、そういった疑問というのはどんどん生まれてきます。

 そう言う時にGoogleを使えばいいのかもしれませんが、基礎的なことから毎回毎回調べるのは時間もかかるし自身の労力もかかります。

 なので、友達や同期、クラスメートに相談して教えてもらったりする環境に身を置きましょう。

 自分の身を相談する事ができる環境に置く事で、学習の段階で出てきた疑問を解消する事ができ、順調に進める事ができるのです。


パソコンを使わずにノートで勉強する

まずは実際に手を動かしてみて、動作を確認したりして学習していきましょう。

 さて、次に紹介するNGは、パソコンを使わずに学習を進めていくと言う事です。

 今までの勉強といったら、学校で学ぶように数学や理科、社会や国語、英語など教科でノートを取りながら学習していくのが一般的でした。

 なので、初心者の方がよくやってしまうのです。プログラムをノートに書き留めて勉強すると言う方法を。

 実はこの方法が一番やってはいけないのですが、いかがでしょう。やってしまっていませんか?

 何がよくないのかというと、ノートで勉強すると文法のエラーに気づけないのと、出力が実際にどのようなものなのかがわからないという事なのです。

 プログラミングの学習で一番大事なことは、手を動かして実際に日本語などの言語を操るようにパソコンにプログラムができるかどうかなのです。

 出力が実際に見えない、今ノートで学習している人は、今すぐパソコンを使用して実際にプログラムを打ち込んで学習を進めていきましょう。


外部のサービスを使わない

私が初心者の時は、TechAcademyなどの外部サービスは必ず使うようにしていました。

 さて、次に紹介するのが、外部のサービスを使わないということです。

 今やIT職の求人が高まっている中、非効率的な学習を進めていると、他の人に良い仕事を奪われてしまったりします。

 そうならないように効率的な学習が必要なのですが、友達や同期に相談すること以上に効率的なのが、その道のプロに相談する環境に身を置くと言う事です。

 どういうことかというと、外部のサービスを使用して学習の効率を上げるということです。

 これから先ずっと外部のサービスを使うのではなく、理解が追いつけば自分でその先の学習を進めてみたりすることももちろんできます。

 早く終わったら終わったで自分でサービスを作ったりする事ができるので、その分、他人と学習量の差を作る事ができます。

 当然自分でサービスを作ってレビューを重ねていくのが一番早い効率の学習なので、そうなるためにもプロに相談できる環境はとても大事になってきます。

 以下に外部のサービスとして非常に定評のあるTechAcademyのリンクを貼っておきますので、気になった方はぜひ見てみてください。

 私も利用してみましたが、プロに相談できる環境がとてもよく感じたので、紹介させていただきます。


目的を持たずにコーディングする

ただ学習するだけのような勉強方法だと何も達成感は得られずに、学習が続かなくなってしまいます。

 そして、最後に紹介するNGとしては、目的を持たずにコーディングすることです。

 学習をメインの目的においているのもよくありません。

 プログラミング言語はあくまでも道具です。道具の使い方がわかったところでどこで使うのかというシチュエーションが全くわからないと思います。

 なので、大事なこととして「何かのサービスを作るために学習するんだ」という学習の目的を立てて勉強していきましょう。

 既存のサービスを作り変えてリリースするというのも立派な目的の一つだと思います。

 文法やサービスの流れを理解するだけでなく、しっかりとアウトプットして学習してくことをお勧めします。

 私もDartを勉強する時は、自分でiOSのアプリをFlutterで作って、自分で使っていました。その都度、自分で変更を加えていき、スキルを磨いていきました。

 このようにして、何かサービスを一つ作るという目的を立てて勉強することで達成感を味わえる事ができ、自分で変更を加えられるので学習効率が上がります。



まとめ

 いかがだったでしょうか。

 オブジェクト指向型言語の特徴として文法的な特徴を挙げてきましたが、実は、サービスの特徴も存在しています。

 その特徴というのが、オブジェクト指向型言語はよくフロントエンドの世界で使われるということです。

 そのおかげもあって、勉強方法として自分でプロダクトを作ってみるという方法を紹介してきました。

 この実際にプロダクトを作るという方法は手続き型言語ではなかなか実現しづらく、オブジェクト指向型言語特有の勉強方法と言えるでしょう。

 ぜひ、学習する時はこれらの方法を用いて勉強してみてください。


 それでは今回の記事のまとめです。

  • オブジェクト指向型言語は継承関係や包含関係がある
  • 学習コストが低かったり、メンテナンス性のが高さから人気を集めている
  • プログラムを視認性の高い状態でコーディングするようにする
  • まずは基本文法から勉強する
  • 既存のサービスを自分で作り変えて勉強をする
  • 勉強は必ずパソコンを使って実際に手を動かす
  • 外部のサービスを活用する
  • プログラミングを学習する目的を持って勉強する

 以上となります。


 今回もご覧いただきありがとうございます。

 それではまた次回。

【Kazyの日常】管理・運営人
Kazy・かじー

 クリエイティブな事が好きなITエンジニア。

 2020年にトロント🇨🇦に1年間語学留学したのち、日本と海外の情報格差を認知。

 50年後に生きる情報を発信しようと決意。

 2020年10月にブログ『Kazyの日常。〜Having a Better Life〜』を開設。

 202年現在で3年目のブロガーとなり、通算530,000PVのブログとなりました。

 好きなバイク・DIY・カフェ・自己啓発などを主に執筆。

 多数のコメントをいただきながら、楽しく毎週執筆をさせていただいております。

 皆様のコメントやDM、お待ちしています。

コメント

スポンサーリンク
タイトルとURLをコピーしました