soraなりの日々 - fc2 -

こころにひっかかったもの

[c++,java] Javaな日々...比較して覚える java - 1.generics_1 -

さて、2回目。
前回のはココ

前の会社で中途半端に出してた社内のメールから
若干内容削除とかして変更してから乗せていきます。

では、行ってみよう!

このエントリーをはてなブックマークに追加
☆ ま、なにはともあれ、、、
  て、ことでなにはともあれ。本題。
  javaの勉強。
  結局、まだ参考書は買えてない。
  出張から帰ってきて、amazonでポチッとした。
  参考書

  届くのは、来週(今週になるのか)かと。
  それまで、遊んでるのもなんなので、自分の興味のあるやつを、、
 
  で、generics
 
generics
  オブジェクト指向とは別にジェネリック・プログラミング
  というのがある。
  javagenerics は、それを実現するものかな。
 
  - wikipedia より -
  ジェネリック(総称)プログラミング ( generic programming ) は
  データ形式に依存しないコンピュータプログラミングの方式。
  (後略)
  詳細はココ
 
  要は型に依存せずにアルゴリズムだけ定義する、ってこと
  これでもなんだか解らない、、、
  じゃ、コードで。

  c++ には、そのジェネリック・プログラミングを実現するために
  template という非常に強力な機能があるんだな。
  これで説明。
  int 型の a, b の変数の値を入れ替える関数 swap_test() があるとする。
  コードはこんな感じになるかと。。。

void swap_test(int& a, int& b)
{
    int buff = a;
    a = b;
    b = buff;
}
 
  次に文字列の入れ替える関数が欲しくなった場合、上の
  swap_test() に似たようなやつを作らないといけない。
  あー、とってもめんどくさい。。。

void swap_test(std::string& s1, std::string& s2)
{

    std::string buff = s1;
    s1 = s2;
    s2 = buff;
}

 
  処理は同じなのに処理する型だけが違う、、、
  そんなときこそ、template!

template void swap_test(T& x, T& y)
{
    T buff = x;
    x = y;
    y = buff;
}

  あー、楽だ。この swap_test() を使えば、型を気にしなくて良いわけ。
  この template 機能を使って、c++ には STL(Standard Template Library)
  という、非常に強力なライブラリが作られてる。
  「このSTLがないと、c++ではない。」という人までいるらしい。。
 
☆ で、どう使うの?
  上述の STL には、std::vector というのがある。
  配列を動的に確保したい場合、c だとmalloc() して、
  realloc() をして配列を拡張していくと思う。
  そして、確保した領域を free() しなくちゃいけない。
 
  あー、メンドクサイ。
  でも、std::vector を使えば、どんどん追加できる。
  しかも、解放は考えなくて良い。

vector list; // int型のリスト
// 10個、リストに要素を追加する
for (int iCnt=0; iCnt<10; iCnt++) {
    list.push_back( iCnt );
}

  vector list が持ってる push_back() という関数は、
  list に渡された引数を追加するって処理をするけど、
  型はなんでも良いワケ。
  おぉーありがたや、template 。
 
☆ んで、java の話は?
  はい。忘れてました。
  c++  講座になってた。。。
  しかも、紙面がつきてきた。
 
  で、この vector。もちろん java にもある。
  ( vector、iterator の詳しい説明とか書き出すと終わらないので
  適当にハショろー(^^;)

  java にも当然、vector はある。
  ただ、以前のバージョン(1.4.2 とか?)は、キャストが
  必要だったりして、結構いいかげんだったらしい。

// StringのVector
Vector strList = new Vector();
// Stringを追加
strList.add( "hello" );
// キャストして取得
String s = ( String )strList.get( 0 );

// なんと Integer を追加できる
strList.add( new Integer( 0 ) );
Integer i = ( Integer )strList.get( 1 );


  これが java 1.5から generics を取り入れ、より c++ ぽく
  書けるようになった、と。
  たぶん、ちゃんと勉強したら違うんだろうけど、
  今のところの理解として、java generics = c++ template
  で理解してて良いと思う。

  で、いつものコード比較。
 
java:test_generics.java

import java.util.Vector;
import java.util.Iterator;

public class test_generics {
    public static void main(String[] args) {
        // IntegerのVector
        Vector nList = new Vector();

        // 10個、要素を追加
        for (Integer iCnt=0; iCnt<10; iCnt++)
            nList.add( iCnt );

        // iteratorを使って表示
        Iterator it = nList.iterator();
        while ( it.hasNext() )
            System.out.println( it.next() );
    }
}


c++:test_generics.cpp

#include
#include

using namespace std;

int main(void)
{
    // intのvector
    vector nList;

    // 10個、要素を追加
    for (int iCnt=0; iCnt<10; iCnt++)
        nList.push_back( iCnt );

    // iteratorを使って表示
    vector::iterator it = nList.begin();
    while ( it != nList.end() ) {
        cout << *it << endl;
        it++;
    }
    return 0;
}


  結果は共に "0 1 2 .... 9" が表示される。
  java generics を調べてたら、最初は必ず「c++ の template
  みたいなもの」とは書かれてるんだけど、どうも表面だけみたい。
 
  後々、参考書できちんと出てくると思うので、
  今回はこのぐらいで良いかな、と。
 
  早く参考書届かないかな。ネタつきた。。。
  また次回。

☆ 今週の読み物
  [直感を信じろ、自分を信じろ、好きを貫け、
  人を褒めろ、人の粗探ししてる暇があったら自分で何かやれ。
      - 梅田望夫]
  http://d.hatena.ne.jp/umedamochio/20070317/p1
 
  ちょっと古い話だけど。
  いろいろと話題になり、物議をかもした。
 
  最後の
   >>そんなことしている暇があったら自分で何かやれ。
  は、いつも思うがなかなかできなかったり。。

☆ 環境
  os:mac os x 10.4.10(8r218)
  cpu:powerpc g4 1.25 ghz
  mem:1 gb
  java ver:java version "1.5.0_07"

☆ -------------
keep creating,


↑template の話でコードの比較部分が単純に vector と iterator の
 ライブラリ比較になってるけど、ま、良いっか。。。
 それにしても、2回目が来て、そんなにネタがあったかと不安が、、、
 そんなに書いてなかったよな?オレ。

このエントリーをはてなブックマークに追加

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://sora2hs.blog70.fc2.com/tb.php/282-4f317004
この記事にトラックバックする(FC2ブログユーザー)