学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

Javaプログラミング入門その18 StringBufferを用いたプログラム

<<前  [TOP]  次>>


StringBufferは、文字列に文字列をアクティブに加えたりすることのできるメソッドです。


StringBufferを使うにはインスタンスを生成しなければなりません。


インスタンスとは、クラスをデータ型とした変数のことを言います。


今まで、クラスのメソッドを違うクラスのメソッドで呼び出して使ってきましたが、これは使っていたメソッドを全部staticで宣言していたからできたのです。
staticで宣言されたメソッドは、インスタンスを生成しなくてもそのまま使用することができます。
しかし、他のクラスからメソッドを使用し、かつ変数の書き換えなどを行うにはstaticを宣言できません。
staticを宣言すると他のクラスからの書き換えができなくなるからです。


そこで、staticを宣言していないメソッドでは、インスタンスを生成する必要があります。
これは、メソッドだけではなくフィールドにも同じことが言えます。


メモ帳を開いて次のプログラムを作ってみましょう。


BufferTest.java 直

public class BufferTest {

	public static void main( String[] args ) {

		int x = 0;
		StringBuffer sb = new StringBuffer( "0" );

		add( x );
		System.out.println( x );

		add( sb );
		System.out.println( sb );
	}

	public static void add( int x ) {
		x = x + 1;
	}

	public static void add( StringBuffer sb ) {
		sb.append( "1" );
	}
}



staticを宣言したフィールドやメソッドを静的フィールド、静的メソッドといい、staticを宣言していないのを動的フィールド、動的メソッドと言います。


StringBufferはjavaのパッケージに含まれているものです。


パッケージにはプロトタイプというのが決められています。
「使いたいメソッドがstaticなのかどうか」などが書いてあります。


では、インスタンスを生成するにはどの様にしたらよいのでしょうか?


StringBuffer sb = new StringBuffer( "0" );
このようにnew演算子を使用します。


メソッド名 インスタンス名 = new メソッド名("文字列");
これで、インスタンスの生成ができました。


ここでStringBufferのことをメソッドと言いましたが、正確にはコンストラクタと呼ばれるものなのです。
書き換えると次のようになります。


コンストラクタ名 インスタンス名 = new コンストラクタ名("文字列");


コンストラクタとは、インスタンスを初期化する機能を提供するメソッドです。


コンストラクタの名前は、クラスと同じにする約束になっています。
StringBufferクラスのコンストラクタは、StringBuuferという名前のメソッドです。


StringBufferクラスには、コンストラクタが3つあります。


プロトタイプ機能
StringBuffer()16文字サイズのからの文字列の入れ物を確保する。
StringBuffer( int length )lengthで指定されたサイズのからの文字列の入れ物を確保する。
StringBuffer( String str )strという文字列の格納された文字列の入れ物を確保する。


今回は、一番下のStringBuffer( String str )のコンストラクタを使っているわけです。
StringBufferクラスだけではなく、javaのクラスライブラリが提供するクラスの中には、インスタンスを宣言するときにコンストラクタで初期値を代入するものが数多くあります。


コンストラクタは、初期値を決めるメソッドです。
自分の目的に合わせて使うことができるようになっています。
プロトタイプや機能を見て、自分が使いたいものを探していきます。


StringBufferクラスには他にも、appendメソッドやinsertメソッドがあります。


appendメソッドには文字列の入れ物に文字列を追加する機能があります。
insertメソッドは、文字列を挿入する機能があります。


このメソッドを使うには、次のようにします。


インスタンス名.append("文字列");


今回は、str.append("文字列");です。


str.insert(何文字目に挿入するか, "文字列");
str.insert(3, "文字列");


プロトタイプはこのようになっています。
StringBuffer append(String str)


インスタンスを作成して、「インスタンス名.append("文字列")」として使ってください。


最後に、作成したインスタンスをメソッドで引数に使う場合を説明します。

public static void add( StringBuffer sb )

このように、作成したインスタンスの型というのはコンストラクタ名になります。
(コンストラクタ名 インスタンス名)として使ってください。


出力結果です。





メモ帳を開いて次のプログラムを作ってみましょう。


BufferTest2.java 直

public class BufferTest2 {

	public static void main( String[] args ) {

		int x = 0;
		StringBuffer sb = new StringBuffer( "0" );
		
		x = x + 1;
		System.out.println( x );

		sb.append( "1" );
		System.out.println( sb );

		add( x );
		System.out.println( x );

		add( sb );
		System.out.println( sb );
	}

	public static void add( int x ) {
		x = x + 1;
	}

	public static void add( StringBuffer sb ) {
		sb.append( "1" );
	}
}



どのような記述でどの様な処理になるのかというのを理解しておいてください。


出力結果です。





メモ帳を開いて次のプログラムを作ってみましょう。


BufferTest3.java 直

public class BufferTest3 {

	public static void main( String[] args ) {

		StringBuffer sb = new StringBuffer();

		System.out.println( sb );
		System.out.println( "大きさ:" + sb.length() );
		System.out.println( "容量:" + sb.capacity() );
		System.out.println("");


		sb.append( "0123456789" );
		System.out.println( sb );
                System.out.println( "大きさ:" + sb.length() );
                System.out.println( "容量:" + sb.capacity() );
		System.out.println("");

		sb.insert( 0, "abcdefg" );
		System.out.println( sb );
                System.out.println( "大きさ:" + sb.length() );
                System.out.println( "容量:" + sb.capacity() );
		System.out.println("");

		sb.insert( 7, "hijklmnopqrstuvwxyz" );
		System.out.println( sb );
                System.out.println( "大きさ" + sb.length() );
                System.out.println( "容量" + sb.capacity() );
		System.out.println("");

		sb.delete( 26, 36 );
		System.out.println( sb );
                System.out.println( "大きさ:" + sb.length() );
                System.out.println( "容量" + sb.capacity() );
		System.out.println("");
	}
}



sb.delete( 26, 36 );
これは、26文字目から36文字目までの間を消すメソッドです。
しかし、一度増えた容量は減っていません。
文字を足しただけ容量は増え続けます。


出力結果を見てみましょう。





<<前  [TOP]  次>>