
第1回
プログラマが知っておきたいJavaと.NETの違い
株式会社クロノス
高山 智史
2010/6/7
編集部注:読者の貴重なご指摘により一部コンテンツを改編させていただきました。内容に不備があったことをお詫び申し上げます(2010年6月11日)
開発言語としてのJavaとC#を10の視点から比較
Java言語はオブジェクト指向言語としてサン・マイクロシステムズ(現オラクル)が開発したプログラミング言語です。一方、.NETに対応したVisual Studioでは、以下のプログラミング言語がサポートされています。
- Visual Basic
- Visual C++
- Visual C#
- Visual F# (.NET Framework 4.0から)
- JScript(JavaScript)
- そのほかサードパーティがサポートしている言語
ほかにも.NET Frameworkでは、プレゼンテーションプラットフォームのWPFのUI要素や、Silverlightで画面に表示する図や画像などのUI情報は「XAML」と呼ばれるXMLベースのマークアップ言語が用いられています。
■ JavaとC#のソースコードを比較
本稿では、Javaと比較する言語として.NETプラットフォーム向けに、新たに開発されたオブジェクト指向言語である「C#」をメインに取り上げます。まずは、それぞれの言語で「Hello World」プログラムを実装してみます。
![]() |
| 図3 JavaとC#で「Hello World」 |
上記ソースから以下のような特徴が挙げられます。
■ 【1】クラスが基本構成要素である
実際には、クラス以外にもinterfaceやenumなどのトップレベル概念がありますが、JavaもC#も基本はクラスがプログラム構成のメインです。
■ 【2】C++言語が文法の基礎
JavaもC#も「{ }」でクラスやメソッドの始まりと終わりを示し、「;」(セミコロンを文の区切りに使用します。メソッドの呼び出しは「オブジェクト.メソッド名(引数)」で行っています。これらの基本構文は同じです。
■ 【3】宣言と実装が分割されていない
JavaもC#も宣言と実装が同じファイルです。ただしC#の場合は、partial修飾子を付与したパーシャルクラスを使用することで複数ファイルに分割可能です。さらに、パーシャルクラス内限定で同様にpartial修飾子をメソッドに宣言することでメソッドの宣言と定義の分割も可能です。
■ 【4】実行の開始メソッド名が一緒
実行の開始はクラスの大文字/小文字の違いはあれ、JavaもC#もmain/Mainメソッドから開始されます。
■ 【5】アクセス修飾子
以下は、C#の修飾子とJavaの修飾子です。
| 表3 C#とJavaの修飾子 | |||||||||||||||||||||
|
JavaでもC#でも、違いがないのは、public修飾子とprivate修飾子のみです。
■ 【6】データ型
C#の変数の型は「値型」「参照型」の2つに分類されます。
- 値型
char、int、floatなどの組み込みのプリミティブデータ型と、enumなどの構造体で宣言されるユーザー定義型がある - 参照型
クラス、およびプリミティブ型から作成されるそのほかの複合データ型。参照型の変数には、型のインスタンスは含まれず、インスタンスへの参照だけが含まれる
C#には、decimal型という値型があります。10進数で28けたを正確に保持できます。ほかにもC#は値型と参照型はすべて「object」と呼ばれるクラスから派生しています。そのため、intのリテラルもそのままコレクションに入れることができます。
Javaの場合も、JDK 5.0からボクシング・アンボクシング機能が追加され同様のことができます。
■ 【7】完全修飾名と名前空間のエイリアス
C#もJavaと同様に、完全修飾名を指定すると名前空間(Javaでいうパッケージ)のusing参照を使わずに、.NET Framework内のクラスにもユーザー定義の名前空間のクラスにもアクセスできます。完全修飾名は非常に長くなることがありますが、そのような場合にC#では、「usingディレクティブ」というものが用意されています。usingを使用すると最初の「HelloWorld.cs」は以下のように実装できます。
HelloWorld.csusing System;
public class HelloWorld
{
public static void Main()
{
Console.WriteLine("Hello World");
}
}
これにより、名前空間内にあるクラスを修飾名なしで使用できます。usingを使用して短い名前(エイリアス)も指定もできます。
using Project = Sample.Test.Project;
■ 【8】構造体(struct)
public struct Point
{
public int x, y;
}
C#独自の型でJavaには存在しません。構造体(struct)は値型として扱われます。そのため、classを使うよりもメモリ効率が良く、特に大量のオブジェクトを生成する場合などに利用されます。
■ 【9】マルチスレッド
Javaではsynchronizedを使用しますが、C#ではlockキーワードで同様の機能を実現しています。C#では.NET Framework 4から追加されたTask Parallel LibraryやParallel LINQの並列処理拡張を使用した並列プログラミングも可能です。
■ 【10】ネイティブコードの呼び出し
C#では、C言語などの既存のプログラミング言語との相互運用のために「unsafe」キーワードを使用して、制限されているポインタなどの低レベル機能を利用できます。Javaではネイティブコードを呼び出す場合、JNI(Java Native Interface)やJNAを使う必要があります。
■ ほかにもC#独自機能はいっぱい
ほかにもJava独自の機能、C#独自機能があります。C#は後発の言語だけにJavaの周辺仕様をうまく取り入れた言語といえます。2001年以降はバージョンアップする中で多くの機能が共通になってきました。ジェネリック、foreachループ、列挙、ボックス化、可変長パラメータリスト、メタデータ注釈など該当します。
しかし、近年のC#は、独自の機能がどんどん増えています。C# 3.0では、データベースやXML操作を行うための記述をプログラミング言語に埋め込めるLINQ(Language Integrated Query:言語統合クエリ)や、関数型言語で使用されているラムダ式が追加されました。C# 4.0では、動的言語ランタイム(DLR)によって動的プログラミングがサポートされました。
| Index | ||||||||||
|
||||||||||
Javaから見た.NET バックナンバー 連載インデックスへ»
- 第1回 プログラマが知っておきたいJavaと.NETの違い
- 第2回 設計者/SEが覚えておきたいJavaと.NETの違い
- 最終回 将来性から見たJavaと.NETの違い、そして連携は?
| Java Solution全記事一覧 |
TechTargetジャパン
- EclipseでScalaプログラミングを始めるための基礎 (2012/2/10)
概要や5つの特徴を紹介し、開発環境を構築して対話型実行環境「REPL」やEclipse上でHello Worldを実行します - 並列分散処理の常識をHadoopファミリから学ぶ (2012/2/8)
並列分散処理の課題やHadoopの長所/短所、そして短所を補うHadoop関連プロジェクトの構成や概要などを簡単に紹介 - WebLogicサーバ最新版「12c」の気になる4つの特徴 (2012/1/31)
久々にメジャーアップグレードしたJavaアプリケーションサーバについて、製品担当者に軽量インストーラなどの特徴を聞いた - GitHubをもっとソーシャルに使いこなすための7つ道具 (2012/1/23)
ソースコードホスティングのGitHub周辺で便利な新サービスが続々登場しているので、まとめて紹介しよう。特に連動クラウド「fluxflex」が注目だ
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -

