連載
» 2010年06月07日 00時00分 公開

プログラマが知っておきたいJavaと.NETの違いJavaから見た.NET(1)(3/4 ページ)

[高山智史,株式会社クロノス]

開発言語としての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」 図3 JavaとC#で「Hello World」

 上記ソースから以下のような特徴が挙げられます。

【1】クラスが基本構成要素である

 実際には、クラス以外にもinterfaceenumなどのトップレベル概念がありますが、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 どこからでもアクセスが可能 どこからでもアクセスが可能
protected 同一のパッケージ、または派生したクラスからアクセスが可能 派生したクラスからアクセスが可能
internal 存在しない 同一のアセンブリ(DLL)内でアクセスが可能
protected internal 存在しない 同一のアセンブリ(DLL)内、または格納しているクラスから派生した型からのみアクセス可能
private 同じクラス内からのみアクセスが可能 同じクラス内からのみアクセスが可能
指定しない
(default)
同一のパッケージ内でアクセスが可能 privateと同一の扱い

 JavaでもC#でも、違いがないのは、public修飾子とprivate修飾子のみです。

【6】データ型

 C#の変数の型は「値型」「参照型」の2つに分類されます。

  • 値型
    charintfloatなどの組み込みのプリミティブデータ型と、enumなどの構造体で宣言されるユーザー定義型がある
  • 参照型
    クラス、およびプリミティブ型から作成されるそのほかの複合データ型。参照型の変数には、型のインスタンスは含まれず、インスタンスへの参照だけが含まれる

 C#には、decimal型という値型があります。10進数で28けたを正確に保持できます。ほかにもC#は値型と参照型はすべて「object」と呼ばれるクラスから派生しています。そのため、intのリテラルもそのままコレクションに入れることができます。

 Javaの場合も、JDK 5.0からボクシング・アンボクシング機能が追加され同様のことができます。

【7】完全修飾名と名前空間のエイリアス

 C#もJavaと同様に、完全修飾名を指定すると名前空間(Javaでいうパッケージ)のusing参照を使わずに、.NET Framework内のクラスにもユーザー定義の名前空間のクラスにもアクセスできます。完全修飾名は非常に長くなることがありますが、そのような場合にC#では、「usingディレクティブ」というものが用意されています。usingを使用すると最初の「HelloWorld.cs」は以下のように実装できます。

using System;
		   
public class HelloWorld
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
    }
}
HelloWorld.cs

 これにより、名前空間内にあるクラスを修飾名なしで使用できます。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 LibraryParallel LINQ並列処理拡張を使用した並列プログラミングも可能です。

【10】ネイティブコードの呼び出し

 C#では、C言語などの既存のプログラミング言語との相互運用のために「unsafe」キーワードを使用して、制限されているポインタなどの低レベル機能を利用できます。Javaではネイティブコードを呼び出す場合、JNIJava Native Interface)やJNAを使う必要があります。

ほかにもC#独自機能はいっぱい

 ほかにもJava独自の機能、C#独自機能があります。C#は後発の言語だけにJavaの周辺仕様をうまく取り入れた言語といえます。2001年以降はバージョンアップする中で多くの機能が共通になってきました。ジェネリックforeachループ列挙ボックス化可変長パラメータリストメタデータ注釈など該当します。

 しかし、近年のC#は、独自の機能がどんどん増えています。C# 3.0では、データベースXML操作を行うための記述をプログラミング言語に埋め込めるLINQ(Language Integrated Query:言語統合クエリ)や、関数型言語で使用されているラムダ式が追加されました。C# 4.0では、動的言語ランタイムDLR)によって動的プログラミングがサポートされました。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。