アルゴリズムとプログラミング

アルゴリズムとプログラミング
(Algorithms and Programming)
第12回:補足的事項
•Stringクラスの機能と使い方
•参照型変数
講義資料等: http://www.pe.titech.ac.jp/~watanabe/lecture/ap/index-j.html
復習
メソッドのオーバーライド
オーバーライド(override)
親クラスと子クラスのそれぞれに、
メソッド名、引数、戻り値が全て同一で
内容が異なるメソッドを定義すること
オーバーロード (overload)
混同注
意!
ひとつのクラス内に、メソッド名が同じ
で、引数の型及び数が異なるメソッドを
定義すること
復習
メソッドのシグニチャー
メソッドを区別するための
メソッド名、引数の型、戻り値
をシグニチャー(signature)という
メソッドの書式
戻り値 メソッド名(型 変数名1, 型 変数名2,...)
クラスの配列
基本型(int型)の配列宣言の例
int a[ ] ;
a = new int[10] ;
ユーザが定義したクラスでも配列を作ることが可能
例)Pointクラスの参照型変数を3個格納する配列の宣言
Point p[ ] ;
p = new Point[3] ;
pはオブジェクト参照型変数
の配列である
Pointクラスが既に
定義されているものとする
3個の参照型変数を
格納する
pにオブジェクト参照を代入する
例)
p[0] = new Point(0.0, 0.0);
p[1] = new Point(0.0, 1.0);
p[2] = new Point(2.0, 3.0);
p[0]~p[2]の3つのオブジェクト参照
変数に、それぞれ生成したインスタ
ンスの参照を代入した
Stringクラス
システムに組み込まれている
Stringオブジェクトの宣言と初期化
String s = "abcdefg";
String s = new String ( "Hello, Java!" );
文字列リテラルはStringクラスのインスタンス
Stringクラスの各種メソッドの例
コンストラクタ
String s = new String ( "Hello, Java!" );
文字列の長さを得る s.length();
i番目の文字を得る s.charAt ( i );
(先頭文字は i=0)
文字列の一部を置換する
s.replace("Java","ジャバ");
数値を文字列に変換する 文字列を数値に変換する
int i = Integer.valueOf( "1234" );
int i = 1234;
s = String.valueOf( i );
この他、多数のメソッドが用意されている
Stringクラスの演算子
String s = new String("abc");
s = s + "def";
+演算子は、文字列の結合を意味する
s = 先頭メモリ番地A
abc
abc
元のインスタンスとは別のメモリ番地
に新たなインスタンスが生成される
def
abcdef
s = 先頭メモリ番地B
インスタンスの内容を変更するの
ではなく、新たなインスタンスを生
成し、古いのを捨てている
Stringの配列
例1)
String a[] ;
a = new String[3];
a[0] = "abcd";
a[1] = "efgh";
a[2] = "ijkl";
複数の文字列を格納する際に
使用する
例2)main()メソッドの引数文字列
public static void main(String[] args) {
• args はStringクラスの参照型変数を格納する配列
• 確保される配列の個数は、プログラムを実行する際に
与えられる引数の個数に等しい
例)
java Sample 1.0 abcd
プログラム名 引数1 引数2
"1.0" →args[0]
"abcd"→args[1]
args.length は 2
Stringクラスの特徴
• Stringオブジェクトは読み出しのみ可能、変更
不可能
• 演算やメソッドにより変更しているように見え
ても、実は元のインスタンスを捨てて、新しい
インスタンスに差し替えている
• 基本型ではないがシステムレベルでサポート
されており、比較的軽い
変更可能な文字列を提供するのは
StringBufferクラス
参照型変数
使用法:配列やクラスのインスタンスの参照を格納する
参照型変数に格納されるデータは?: ?
インスタンスの格納されているメモリ番地(アドレス)
が格納されており、中身自身が格納されているわけ
ではない
注意点:インスタンスの中身(内容)の比較を行う際に
参照型変数同士の比較をしても意味がない。
では、どうすればよいか?
参照型変数の比較
class X {
int x;
X(int a){x=a;}
}
X o1 = new X( 2 );
X o2 = new X( 2 );
o1とo2は全く別のインスタンス
o1とo2の中身の値は全く同じ
o1とo2の中身の比較を行う文?
o1とo2の中身の比較を行う文?
下記の論理式は真か、偽か?
o1 == o2
答え: 偽(false)
理由: o1とo2は別々のインスタンスであり、格納
されるメモリ番地は異なるから。
内容の比較を行うメソッド
o1.equals(o2) == true
equals()メソッドは、Objectクラスで定義され継承されている
オブジェクトの複製
String s1 = "abc";
String s2 ;
問題: s1とは別のインスタンスとして、s2にs1の
内容のコピーを作りたい。どう書けばよいか?
1. s2 = s1; s2はs1と同じインスタンスを指し示すだけで
中身はコピーされない
2. s2 = new String(s1); コンストラクタで別インスタンス
を生成し、s1の内容で初期化
s1 s2
abc
s1
abc
s2
abc
まとめ
•Stringクラスの特徴と使い方
•参照型変数に関する注意事項
今後の展望
• 本講義でJavaの基本文法はほぼカバー
• カバーしきれなかった点
– インターフェース
– 例外処理
– マルチスレッド
• 各種クラスライブラリの活用
– ラッパークラス
– Stringクラス
– ファイル入出力用クラス..等
さらに高度なクラスライブラリへ
今後の展望
• コンピュータ言語の文法自体は底が浅い
• しかし、アルゴリズムは奥が深い
• 本講義で身に着けたJava言語を武器に、ア
ルゴリズムの勉強を自ら進めることが可能
• また、世に出ている優れたプログラムを読ん
で、基本構造の設計手法やコーディングテク
ニック等を学ぶことで、実用的なプログラミン
グ能力を身につけることもできる
IT技術を自在に操るスキルと洞察力