このチュートリアルでは、2つのオブジェクト指向プログラミング言語であるC++とJavaの主な違いについて説明しています:
C++とJavaは、どちらもオブジェクト指向のプログラミング言語ですが、両者は多くの点で異なっています。
C++はC言語から派生したもので、手続き型とオブジェクト指向型の両方の特徴を持つプログラミング言語です。 C++はアプリケーションとシステム開発のために設計されています。
Javaは、安全で移植性の高い仮想マシンをベースに構築されており、既存のプラットフォームを抽象化するための包括的なライブラリーを備えています。
Javaは主にアプリケーションプログラミングのために設計され、印刷システムのインタプリタとしての機能を持ち、その後ネットワークコンピューティングに発展していった。
お勧めの読み物 =>; C++トレーニングガイド for All
C++とJavaの主な違い
では、C++とJavaの主な違いについて、この記事を読みながら説明しましょう。
チュートリアルを行います。
#1)プラットフォーム インディペンデンス
C++ | ジャワ |
---|---|
C++はプラットフォームに依存する言語です。 C++で書かれたソースコードは、あらゆるプラットフォームでコンパイルする必要があります。 | Javaはプラットフォーム非依存です。 一度バイトコードにコンパイルすれば、あらゆるプラットフォームで実行可能です。 |
#その2)コンパイラとインタープリタ
C++ | ジャワ |
---|---|
C++はコンパイルされた言語である。 書かれたソースプログラム はオブジェクトコードにコンパイルされ、それを実行することで出力されます。 | Javaはコンパイル型言語であると同時にインタプリタ型言語でもあります。 Javaソースコードのコンパイル出力は、プラットフォームに依存しないバイトコードです。 |
#その3)携帯性
C++ | ジャワ |
---|---|
C++のコードはポータブルではありません。 各プラットフォーム用にコンパイルする必要があります。 | しかし、Javaは、コードをバイトコードに変換します。 このバイトコードはポータブルで、あらゆるプラットフォームで実行可能です。 |
#その4)メモリ管理
C++ | ジャワ |
---|---|
C++のメモリ管理は手動です。 new/delete演算子を使って手動でメモリを確保/解放する必要があります。 | Javaでは、メモリ管理はシステムで制御されます。 |
#その5)多重継承
C++ | ジャワ |
---|---|
C++は、単一継承や多重継承など、さまざまなタイプの継承をサポートしています。 多重継承による問題もあるが、C++はvirtualキーワードで問題を解決している。 | Javaでは、単一継承のみをサポートしています。 多重継承の効果は、Javaのインターフェイスを使って実現することができます。 |
#その6)過負荷
C++ | ジャワ |
---|---|
C++では、メソッドや演算子をオーバーロードすることができる。 これが静的多相性である。 | Javaでは、メソッドのオーバーロードのみが許可されています。 オペレーターの過負荷を許さない。 |
#7)バーチャルキーワード
C++ | ジャワ |
---|---|
C++では、動的多相性の一環として、派生クラスでオーバーライドできる関数を示すために、関数とともにvirtualキーワードを使用します。 こうすることで多相性を実現することができます。 | Javaではvirtualキーワードはありませんが、Javaではデフォルトで非静的なメソッドはすべてオーバーライド可能です。 簡単に言うと、Javaの静的でないメソッドは、デフォルトですべて仮想メソッドになります。 |
#その8)ポインタ
C++ | ジャワ |
---|---|
C++はポインターが全てです。 以前のチュートリアルで見たように、C++はポインタを強力にサポートしており、ポインタを使って多くの便利なプログラミングを行うことができます。 | Javaはポインタのサポートが限定的です。 当初、Javaはポインタを全く持っていませんでしたが、後のバージョンでポインタの限定的なサポートを提供するようになりました。 Javaでは、C++のように悠長にポインタを使うことはできません。 |
#9)ドキュメントコメント
C++ | ジャワ |
---|---|
C++は、ドキュメントコメントをサポートしていません。 | Javaには、ドキュメントコメント(/**...*/)が組み込まれています。 これにより、Javaソースファイルは独自のドキュメントを持つことができます。 |
#10)スレッドサポート
C++ | ジャワ |
---|---|
C++はスレッドサポートを内蔵しておらず、ほとんどがサードパーティ製のスレッドライブラリに依存しています。 | Javaはスレッドサポートを内蔵しており、スレッドクラスを継承し、runメソッドをオーバーライドすることができます。 |
もっと違うところがある...
#11)ルートヒエラルキー
C++は手続き型であると同時にオブジェクト指向のプログラミング言語であるため、特定のルート階層に従うことはない。
Javaは純粋なオブジェクト指向のプログラミング言語であり、単一のルート階層を持つ。
#12 ) ソースコードとクラスの関係
C++では、ソースコードとファイル名には何の関係もありません。 つまり、C++のプログラムにはたくさんのクラスがあり、ファイル名は何でもいいのです。 クラス名と同じである必要はありません。
Javaでは、ソースコードのクラスとファイル名の間に密接な関係があります。 ソースコードを含むクラスとファイル名は同じであるべきです。
例として もし、Javaでsalaryというクラスがあれば、このクラスコードを含むファイル名は "salary.java "となります。
#13 ) コンセプト
C++はプラットフォームに依存しないため、一度書いたらどこでもコンパイルできる、というのがC++プログラムのコンセプトです。
一方、Javaコンパイラが生成するバイトコードはプラットフォームに依存せず、どのマシンでも動作するため、Javaプログラムでは、一度書いたら、どこでも、どこでも実行することができます。
#14 ) 他の言語との互換性
C++はCをベースに作られています。C++言語は、他のほとんどの高級言語と互換性があります。
Javaは他の言語と互換性がありません。 JavaはCやC++に触発されたため、その文法はこれらの言語と似ています。
#15 ) プログラミング言語の種類
C++は手続き型言語であると同時にオブジェクト指向プログラミング言語でもあるため、手続き型言語特有の機能とオブジェクト指向プログラミング言語特有の機能を併せ持っています。
Javaは完全にオブジェクト指向のプログラミング言語です。
#16 ) ライブラリーインターフェース
C++は、ネイティブのシステムライブラリを直接呼び出すことができるため、システムレベルのプログラミングに適しています。
Javaには、ネイティブライブラリの直接呼び出しサポートがありません。 Java Native InterfaceやJava Native Accessを通じてライブラリを呼び出すことができます。
#17 ) 特徴的な機能
手続き型言語とオブジェクト指向言語に関連する機能が、C++の特徴です。
自動ガベージコレクションはJavaの特徴である。 一方、Javaはデストラクタをサポートしていない。
#18 ) タイプセマンティクス
C++の型セマンティクスに関する限り、プリミティブ型とオブジェクト型は一致している。
しかし、Javaの場合、プリミティブ型とオブジェクト型の間に整合性がありません。
#19 ) 入力機構
C++では、データの読み込みと書き込みに、それぞれcinとcout、そして'>>'と'<<'演算子を使用します。
Javaでは、Systemクラスが入出力に使われます。 入力を読むには、1バイトずつ読むSystem.inが使われ、出力を書くには、System.outという構成が使われます。
#20) アクセスコントロールとオブジェクト保護
C++は、アクセス指定子でアクセスを制御し、強力なカプセル化で保護を確保する、オブジェクトの柔軟なモデルです。
Javaは、カプセル化が弱く、比較的面倒なオブジェクトモデルです。
#21) 後藤ステートメント
C++はgoto文をサポートしていますが、プログラム内でgoto文を使用した場合の結果を防ぐために、その使用は最小限にとどめるべきです。
Javaはgoto文のサポートを提供していません。
#22 ) スコープレゾリューションオペレーター
スコープ解決演算子は、グローバル変数へのアクセスやクラス外のメソッド定義に使用します。
C++はスコープ解決演算子をサポートしており、グローバル変数へのアクセスに使用します。 また、クラス外で関数を定義し、スコープ解決演算子を使用してアクセスすることも可能です。
一方、Javaはスコープ解決演算子をサポートしていません。 また、Javaは関数を外部で定義することができません。 main関数を含め、プログラムに関わるものはすべてクラスの中にある必要があります。
#23 ) トライ/キャッチブロック
C++では、コードが例外を投げるかもしれないと分かっていても、try/catchブロックを除外することができます。
しかし、Javaでは、コードが例外を投げることが確実な場合、このコードをtry/catchブロックの下に含める必要があります。 Javaではデストラクタをサポートしていないため、例外が異なります。
#24 ) ランタイムエラー検出
C++では、実行時のエラー検出はプログラマの責任である。
Javaでは、実行時のエラー検出はシステム側で制御されます。
#25 ) 言語サポート
C++はハードウェアに近く、システムリソースにアクセスできるライブラリもあるため、C++で開発されたデータベース、エンタープライズ、ゲームなど様々なアプリケーションがありますが、システムプログラミングに適していると言えます。
#26 ) データ・機能
C++は名前空間だけでなくグローバルスコープを持つので、データや関数はクラスの外にも存在することができます。
Javaでは、すべてのデータと関数はクラス内にある必要があります。 グローバルスコープはありませんが、パッケージスコープはありえます。
#27 ) 構造・組合
構造体とユニオンは、異なるデータ型を持つメンバーを持つことができるデータ構造です。 C++は構造体とユニオンの両方をサポートしています。
しかし、Javaは構造体やユニオンをサポートしていません。
#28 ) オブジェクト管理
C++では、オブジェクトは手動で管理されます。 オブジェクトの生成と破壊は、それぞれnew演算子とdelete演算子を用いて手動で行います。 また、クラスオブジェクトにはコンストラクタとデストラクタを用います。
Javaはコンストラクタをサポートしていますが、デストラクタをサポートしていません。 また、Javaはオブジェクトの収集と破壊を自動ガベージコレクションに大きく依存しています。
#29 ) パラメーターの受け渡し
値によるパスと参照によるパス は、プログラミングで使われる2つの重要なパラメータ受け渡し技法です。 JavaとC++は、この2つの技法をサポートしています。
#3 0) ハードウェア
C++はハードウェアに近いため、ハードウェア資源を操作できるライブラリが多く、システムプログラミング、ゲームアプリケーション、OS、コンパイラなどによく利用されています。
Javaはほとんどがアプリケーション開発言語であり、ハードウェアとは縁遠いものです。
表形式:C++とJavaの比較
C++とJavaの比較を表にしてみました。
いいえ。 | 比較パラメータ | C++ | ジャワ |
---|---|---|---|
1 | プラットフォームの独立性 | C++はプラットフォームに依存します。 | Javaはプラットフォーム非依存です。 |
2 | コンパイラとインタープリタ | C++はコンパイルされた言語である。 | Javaはコンパイル型言語であると同時にインタプリタ型言語でもあります。 |
3 | ソースコードとクラスの関係 | クラス名とファイル名の厳密な関係はありません。 | クラス名とファイル名の関係を厳格にする。 |
4 | コンセプト | 一度書いたらどこでもコンパイルできる。 | Write once run anywhere & everywhere. |
5 | 他の言語との互換性 | オブジェクト指向の機能を除き、C言語と互換性がある。 | 構文はC/C++から引用しています。 他の言語との後方互換性はありません。 |
6 | プログラミング言語の種類 | プロシージャルとオブジェクト指向。 | オブジェクト指向です。 |
7 | ライブラリーインターフェース | ネイティブシステムライブラリの直接呼び出しを許可する。 | Java NativeインターフェースとJava Native Accessによる呼び出しのみ。 |
8 | ルートヒエラルキー | ルート階層がない。 | シングルルート階層に従う。 |
9 | 特徴的な機能 | オブジェクト指向だけでなく、手続き的な機能もサポートします。 | デストラクタはなく、自動ガベージコレクションです。 |
10 | ポータビリティ | C++のコードはポータブルではありません。 | Javaはポータブルです。 |
11 | タイプセマンティクス | プリミティブ型とオブジェクト型の間で一貫性がある。 | 一貫性がない。 |
12 | 入力機構 | Cin、CoutはI/Oに使用します。 | System.inとSystem.out.printlnについて |
13 | アクセスコントロールとオブジェクト保護 | 柔軟なオブジェクトモデルと一貫したプロテクトを実現します。 | オブジェクトモデルは煩雑で、カプセル化も弱い。 |
14 | メモリ管理 | マニュアル | システムコントロールされている。 |
15 | マルチプルインヘリタンス | プレゼント | 欠席 |
16 | 後藤ステートメント | Gotoステートメントをサポートします。 | gotoステートメントをサポートしていません。 |
17 | スコープレゾリューションオペレーター | プレゼント | 欠席 |
18 | トライ/キャッチブロック | try/catchブロックを除外できる。 | コードが例外を投げることになっている場合は除外できない。 |
19 | オーバーロード | 演算子やメソッドのオーバーロードをサポートします。 | 演算子の過負荷をサポートしません。 |
20 | 仮想キーワード | オーバーライドを容易にする仮想キーワードをサポートします。 | virtualキーワードはなく、すべての非静的メソッドはデフォルトでvirtualとなり、オーバーライドが可能です。 |
21 | ランタイムエラー検出 | プログラマーに任せた。 | システム責任 |
22 | 言語サポート | 主にシステムプログラミングに使用します。 | 主にアプリケーションのプログラミングに使用されます。 |
23 | データ・機能 | グローバルスコープとネームスペーススコープに対応しています。 | データおよび関数はクラス内にのみ存在し、パッケージスコープが利用可能です。 |
24 | ポインタ | ポインターをサポートします。 | ポインタのサポートは限定的です。 |
25 | 構造・組合 | 対応 | 非対応 |
26 | オブジェクト管理 | 新規作成と削除による手動でのオブジェクト管理。 | ガベージコレクションによるオブジェクトの自動管理。 |
27 | パラメーターの受け渡し | 値による呼び出しと参照による呼び出しをサポートします。 | 値による呼び出しのみをサポートします。 |
28 | スレッドサポート | スレッドのサポートはあまり強くなく、サードパーティに依存している。 | 糸を支える力が非常に強い。 |
29 | ハードウェア | ハードに近いところ。 | ハードウェアとの相互作用があまりない。 |
30 | ドキュメンテーション コメント | 文書コメントをサポートしていない。 | Javaソースコードのドキュメントを作成するドキュメントコメント(/**...*/)をサポートします。 |
ここまで、C++とJavaの主な違いについて詳しく見てきましたが、ここからは、プログラミングの世界でC++とJavaに関するよくある質問にお答えします。
C++とJavaでよくある質問
Q #1)C++とJavaはどちらが優れているのでしょうか?
答えてください: C++とJavaにはそれぞれ長所と短所があります。 C++はシステムプログラミングに適していますが、Javaではそれができません。 しかし、JavaはWebやデスクトップなどのアプリケーションに優れています。
実際、C++はシステムプログラミングからエンタープライズ、ゲームまで何でもできます。 Javaはウェブやエンタープライズに近いことができます。 ある種の低レベルプログラミングアプリケーションやゲームなど、Javaに開発を任せることができないアプリケーションもあります。
両言語の長所と短所を事前に評価し、開発するアプリケーションに対する独自性を検証した上で、どちらが優れているかを判断するのがベストです。
Q #2)C++はJavaよりも高性能なのでしょうか?
答えてください: これはまた難しい質問ですね。 構文や言語の習得のしやすさという点では、Javaに軍配が上がります。 システムプログラミングやその他の低レベルのアプリケーションという点では、C++の方が強力です。
自動GCコレクションやポインタ、多重継承を持たないことが、Javaをより強力にすると主張する人もいるかもしれません。
また、ゲームのように状態を保存する必要があるアプリケーションでは、自動ガベージコレクションはタスクを台無しにしてしまいます。 このように、C++は明らかに強力です。
Q #3)CやC++を知らなくてもJavaを学べるのでしょうか?
答えてください: はい、間違いありません!
プログラミングの基礎とオブジェクト指向プログラミングの概念を知った上で、Javaの学習を開始することができます。
Q #4)C++はJavaのようなものですか?
答えてください: ある意味ではYesだが、ある意味ではNoだ。
例えば、C++とJavaはオブジェクト指向のプログラミング言語であり、アプリケーションの開発に使用することができます。 これらの言語は類似した構文を持っています。
同様に、プリミティブデータ型、オブジェクトハンドリング、ポインタなどに関しても、両者は異なる言語です。
Q #5)JavaはC++で書かれているのですか?
答えてください: SunとIBMによるJava Virtual Machine (JVM)の意味でのJavaはC++で書かれています。 JavaライブラリはJavaです。 他のJVMはCで書かれているものもあります。
結論
C++とJavaは、どちらもオブジェクト指向のプログラミング言語です。 また、C++は手続き型言語でもあり、継承、ポリモーフィズム、ポインター、メモリ管理など、両言語が完全に異なる機能があります。
C++には、ハードウェアとの親和性、優れたオブジェクト管理、スピード、パフォーマンスなどの特徴があり、Javaよりも強力であるため、低レベルプログラミング、高速ゲームアプリケーション、システムプログラミングなどにC++を使用する開発者の動機となります。
同様に、Javaの簡単な構文、自動ガベージコレクション、ポインタの欠如、テンプレートなど、JavaはWebベースのアプリケーションに好まれています。