IT人材のためのキャリアライフスタイルマガジン

Javaとは|言語の特徴/できること/ メリット・デメリット/勉強方法

プログラミング

Androidのアプリ制作でも一躍有名になったJavaプログラミングですが、これからJavaを学習しようと思っている方にJavaのメリットやデメリット、学習方法をご紹介します。Javaでどんなことができるのか、またJavaの学習に向けたスクールも紹介します。

更新日時:

Javaとは

トピック9680/要素1664701

Javaとは、スマートフォンや、インターネットで利用されるアプリケーション開発で使用される人気の言語の一つです。 現在Googleが使用している「Google三大言語(Java、C++、Python)」のひとつでもあり、応用力のある言語として非常に根強い人気を誇っています。そしてこのJavaは現在、世界中で主に大企業での大規模システムや、Androidアプリなどに使用されています。 今回はJavaの簡単な歴史と特徴や、勉強方法、メリットやデメリット、就職での優位性などについてご紹介いたします。

Javaの歴史

まず、簡単な歴史から説明しますが、後々重要になる話だけします。Javaは1995年マイクロソフト社が世に出したプログラム言語です。(windowsを作った会社とは異なります。) 当初はテレビのようなインターネットなどを経由しない、小さな機械に組み込んで使う「組み込み系」とで動作させたくて作られたそうですが、当時の技術ではJavaが動くようなスペックの「組み込み系」の機械はありませんでした。(Javaの動作自体も今より遅かったです) しかし、今では技術が進歩し、Androidを代表する小型端末で使用されるようになりました。

Javaの言語の特徴とできること

トピック9680/要素1664704

Javaにはこのような特徴を備えています。 ・ 実行環境があれば、どんなマシンでも動く。(組み込み系の小さなメモリ上から汎用機まで) ・オブジェクト指向プログラミング言語 以下では特徴がどのようなものなのかをご説明いたします。

Javaの特徴~実行環境があれば、どんなマシンでも動く

トピック9680/要素1664706

「実行環境があれば、どんなマシンでも動く」ということがなぜ特徴なのか、それをご説明するには、Javaが登場する以前からの、お話を少しする必要があります。 Java登場以前のプログラムはコンピュータごとに動くプログラム言語が異なるという状態でした。コンピュータを作る会社がそれぞれにプログラム言語を作り、そのコンピュータではそれ以外のプログラムを動かすことはできなかったのです。 困ったのはプログラムを作る人達です。コンピュータが変わるごとにプログラムを新しく作り直さなくてはいけませんでした。そこで登場したのが「JVM(Java Virtual Machine:Java仮想マシン)」というプログラムです。 例えるなら、Java仮想マシンは「マシン本体と実際に動くプログラムの通訳者のようなもの」で、どのようなコンピュータであってもJava仮想マシンさえ動作すれば、Javaはどんなコンピュータ上でも利用することが出来ます。 そのため、コンピュータが別のものが変わることになっても、Java仮想マシンがあれば以前に作られたプログラムも問題なく別のコンピュータで動作させることができるのです。

Javaの特徴~オブジェクト指向プログラミング言語

Javaはプログラムを作る時に「オブジェクト指向」という考えに従ってプログラムを作ることができる言語です。 「オブジェクト指向」とは、Javaでプログラムを作れば自動的に「オブジェクト指向」のアプリが作れるという単純なものではなく、「オブジェクト指向」という考え方を理解する必要があります。 簡単に説明すると、「オブジェクト指向」はプログラムを「オブジェクト」という部品のようなものを組み立てていくというプログラムの作成手法です。 この「オブジェクト指向」は以下のような特性を持っています。 1.カプセル化 2.継承(インヘリタンス) 3.Polymorphism ポリモフィズム この三つは、「オブジェクト指向」の肝である考えなのですが、実際に触ってみないと具体的にイメージするのは難しいものです。簡単にですが、どのようなプログラミングの歴史的な経緯から「オブジェクト指向」がなぜ必要になったかを交えてご紹介いたします。

グローバルな引きこもり~カプセル化

トピック9680/要素1664708

ではまず、「処理」と「変数」それぞれに視点を置いて、「オブジェクト指向」以前のプログラミング手法で起きた問題点と、「カプセル化」という考え方が生み出された経緯をお話しいたします。

まずは、「処理」の視点から

まず、「処理」に主眼をおいて、どんな問題があったか話をしましょう。かつてプログラムのソースは悪しき「コピー&ペースト」によって、同じ処理が複数の箇所に散らばるというカオスな状態でした。しかし、開発時にはそれでいいとしても、ひとたび保守するとなった時には、このような惨状が広がっていました。 「プログラム仕様変更ですか?え~と同じ処理をしている場所を探しますね…1、2、3、…あ、ここも?あれ?…あれ?…どこで何をしているのかわからないよ…全部見直さないといけない…」 このような地獄を味わった人々は同じ処理を書かなくて言いように、人は同じ処理をする部分を切り出して「関数」(あるいは、プロシージャとかサブルーチン…大体同じ意味で使っています)というものを作り出しました。 「似たような手続きには名前をつけて再利用できるようにしよう」「ひとかたまりの手続きに名前をつけてわかりやすくしよう」こうして生まれたのが「手続き型プログラミング」というものです。これにより少し保守が楽になり、人は少し幸せになりました。 しかし、「手続型プログラミング」には限界がありました。例えば、こんな問題があるのです。これは、「猫型プログラミング言語史観(1)」で紹介されていた例です。C言語のソースになります。見慣れない人もいるかもなので、コメントをつけておきます。

#include /* 構造体 「人」の定義 */ // 「構造体」というのは、「値の塊」だと思ってください。 typedef struct { char* name; int age; } person_t; /* 「お誕生日おめでとうございます」関数 */ void happy_birthday(person_t* p){ p->age++; // 引数で渡された「人」の年齢に「1」加算 } /* main関数 */ int main(int argc, char** argv){ person_t yoshikawa = {"吉川さん", 27}; // 吉川さん、27歳を定義 happy_birthday(&yoshikawa); // 吉川さん、お誕生日おめでとうございます printf("yoshikawa's age is %d", yoshikawa.age); // 吉川さんの年齢をコマンドラインに表示 return 0; // 終了 }

しかし、猫型さんでも言われているように、この方法では存在する変数「yoshikawa」のデータを守ることが出来ません。なぜならC言語では、別の関数でうっかりミスでこう書いて、変数「yoshikawa」の中身を書き換えてしまうことが出来ます。

/* うっかり関数。吉川さんを「-1」歳に。*/ void ukkari_function(person_t* p){ p->age = -1; }

この関数が、同じ「ソースファイル」の中ならまだ、救いはあるでしょう。「ソース」読んだときに、気が付くからです。しかし、C言語では「別のソース」に書かれた関数から変数「yoshikawa」を変更できてしまいます。(以下「猫型~」から引用)

つまり、手続き(処理)だけに注目するだけでは、「ある一塊のデータがどういうふうに変化しうるのか、どういう手続きに適用されうるのか」がわからないし、「どこからでもデータを書き換えることができてしまう」のです。

手続型プログラミングの問題点はつまり、重要なデータが守れないことなのです。手続きは一カ所にまとめることができるのですが、データがいろんなところで書き換えられることを防ぐことができないのです。(そして間違いが起こります。) 以上で「処理」に主眼を置いた問題点の話を終えます。

次は、「変数」に視点から

トピック9680/要素1664711

次に「変数」に主眼をおいて、昔の話をしましょう。まず、「変数」とは何かというと、数値や文字などを入れる入れ物のようなものです。通常プログラムでは「変数」を使って、例えば1+1という足し算した結果を「変数」に入れて、プログラムの別の場所で使用したりします。 さて、むかしむかしの話です。「変数」には「グローバル」というプログラム上のどこからでも参照できるものしかありませんでした。プログラムのソースコードが10行、20行という短い時はそれでも問題ありませんでした。 しかし、時代と共にプログラムソースは長くなり、幾多の改善と要望、仕様変更、修正によって巨大化し、それに伴って、その巨大化したプログラムを保守する人の目の前にはこんな問題が現れました。 「えっ!いきなり変数の値が変わったんだけどどこで変わったの?!」 「処理の変更?値を変えたい?ちょっと待ってその値が入る変数はどこから参照されてる?ほかのプログラムに影響ないの?」 「この変数なんでしょう?なんに使われていますか?どこで?」 プログラムが巨大になればなるほどこんな「わけがわかりません」的状況になっていったのです。「処理」の部分で話した問題点とかぶりますが「データが守れない」という問題です。データの参照範囲が広すぎて直してたくても直せない、つまりプログラムの保守がしづらいということです。

「カプセル化」の誕生

そして上記の問題点を含めて、もっと保守が楽なプログラムを作ろうと考えた人が生み出したのが、「データと処理をひとまとめにする」という手法です。これを「カプセル化」と呼びます。

「処理」を主眼にした時の「カプセル化」のメリット

それはデータと処理が一纏まりになっているので、データが他から勝手に書き換わる範囲を狭めることが出来ることに他なりません。

「変数」を主眼にした時の「カプセル化」のメリット

オブジェクトが生まれるときに一度、値を設定してしまえば、オブジェクトの内部であれば、「グローバル変数」のようにどこからでも簡単に呼び出せることです。しかし、オブジェクトの外からは簡単に書き換えられないので、事故が起こりにくいのです。

継承(インヘリタンス)

トピック9680/要素1664714

続けて「継承」についてご説明いたします。「継承」とは、プログラムの再利用性を高める考え方でありJavaの持つ機能の一つです。 まず「カプセル化」でご説明したとおり、Java、引いては「オブジェクト指向」では「データと処理がひとまとまり」になっています。 ただ、「データと処理が一つのまとまりになっている」ため処理の一部分だけ変更した別のプログラムが欲しくなった時、プログラムをコピーして新たなプログラムを作らないといけなくなってきます。しかし、今度はそのプログラムを変更するときに、同じ処理をしている箇所を見つけ出して修正しなくてはいけなくなるのです。 その問題を解消するのが「継承」という機能です。「継承」を使用すればプログラムをコピー&ペーストせずに、「カプセル化」されたプログラムの機能を引き継いで、元ある機能に上書きして機能を追加することができます。

Polymorphism ポリモフィズム(多態性、多相性、多様性)

トピック9680/要素1664718

つづいて「ポリモフィズム」についてご説明いたします。 「ポリモフィズム」は様々な多様性、多相性など様々の翻訳をされますが、機能としては「オブジェクト」によって処理を様々に変えられる仕組みのことです。言い換えれば、「ポリモフィズム」は、同じ動作を、違うオブジェクトがすることで、まったく違い振舞いになることを言います。そしてこの「ポリモフィズム」のメリットは、「条件分岐」を減らせることにあります。 例えば、同じ「動物」でも、ネコとイヌ(違うオブジェクト)は、「鳴く」(同じ動作)といっても、まったく別の鳴き声(違う振る舞い)になるでしょう。その「動物」が「鳴く」「走る」という処理を、「動物」の種類によって分けようとした時どうなるでしょうか。 既存の「手続き型プログラム」の場合、次の項目のように条件分岐をかかなくてはいけません。プログラムのコードはイメージですので、コメントでどのようなことをしているか確認してください。

「手続き型プログラム」のプログラムコードのイメージ

// 「鳴く」処理をする // もしイヌならば if (イヌ) { // イヌの鳴く処理 wan(); } else if (ネコ) { // もしネコならば // ネコの鳴く処理 nyan(); } // 「走る」処理をする // もしイヌならば if (イヌ) { // イヌの走る処理 dog_run(); } else if (ネコ) { // もしネコならば // ネコの走る処理 cat_run(); }

「ポリモフィズム」を使うと修正が簡単

先ほどの「手続き型プログラム」では、「動物」の処理が「鳥」「ゾウ」「カバ」「クマ」と増えていけば、条件分岐がどんどん増えていくため、条件分岐が膨らんでしまいます。そうなってしまうと、修正を行う際に煩雑になり間違いを起こしやすくなってしまいます。 しかし、「ポリモフィズム」を使うと、「条件分岐」はたったの一回、「それぞれの動物」のオブジェクトを作成するときだけになるのです。たとえば次の項目のようになります。このように「ポリモフィズム」を使えば条件分岐は、オブジェクトを作成するときだけにすることができます。そうなれば修正が簡単になるのです。

「ポリモフィズム」を使ったコードイメージ

// 「鳴く」処理をする // もしイヌならば if (イヌ) { // イヌの鳴く処理 wan(); } else if (ネコ) { // もしネコならば // ネコの鳴く処理 nyan(); } // 「ネコ」だったら「ネコ」の「鳴く」処理、「イヌ」だったら「イヌ」の「鳴く」処理 obj.bark(); // 「ネコ」だったら「ネコ」の「走る」処理、「イヌ」だったら「イヌ」の「走る」処理 obj.run();

Javaでできること

Javaでできることは実に多彩です。オンラインで使用される運送会社の配送システムなどの「業務システム」、WEB上でサービス提供するシステム、カーナビやAndroidのアプリなど「組み込み系」と呼ばれるようなシステムも作ることができます。特に、Androidのアプリを作成できるということが魅力です。

Javaのメリット

Javaのメリットは沢山あります。いかにメリットの中でも特徴的なものをあげます。

メリット1:保守性に優れる

Javaは「オブジェクト指向」を備えているために、正確に作れば保守性に優れた大規模システムが開発できることなどがあげられます。

メリット2:世界中で利用されている

Javaはどこでも動作するという特徴のために、世界中で利用されていることがメリットです。Javaを覚えれば世界中に活躍の場が広がるのです。

Javaのデメリット

Javaは大変優れた言語ではありますが、デメリットもあります。

デメリット1:学習コストが高い

Javaのデメリットとしてはやはり「学習コスト」が高いことがあげられます。「オブジェクト指向」は理解すれば目から鱗の考え方なのですが、とにかく理解し辛く、また、Java自体が多彩な機能を備えているために、全体を理解するのはとても大変です。

デメリット2:小規模開発に向かない

Javaだけでなく「オブジェクト指向言語」全てに言えることですが、機能を作るさいにいちいち「オブジェクト」を作成する必要があるため、簡単な機能を作るのには時間がかかりすぎるという点もデメリットの一つです。

初心者向けJavaの勉強方法(独学/スクール)

トピック9680/要素1664719

ここで初心者の人がJavaを勉強する方法についてご紹介いたします。

独学

Javaは全世界で利用されているため、使用している人間も多く、ネット上で検索すれば簡単に入門サイトが見つかります。また、じっくり腰を据えて勉強したい人は書籍を買って勉強するのもおすすめです。 ただ、どちらにせよ独学で勉強する際には、実際にプログラムを動作させて勉強することをおすすめします。机上だけ学習していても、プログラムを書いて動作させることが一番勉強になります。

スクール

独学ではモチベーションが上がらないという人にはスクールもおすすめです。講師に聞けば疑問を持ったときに躓くのを防ぐこともできます。実際のスクールに通うのが難しいという人にはネット上で受講できるeスクールもおすすめです。

就職への優位性

Javaが就職において優位性を持っている理由は簡単です。世界中で利用されているため開発市場としては衰えることなく需要が有りますので、ある程度高い収入が見込めるのです。

Javaを学べるスクール

トピック9680/要素1664721

Javaは世界的に人気を誇る言語であるため、スクールも数多くあります。その中でもおすすめのスクールをご紹介たしましょう。

リナックスアカデミー

「短期間でエンジニアになるために必要な教育のすべてがある」という言葉をキャッチフレーズとするITエンジニア専門スクールです。「エンジニアの入り口」になることをスクール理念としておる、初心者の教育に集中しています。 キャッチフレーズの通り、15年以上Java講座を行っている老舗であり「少人数クラス担任制」を採用、また現役のエンジニアが講師として教えているということで、実務にも対応できるように「PBL(ProjectBased Learning)」を取り入れていたり、また仕事に直結する資格への「合格保証制度」もあります。 また就転職のための「キャリアセンター」を完備してプロからカウンセリングが受けられるとあって、Javaで仕事がしたいという熱意を持つ人も多く、勉強のモチベーションを高められるでしょう。

KENスクール

KENスクールは、新宿・池袋・北千住・横浜・名古屋・梅田に校舎がある開講28年の実績がある老舗ITスクールです。Java講座だけでなく様々なIT環境を学習することができ、オンデマンド授業を基本とした個別指導型授業を提供しているので、細やかな指導をうけることができます。 いずれにせよ、スクールで学ぶことは大きな刺激となるでしょう。

アクセスランキング