初心者のプログラミングレベルを見分ける簡単な問題
久しぶりの日記なので、ちょっとゆるめの話を。 「プログラミング初心者」のレベルを簡単に判定するための問題を考えてみた。
それぞれの場合に、どのような文字が出力されるのかを考えてもらう。 引っかけ問題ではないので、素直に答えてもらえばOK。 言語はJavaで、クラスの宣言などは省略している。
/** * int型の場合 */ public static void func1() { int a = 1; int b = a; b = 2; System.out.println(a); b = 3; System.out.println(a); }
/** * StringBuffer型の場合 */ public static void func2() { StringBuffer a = new StringBuffer("1"); StringBuffer b = a; b.replace(0, 1, "2"); // "1"を"2"に置き換える System.out.println(a); b = new StringBuffer("3"); System.out.println(a); }
C だとポインタの概念が分かってるかどうかが一つのポイントだけど、これはその Java 版といったところ。 これに答えられれば、「=」と「.」の違いや new の意味が分かってきて、変なところで悩むことがずっと減ってくる。
変数とオブジェクトの話
最初によく教わるような、「変数という箱に値が入っている」モデルで考えると、
StringBuffer b = a;
で a に入っている "1" が b にコピーされて2つの "1" ができるように思えちゃう。
そうじゃなくて、変数とは違う場所に StringBuffer 型のオブジェクトが作られると考えればスッキリする。 オブジェクトがそのまま箱に入らない理由は、 int や double のようなシンプルでサイズが決まっているデータと違って、文字列などのオブジェクトは大きくてサイズもまちまちだから。
new StringBuffer("1");
でオブジェクトが作られて、
a = new StringBuffer("1");
で a がそのオブジェクトを指すようにすると。 そうすれば、
b = a;
は a と同じ場所を指しなさいと b に指示していると考えればいい。
最初はちょっとややこしいけど、
- 「=」は変数の指す場所を決めている(オブジェクトの中身は決して変わらない)
- 「.」は変数が指している先のオブジェクトに何かを命令している(オブジェクトの中身が変わることがある)
と考えられると楽なんだよなぁ。