C言語とJavaって似てるイメージあるけど、何が違う?
どっちが難しい?
文法の違いから用途の違いまで幅広く知りたい!
似ているようで結構違うC言語とJava。
プログラミングを学んでいる中で、
「C言語とJavaってなんか似てるなあ」
「どっちも古臭い言語だし、似たようなもんでしょ」
と一度は思ったことがあるのではないでしょうか?
結論、C言語とJavaはあまり似ている言語ではありません。
JavaはC言語を直接継承していないので、違っていて当然です。
この記事では、C言語とJavaの違いを8つの観点から徹底解剖しています。
この記事を読めば、C言語とJavaの違いをざっと理解し、「C言語」「Java」というワードを聞いても戸惑わなくなるでしょう。
- C言語はポインタ、Javaはクラスなどオブジェクト指向の機能を備えている
- C言語はOS毎にコンパイラを用意する必要があるが、JavaはJVMがあればどんなOSでも動く
- C言語は組み込み系、Javaは業務システム開発によく使われる
- 言語習得難易度はほぼ同じで、どちらも人気が高い
- どちらか片方を学べばもう片方を学ぶのが劇的に楽になるわけではない
C言語とは【OS上で動くソフト開発のために作られた歴史的言語】
C言語は、1972年に開発された、非常に歴史のある言語です。
OS上で動くソフトを開発するために作られました。
開発から50年経った今でも、大学で教えられるほど根強い人気のある言語です。
昔から使われてるから、知見が豊富そう!
Javaとは【システム開発によく使われるオブジェクト指向言語】
Javaは1996年にリリースされた言語です。
C++という言語の欠点を補うために開発されました。
現在では基幹システム開発によく利用される、利用人口の多い言語となっています。
Javaってシステムに使われるくらいだから安定してそうな言語だね。
C言語からJavaが生まれるまでの流れ
C言語は1972年に、OS上で動くソフトを効率的に作るために開発されました。
この時代には、まだ「インターネット」が存在していません。
1983年、C言語の開発効率を向上するため、C++という、C言語にオブジェクト指向を追加した言語が作られました。
1990年代に入り、インターネットが急速に普及し始めました。
そして1996年、Javaが生まれました。
JavaはC++のOS依存性を解消するために開発されましたが、C言語と直接的に関係があるわけではないことに注意です。
ちなみに同時期に、今でも大人気なPythonやJavaScript、Rubyといった言語も開発されています。
Javaはインターネットの普及と共に生まれてきたんだね。
8つの観点から見るC言語とJavaの違い
- 作られた経緯【C言語はOS上で動くソフト開発、JavaはWeb開発用に作られた】
- 設計理念【C言語は構造化言語、Javaはオブジェクト指向】
- 文法【JavaはC言語より記述量は多い】
- 機能【C言語はポインタ、Javaはクラスや継承】
- 実行環境【C言語はOSごと、JavaはどんなOSでも】
- 用途【C言語は組み込み系、Javaはシステム開発】
- 習得難易度【Javaの方がやや難しい】
- 将来性【Javaは求人数1位、C言語は10位以下】
作られた経緯【C言語はOS上で動くソフト開発、JavaはWeb開発用に作られた】
C言語は、OS上で動くソフトを開発するために作られました。
C言語の前身であるB言語は、実行速度が遅く、まともに動くソフトを作ることが困難だったためです。
C言語は「UNIXというOSを開発するために作られた」と言われがちですが、それは誤りです。
UNIXといえばMacのターミナルに使われてるよね。
Javaは1990年代当時よく使われていた「C++」の欠点、
- 複雑すぎる言語仕様のせいで、エラーが多い
- OS移植性がない
という2つの問題に対処するため、開発されました。
設計理念【C言語は手続き型言語、Javaはオブジェクト指向】
※この節は難しいので完全に理解しなくても大丈夫です。
C言語は手続き型言語です。
手続き型言語とは、実行順にプログラム命令を記述していく言語のことです。
CPUが行うべき処理の内容を順番に書いていくので、自然な流れで記述できます。
レシピ通りに料理を作るようなものです。
Javaはオブジェクト指向言語です。
オブジェクト指向言語とは、簡潔にいえば、オブジェクトというデータのまとまりから成る言語のことです。
オブジェクトとしてまとめるため、コードの再利用性が高く、現実のものとの対応付けも容易です。
アクセル・ブレーキ機能をまとめた車クラスが1つのオブジェクトになるような感じです。
厳密にはオブジェクト指向は手続き型言語の対義語ではありませんが、ここでは対義語だと思ってもらって大丈夫です。
文法【小規模だとC言語、大規模だとJavaの方がプログラムは短い】
文法の違いは多すぎてキリがありません。
ですので、ここでは”Hello World”のプログラムでなんとなく違いを掴んでいただければOKです。
#include <stdio.h>
int main() {
printf("Hello World");
return 0;
}
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Hello World
なんとなくJavaの方が、”.”(ドット)を多く使っていたり、2重構造になったりして複雑そうに見えませんか?
HelloWorldプログラムに関してはJavaの方が複雑なのですが、大規模になればなるほどJavaの可読性が光ってきます。
クラスや継承を使うことで、コードを再利用でき、記述量も減ります。
全然わかんないけど、どっちも難しそう…
staticの違い【C言語はファイル間の参照保護、Javaはクラスと同時生成】
※この節はやや上級者向けなので、急いでいる方は飛ばしてもらって構いません。
C言語とJavaの文法的な違いで重要なものの1つが「static修飾子」です。
C言語にもJavaにも「static」は存在するのですが、意味する所がかなり異なります。
C言語でstatic修飾子をつけられた変数・関数は、ファイル間の参照を禁止します。
static const float new_pi = 3.14;
また、ローカル変数にstatic修飾子をつけると、関数が複数回呼び出されても初期化されません。
#include <stdio.h>
int counter1() {
static int cnt = 0;
cnt++;
return cnt;
}
int counter2(){
int cnt = 0;
cnt++;
return cnt;
}
int main() {
int cnt1 = 0, cnt2 = 0;
for(int i = 0; i < 3; i++) {
cnt1 = counter1();
cnt2 = counter2();
printf("%d回目の関数呼び出し staticあり:%d, staticなし:%d\n", i+1, cnt1, cnt2);
}
return 0;
}
1回目の関数呼び出し staticあり:1, staticなし:1
2回目の関数呼び出し staticあり:2, staticなし:1
3回目の関数呼び出し staticあり:3, staticなし:1
一方Javaのstatic修飾子は、「クラスの生成と同時に生成する」機能があります。
普通なら、クラス内の変数・メソッドはインスタンス化して初めて使えるようになります。
class Hello_t {
String name = "DAU";
static void main(String[] args) {
Hello_t hello = new Hello_t(); // インスタンスを作る
System.out.println("Hello, " + hello.name);
}
}
Hello, DAU
しかしstaticをつけると、インスタンス化しなくても変数が使えるようになります。
class Hello_t {
static String name = "DAU";
static void main(String[] args) {
// インスタンスを作らない
System.out.println("Hello," + name);
}
}
Hello, DAU
同じstaticでも、言語によってこんなに違うんだ!
機能【C言語はポインタ、Javaはクラスや継承】
static修飾子の役割の違い以外にも、重要な違いがたくさんあります。
例えば、C言語にはポインタがありますが、Javaには存在しません。
ポインタを使うことで、PC内部のメモリをいじることができます。
メモリをいじることで柔軟なコードが書けますが、セキュリティ上良くないプログラムができてしまう恐れがあります。
また、Javaはオブジェクト指向特有のクラスや継承といった機能を持ちます。
クラスや継承を使うことで、再利用性が高く、まとまりのあるプログラムを書くことができます。
その他、Javaでは「ガベージコレクション」というメモリの自動解放機能がある点も特徴の1つです。
ポインタってハッキングに使われるって聞いたことあるなぁ
実行環境【C言語はOSごと、JavaはどんなOSでも】
C言語のプログラムはOSごとに異なるコンパイラを使う必要があります。
例えば、Windows10用にコンパイルしたファイルは、MacOSでは使えません。
Javaはこういった「OS依存性」を排除することを1つの目的として作られました。
Javaプログラムは、妥当なバージョンの JVMというソフトがある環境なら、OSに関係なく同じ動作が期待できます。
JVMとは、Java専用の仮想マシンのことです。
用途【C言語は組み込み系、Javaはシステム開発】
C言語は主に組み込み系ソフトを開発するために使われます。
家電に組み込まれるマイコンのソフトウェアなどを開発します。
その他、OSの開発やロボット工学にも使われています。
JavaはC言語と比べると、かなり多岐に渡って利用されています。
特によく利用されるのは「業務システム」「Androidアプリ」「Webアプリ」です。
昔から根強い人気を誇る言語なので、古くから使われている業務システムはJavaで開発されていることが多いです。
古い言語を移行するのは面倒だから、現場ではそのまま使われがちなのかな?
習得難易度【C言語の方がやや難しい】
C言語の方がやや難しいと感じる人の方が多いようです。
Yahoo知恵袋の「C言語とJavaではどちらのほうが習得するのが難しいですか?」という質問に対する7件の回答をまとめました。
C言語とJavaを学ぶ難易度は 同じだと考える人 | 2人 |
C言語の方が難しいと考える人 | 5人 |
Javaの方が難しいと考える人 | 0人 |
C言語の方が、基礎を理解するのは難しいと言えそうです。
ただし、JavaはC言語より覚える概念が多いので、一概に「どちらが難しい」とは言えません。
またC言語もJavaも、プログラミング言語の中では難しい部類に入ることにも注意が必要です。
オブジェクト指向を理解できれば、RubyやPythonも少しは楽に学べそうだね!
将来性【Javaの方が求人は多い】
R-Stoneが調査した2021年版の日本国内の言語別求人数によると、Javaは第1位でC言語は10位以下となっています。
じゃあ、C言語の求人は全然ないのかというと、そうでもありません。
例えば、求人ボックスというサイトで”C言語”と検索してみると、115,551件ヒットしました。(2024年7月時点)
また、海外のTIOBEというサイトが調査した2021年版の言語別レーティングでは、C言語が1位、Javaが3位という結果です。
よって、Javaの方が国内求人は多いといえますが、C言語でも十分仕事は探せるレベルだと言えるでしょう。
JavaやC言語は新たに何かを開発するというより、古いコードを改修するために使われることには注意が必要です。
モダンな開発に携わりたい方は、GoやReactなど比較的新しい言語に触れてみると良いかもしれません。
Javaって国内求人数1位だったんだ!
C言語とJavaの似てる点【main関数でプログラムを開始する】
C言語とJavaは「main関数内のプログラムを実行する」という点が共通しています。
最近人気のPythonやRubyなどは、main関数が存在せず、書いた通り実行していきます。
一方、C言語やJavaはmain関数をどこかに定義しないとエラーが出ます。
どんなにクラスや関数を定義しても、main関数で呼び出さなければ使われません。
片方を学べばもう片方も簡単に習得できる?【簡単ではない】
どちらか片方を学んでも、もう片方の勉強が劇的に楽になることはありません。
C言語とJavaは相違点がそれなりに多く、難所もそれぞれ違うからです。
C言語の難所 | ポインタ |
Javaの難所 | オブジェクト指向 |
しかし「C言語」や「Java」を学ぶことで、理解が楽になる言語はたくさんあります。
例えばC言語を学べば、C言語を拡張した言語であるC++やObjective-Cは楽に理解できます。
またJavaを学ぶことで「オブジェクト指向」を理解できるので、PythonやRubyなどを学びやすくなります。
1つの言語をマスターすれば他の言語は学びやすくなるので、何か1つの言語に打ち込んでみると良いかもしれません。
英語を学べばスペイン語が学びやすくなるのと似てるね!