現在、プログラミング言語はマイナーなものを含めて約200ほどあります。
そんな中、日本ではAndroid開発の影響もありエンジニア求人の約半数がJavaの経験者を希望しています。
ここではその「Java」に関する基本的な情報を、プログラミング未経験の方にも出来る限りわかりやすく説明をしていきます。
Javaとは
まず、Javaとは何か。一行で説明すると、それまでの他の言語の良い部分を引き継ぎ、欠点を克服するよう設計されたプログラミング言語また、そのプログラムの実行環境および開発環境です。
「他の言語」とは主に「C」「C++」言語のことを指すので、C/C++言語の改良版とも言えます。
もちろんそれだけではありませんので、Javaの概念や機能、特徴等を他の言語との比較を交えつつ、いくつか紹介していきます。
※わかりやすさ優先のため、既にご存知の方にとっては大雑把な解説になってしまっている箇所がありますので、あしからず
プラットフォーム非依存
Javaはコンパイラ言語という種類の言語に属します。
コンパイラ言語とは「プログラマー」が”人間の読める言語”(ソースコード)でプログラミングをしてそれを「コンパイラ」というプログラムが”機械語”に変換してプログラムが実行可能になる言語のことです。
そして、そのコンパイラ言語のプログラムが動くのはOSやハードウェア(装置)などの「プラットフォーム」です。
例えばC言語もJavaと同じコンパイラの言語ですが、C言語で特定のOSで開発したソースコードを別のOSで動かそうとしても動きません。
ですが、Javaは特定のOSで一つプログラムを作れば、他のOSでも動くのです。JavaのコンパイラはC言語のようにプラットフォームで直接動くように変換するのではなく、JVM(Java仮想マシン)という実行環境で動く機械語(中間言語)に変換します。
そして、JVMは中間言語を元に色々なプラットフォームで動くように作られたマシンなので、そのJVMがプラットフォームに存在していれば、あらかじめプラットフォームを気にすることなく、開発ができるということです。
よって、「プラットフォームに依存しない」ということは、「様々なOSや端末で動かすことができる」ということになり、これがJavaが登場してから20年以上経っても、未だに人気のある言語の理由の一つとなっています。
オブジェクト指向
Javaとセットで認識される言葉の一つです。
Javaはこの考えに基づいて設計されており、ソフトウェアの開発における保守の複雑さを低減し、開発効率を高めることが可能です。
このテーマはあまりに壮大なので、あえてここではより詳しい説明は省きます。
web上でも様々な例えを使って解説している有識者がたくさん存在するので、それらを手当たり次第利用して、理解を深めてください。
ただし、下記のことを先に心に留めておくと良いでしょう。
Javaはオブジェクト指向に基づいたプログラミングしかできないということではない。
オブジェクト指向はあくまでプログラムを設計するための概念や指針であって、「正解」や「決まりきったものがあるわけではない。」
これは”オブジェクト指向”という言葉を理解しようとしすぎるあまり、不本意なプログラムになってしまうことを避けるための処方箋です。
オブジェクト指向は初心者にとっては難関になりやすいテーマなので、
始めのうちは難しいテーマだと思わずに、ソースコードで表現しながら”オブジェクト指向”と仲良く戯れることが大切です。
例外処理
例外処理とはプログラム実行中に生じた異常(例外)の扱いを、比較的安全な方法で行い、プログラムを読みやすく記述することができる機能です。
突然ですが、「犬」が「犬小屋を食べ」ようとした時のことを想像してみてください。
…そんなことは現実世界ではそうそうありませんよね。
ですが、プログラムの世界ではソースコードのあらゆるところに「バグ」という、起こってはいけないエラーや不具合になってしまう原因が潜んでしまう可能性があります。
ありえないと思っていたことが突然起きてしまい、とんでもないことになったりもします。そしてそうならないように管理しなくてはいけないのは、結局プログラムを作る人間です。
例外処理はその管理をしやすくしてくれます。
プログラムの中で「バグ」(虫)の”餌”になってしまう様な箇所を
あらかじめ明確にしておき、不測の事態に備えることができるということです。
ガーベジコレクション
ガーベジコレクションとは、プログラムが動的に確保したメモリ領域のうち、不要になった領域を自動的に解放する機能です。
プログラムというものは、言語を使って書かれた複雑な計算処理や関数を処理するために、マシンがソースコードで示された値や状態を”メモリ”に保持する仕組みになっています。
そのメモリがいっぱいになってしまうと当然、マシンの動きが遅くなったり、場合によっては止まってしまうことになります。
例えばC++言語では、必要な処理が終わったタイミングでメモリを開放してあげたり、メモリが多く使われないようにプログラマーが意図的にプログラミングする必要がありました。
そして、その管理の負担を軽減すべく開発された機能がガーベジコレクションというものです。
ガーベジコレクションとは英語で”garbage collection=ゴミ収集”で、その名の通り”使わなくなったメモリ”(ゴミ)を回収してメモリを開放してくれる機能です。
JavaではJVMがガーベジコレクションによってメモリの管理を担ってくれるので、プログラマーはメモリの心配をすることなく、開発に集中できてしまいます。
ただし”心配無用”ということではなく、メモリが足りなくなるプログラムも作成しようと思えばできてしまうため、全くメモリのことを気にしなくていいということにはならないので、大規模なシステムやメモリ消費の激しい処理については注意が必要です。
難易度
Javaは先述した通り、コンパイラ言語です。
プログラミング言語は他に、インタプリタ言語という属性の言語があります。
この言語はソースコードを機械語に変換せずに実行することが可能で、マシンに直接ソースコードを読み取りに行ってもらって、変換してもらいながら処理をする言語です。
インタプリタ言語の一つにJavascript言語があります。
Javascript言語は基本的にhtmlファイルに組み込まれて実行される言語のため、Javaとはシステムの用途が違いますが、”プログラミングを学ぶ”という点においては同じで、
Javascript言語はパソコンにブラウザとメモ帳さえあれば、プログラムを動かすことができるので、Javaよりも断然、ハードルが低いです。
プログラミング初心者にとっては動く状態までのプロセスが短い方がプログラム言語の文法が身につきやすいです。
まずはプログラムが動いてから初めて、修正や処理を記述して変化を確かめたいのに、動かす前から環境構築ができなかったり、膨大なエラーがプロンプトに出力されたら学ぶ気力も削ぎ落とされてしまいますよね。
少し話は逸れますが、IT業界では昔は大きなシステムを作り込んでそれをパッケージ化して販売するスタイルが主流でした。
しかし、ここ最近はシステム開発の手法として、システムをガッチリ作らずにサクッと作って修正や改善をしながらシステムを軌道に乗せていく「リーンスタートアップ」という手法が流行りだして、その界隈ではJavascript言語やRuby言語などが人気を博しています。
Javaではそのような開発にあまり向いていないので、ベンチャー精神のある方は上記のような言語がおすすめかもしれませんね。
以上のことより、”プログラミングの入門”としてJavaを選択するのは少しハードルが高いかもしれません。
堅牢性
「堅牢性」とはしっかりとした丈夫な作りかどうかという意味です。
JVMはそれ自体が堅牢性に優れています。
プログラミング言語自体のバグや脆弱性(セキュリティ上の欠陥)はもちろん安全に作られており、悪さをするようなプログラムを作れない様に工夫もされています。
保守性
プログラムはそのほとんどが一旦完成してパッケージやサービスがリリースされれば終了…という訳ではありません。
リリース後も、ユーザーの要望に応えて機能を追加したり、セキュリテイを強固にしたりと、ソースコードは次々と変更されていきます。
Javaはそんなケースを想定して効率良くプログラミングができるように設計されています。
例えばあるシステムの機能追加の時に、既存の処理と同じではないが、似たような処理をしている箇所があれば、その部分を抜き出したり、オブジェクト指向の一部である継承をうまく利用して、同じコードを何回も記述せずに再利用することが可能です。
デメリット
ここまでJavaのメリットを主に挙げてきましたが、デメリットを挙げます。
それはこれまで挙げてきた”メリット”の裏返しです。
トンチのきいた話に聞こえるかもしれませんが、わりと真面目な話です。
例えば、Javaは”プラットフォーム非依存”だということを説明しましたが、Javaはこのメリットを得るために、実は処理速度を遅くしてしまうという代償を払っています。
Javaよりも、例で挙げたC言語のほうが処理速度が速いのです。
そして、”オブジェクト指向”についても少し触れましたが、オブジェクト指向に忠実なプログラム設計は大規模プロジェクトでその本領を発揮するものであり、
小規模なシステムや小さいプロジェクトでは開発のコスト(時間)がかかりすぎて無駄が多いという否定的な意見を唱える有識者もいたりします。
これからJavaを学ぼうと思っていた方には少し酷に聞こえるかもしれませんね。
ただしこれは全く酷な話ではなく、すべてのプログラミング言語は一長一短あり、その言語にあったプログラマー、システム、用途に応じて使い分けることができるというだけのことです。
Javaに限らず、プログラミング言語というものはそれまでの言語のデメリットを克服すべく、有志の方々がより良いシステム開発環境、ひいてはより良いIT社会になることを目標に開発されたものです。
その言語の中でもJavaは長年バージョンアップをし続け、
現在でもその経験者はさまざまなシステム開発の現場で活躍しています。
ということで、Javaはメリットもデメリットも同じくらいあるが、システム要件など適材適所でJavaとその他の言語を使いわけましょう。ということです。
最後に
かくいう私も、入門言語はJavaでした。
勉強をし始めた頃は開発環境を整えるまでに膨大な時間を費やしてしまったり、オブジェクト指向のそのテーマの壮大さに悩まされることもありましたが、今では他の言語を学ぶ土台となり、システム開発の設計を任されるポジションに就くことができました。
難易度の項目ではあえて初心者の方にはハードルが高いと言って少し突き放してしまいましたが。
Javaをコツコツと勉強すると有能なITエンジニアとして働いていくために
必要な知識が効率よく身につきます。Javaは素晴らしい言語です。
この記事をご覧になって、一人でも多くの方がJavaを入門言語として選択し、プログラミングの世界に飛び込んでもらえることを願います。
ぜひ、Javaの世界を実感して、頑張ってください。
フリーランスになるために必要な知識やスキルアップの方法等、様々なお役立ち情報を発信していきます。
(リモートワーク案件に強いフリーランスエージェント「クラウドワークス テック」を運営)