初心者のJavaプログラミング

プログラミングガチ初心者がIT業界を目指して頑張ります。

お盆で福島に帰ってました。
なかなか更新できなくてすみませんです。

青森にいったりしてました。
東北は寒いですねw
冷房いらずです。

そうだ。
ももがめっちゃ安かったんです。
ちょっと訳ありの桃で、収穫する時に傷がついちゃったやつの詰め合わせ何ですが、
20個で1000円ですかね。
20個で500円とかもありましたけどw
農協すごいですw

画像はとりあえずツイッターの方にあげました。


明日帰る予定です。
ではでは!

コンピテンシー採用ってオブジェクト指向っぽい?

コンピテンシー面接とかはやってますよね。

オブジェクト指向を勉強していてちょっと思ったことを書こうかなと。

思ったこと。
コンピテンシー採用ってオブジェクト指向なんじゃね!?」

そもそもコンピテンシー採用というのは、就活生が社内で優秀な成績をあげている人と同じようなバックグラウンドを持っていれば、入社後も優秀になると考えのもと行っていると思うんです。
社内の優秀な人のバックグラウンドや思考、性格等を「属性」とします。その属性を持っているような就活生が欲しいってことですよね。

営業の場合で考えてみます。まず、優秀な社員オブジェクトA, B, Cがいるとします。企業は、そのオブジェクトから要素を抽出していく感じで優秀な営業マンクラスを作っているのではないかと考えます。
ひな形であるクラスからオブジェクトを生成するのではなく、その逆をしているのではと思いました。
そこで、仮にできた優秀な営業マンクラスの条件(属性)に合うような人材がピンポイントで採用したい人材というように社内で決めておけば、採用に面接官の主観が入りにくくなり、当初予定していた優秀になり得る人材の採用が可能になるのではないかと考えました。

私が就活していたときも、コンピテンシー面接だーとかいっている某生命保険会社の人事の人がいました。その方は、コンピテンシー採用イコール根掘り葉掘り聞くこと、という風にしかとらえてませんでしたが、本当はこんな意味があったんじゃないかと、勉強していて思いました。

最初は、オブジェクト指向?なんかのオブジェなん?美術?きも。
という意味不明な先入観がありましたが、オブジェクト指向の世界観というか概念みたいなものを勉強していくうちに、
かなり自然な考え方だと思えるようになってきました。

デスクトップ上にあるWordのアイコンを右クリックすれば、Wordアプリケーションに対する「操作」が出来る訳です。Wordクラスの「開く」操作をすれば画面上に編集画面が表示される。おれが、Wordクラスに対して、「開く」操作をした(openみたいなメソッドが走った)ってことでしょー!めっちゃオブジェクト指向な感じじゃーん!
とこのように、今日はニヤニヤしながら勉強してました。

ただ、やっぱり目に見えないものをクラスにするという抽象的思考がまだ慣れていないせいか、制御クラスとかそこらへんはまだ理解が浅いです。
でも、あんまり難しく考えすぎなければいけそうな気がしてきました。気がしているだけかもしれませんがw

あんまり身になる話じゃなかったですが、ふと思ったことを書きなぐってみました。

【第18回】初心者のJavaプログラミング【引数】

こんにちは。
オブジェクト指向というものをちゃんと理解して設計したいので、
先生にお勧めされた本を読んでおります。
結構ヘビーですが頑張りますぜ。

てか、昨日今日と結構たくさんの人(私にとってはたくさんの人)がブログを見に来ていただいてたみたいです。
ありがたい限りです!
これからもよろしくお願いします。

今日はメソッドコンストラクタに渡される引数についてです。
理解するには基本データ型の変数と参照型変数(配列変数やオブジェクト変数)の違いをきちんと知っている必要があります。

基本データ型変数の場合

メソッドには引数のコピーが渡されます。
コピーなので、いくら値を変更してもオリジナルの値には全く変化しません。
いまいち分からない場合は、普通にコピーと考えたら理解できると思います。
f:id:fightingneetkun:20140808170506p:plain

参照型変数の場合

配列変数やオブジェクトは参照型(ポインタ)であると前にやりました。
なので基本データ型変数とは違います。
ややこしやーなのですが、参照のコピーが渡されます。
つまり配列変数やオブジェクトが元々指しているメモリ上のアドレスが渡されることになります。
だから参照先を変えることをしてしまうと、元々入っていた値も変わってしまいます。

考えたら当たり前のことなのですが、混乱しそうだと思ったのでメモ書きしてみました。

今日はこのくらいしか書くネタはなかったので以上ですw

ではよい週末を~。
トランスフォーマーみたいぜー!

【第17回】初心者のJavaプログラミング【インスタンス変数•メソッド,静的変数•メソッド】

こんにちは。
なんで渋谷にいるティッシュ配りの人って、上から目線でティッシュ渡してくるんでしょうね。ティッシュ渡してやってんだから受け取れよくらいの勢いで渡してきますよね。

さて、今日はインスタンス変数とインスタンスメソッド、静的変数、静的メソッドについててです。

インスタンス変数、メソッド

インスタンスメソッドですが、既存のクラス、例えばStringクラスにあるインスタンスメソッドとかの使い方と同じです。クラスから生成したオブジェクトが使えるメソッドのことをインスタンスメソッドと言います。

クラスから生成されたオブジェクトには、そのクラスで定義されたインスタンス変数のコピーが含まれています。実際にクラスの方で具体的な値が決められていればその値をオブジェクトも持つことになります。
クラス定義の段階で具体的な値を決めていなければ、デフォルトの値で初期化されます。

  • boolean型変数はfalse
  • intやdouble等数値型の変数は0
  • 参照型変数(配列変数やオブジェクト変数等)はnull

というようになっています。

言葉で説明してもイミフだと思うので、
まず具体例から。

class Circle {
	// インスタンス変数を宣言
	double x;  //< 中心のx座標
	double y;  //< 中心のy座標
	double r;  //< 半径
	// コンストラクタ
	Circle (double x, double y, double r) {
		this.x = x;
		this.y = y;
		this.r = r;
	}
}

class CircleTest {
	public static void main( String args[] ) {
		Circle c = new Circle(5, 6, 10);
		// 表示
		System.out.println(c.x);
		System.out.println(c.y);
		System.out.println(c.r);
	}
}

ターミナルには
5
6
10
と表示されると思います。
これは前回前々回説明した通りです。

ここで、中心座標を動かす(中心座標の位置を変更する)機能が欲しいなーと思ったとします。
機能といったらメソッドなので、メソッドを作ってみましょう。

メソッドの作り方は、

戻り値の型 メソッド名(引数) {
  処理したい内容
}

というように作ります。

では、中心座標を変更するメソッドを作ってみます。

// インスタンスメソッド
void changePoint(double x, double y) {
	this.x = x;
	this.y = y;
}

こんな感じでしょうか。絶望的にメソッド名のセンスがありませんが、そこは気にせずw
これが、メソッドの内容を書いた側ですね。

実際にこのメソッドを呼び出すのはこんな形になります。

// changePointメソッドを呼び出す
c.changePoint(3, 3);

この一文を日本語になおしてみましょう。
昨日結構やりましたねw

「cインスタンスさん、changePointメソッドを実行して下さい。情報として変更後のx座標とy座標をあげます。」

という意味です。だいたいですw

そんでメソッドが走り、cインスタンスの状態である中心座標は(5, 6)から(3, 3)に変更されます。
半径の大きさは変更してないので生成時と変わらず10のままです。

半径も変える機能あったら便利だなーって思ったら作ればいいのです。

void changeRadius(double r) {
  this.r = r;
}

こんな感じですかね。


ちなみに今更ですが引数の変数名は何でもいいです。
今は半径の値を変えるし分かりやすいからrにしているだけです。
例えばこんな感じでもいいです。

void changeRadius(double batman) {
  this.r = batman;
}

でもやっぱりインスタンス変数の値を変更したいようなときだったら、分かりやす変数名がいいと思います。

インスタンス変数、インスタンスメソッドはこのくらいですね。

静的変数、静的メソッド

静的変数はインスタンス変数と違い、クラスそのものに結びついている変数です。
つまり、そのクラスから出来た全てのオブジェクトに共有されます。

メソッドの使い方はこんな感じでクラス名のあとにドット、そして静的メソッドというようになります。

Integer.valueOf();
と同じ感覚です。

そしてインスタンス変数とインスタンスメソッドとの一番の違いは、
先頭に
static
という修飾子を付けるということです。

static double menseki;
static void changePoint() {
}

こんな感じですね。

だいたい使い方は同じなので具体的なコードは省略します。


今日は以上です。
毎回2000文字くらい書いてるな、文字書くのなんて苦手中の苦手だったのに。
かわるもんですな。
だんだん書くスピードを早くしていきたいですね。

次回はメソッドオーバーロードについて書く予定です。

ではでは。

【第16回】初心者のJavaプログラミング【this】

こんばんは。
2連投です。
今回はthisキーワードについてです。

thisとはなんぞや

thisには2通りの使い方があります。
とりあえず教科書通りの説明を書きます。
「thisは実行中のオブジェクトを指します。」
もう一つの使い方。
コンストラクタから同じクラスの別のコンストラクタを呼び出すために使う」
分かりそうでわからない。
まずは一つ目の説明から。

thisは実行中のオブジェクトを指す

具体的なコードを見ます。

class Car {
	// インスタンス変数
	String carType;
	String color;
	int    size;

	// コンストラクタ1
	Car(String carType, String color, int size) {
	  this.carType = carType;
	  this.color = color;
	  this.size = size;
	}
}

class CarTest {
	public static void main( String args[] ) {
		// car2オブジェクトをコンストラクタ1を使って生成
		Car car = new Car("セダン", "シルバー", 12);
		System.out.println(car.carType);
		System.out.println(car.color);
		System.out.println(car.size);
	}
}

コンストラクタ1のところでthisキーワードが出てきていますね。
説明するのが難しい...
まず、CarTestクラス内の
Car car = new Car("セダン", "シルバー", 12);
の説明から。前回もやりましたが、この一文は、
「Carクラス(型)の参照型変数であるcarオブジェクトを宣言します。carオブジェクトをCar("セダン", "シルバー", 12)で初期化して、newで実際にメモリ領域にcarオブジェクトを確保します。」
という意味です。
もっと細かく。
Car("セダン", "シルバー", 12)の意味は、
「CarクラスにあるCarコンストラクタさん。"セダン", "シルバー", 12という情報をあげますから、それを元に初期化してくれ!」
という意味になります。
そうするとその情報を受け取ったCarクラスのCar(String carType, String color, int size)コンストラクタさんが反応します。
与えられた情報の順番、型ともに間違い無し。よしおれの出番か、という風にコンストラクタさんのテンションが上がります。
そして与えられた情報を元にこんな処理をコンストラクタさんはしてますね。

this.carType = carType;
this.color = color;
this.size = size;

やっとthisの登場です。
thisは実行中のオブジェクトをさすのでしたね。
となるとこの場合は今carオブジェクトの初期化の処理で飛んできたので、このthisはcarオブジェクトのことを指します。
なのでこの場合の、
this.carType = carType;
という文の意味は
「carオブジェクトの状態(変数)に、与えられた情報"セダン"を代入します」
ということになります。
以下の2文も同じ意味になります。

どうでしょう。わかりましたでしょうか。
すみませんが、これが僕の説明力の限界ですw
一応絵ものせときますw
f:id:fightingneetkun:20140806205702p:plain
わかりづらいw

コンストラクタ内でのthis

Carクラス内が以下のような感じだったとします。

class Car {
	// インスタンス変数
	String carType;
	String color;
	int    size;

	// コンストラクタ1
	Car(String carType, String color, int size) {
	 	this.carType = carType;
	 	this.color = color;
	 	this.size = size;
	}
	// コンストラクタ2
	Car(String carType, String color) {
	 	this.carType = carType;
	 	this.color = color;
	 	this.size = 15;
	}
	// コンストラクタ3
	Car(String carType){
		this.carType = carType;
		this.color = "青";
		this.size = 10;
	}
}

この表記の仕方を簡単にするのが第2のthisの使い方です。
簡単にすると以下のようになります。

class Car {
	// インスタンス変数
	String carType;
	String color;
	int    size;

	// コンストラクタ1
	Car(String carType, String color, int size) {
	 	this.carType = carType;
	 	this.color = color;
	 	this.size = size;
	}
	// コンストラクタ2
	Car(String carType, String color) {
	 	this(carType, color, 12);
	}
	// コンストラクタ3
	Car(String carType){
		this(carType, "青", 10);
	}
}

なんとも簡潔になりましたね。
動きを説明していきます。

じゃあまず、コンストラクタ2を呼ばれた時のことを考えてみましょう。
コンストラクタ2は引数を2つ受け取るバージョンのコンストラクタですね。
情報を受け取ったら、
this(carType, color, 12)
という処理が走りますね。
このthisは何を指すかというと、引数を3つもち、かつ1つ目の引数がString型、2つ目の引数がString型、3つ目の引数がint型、であるCarクラス内のコンストラクタのことを指します。
そんな都合のいいコンストラクタなんてあるのかよ...
アルンデス!

まあ勝手にあるというか、ちゃんと定義したんですけどねw
そうですコンストラクタ1のことです。
こいつの処理に飛ぶんですね。
だから受け取った情報をコンストラクタ2が処理しないで、コンストラクタ1にまわして処理させるんですね。
なんとなく分かっていただけたら幸いですw

ではそもそもなんでこんなことをするのでしょうか。
確かに最初の方法は冗長ですが、分かりやすいし、わざわざコンストラクタ同士情報で情報を渡し合わない方が処理が早くなりそうだし、そもそも2度手間なのではと思いませんか。
私はそう思ったのでテンテーに質問しました。

回答はこんな感じです。
コンストラクタ1が色々テスト済みで完璧に動くと仮定します。
そうなったときに、また別のコンストラクタを定義していくという作業は、バグが発生しやすく、あまり良い方法ではないので、完璧に動作するコンストラクタ1の方に処理を投げるのが合理的なのだそうです。


thisの説明はこんな感じです。

よし、とりあえず今日はこの辺で終わります。
2つ記事を書くのは結構しんどかったですw

参考書

独習Java 第4版

独習Java 第4版

【第15回】初心者のJavaプログラミング【クラスの作成,コンストラクタ】

こんばんは。
昨日書けなかったので、今日はちゃんと書きます。
今まで何気なく使っていたクラスについて書いていきます。
長くなるかもしれませんが、良かったら見ていって下さい。

クラスの基本

クラスの要素としては、状態を表す変数、動作や機能を表すメソッド、あとコンストラクタといわれるものの3種類があります。
以前に書いた通り、変数には静的変数とインスタンス変数の2種類があります。同じくメソッドも静的メソッドインスタンスメソッドの2種類があります。
この2つは以前でてきたので聞いたことがあるとは思いますが、コンストラクタは初めてですよね。
コンストラクタとは、メソッドの仲間なのですが、かなり特殊なメソッドで、インスタンスを生成するときに使います。

以下がインスタンス変数、インスタンスメソッドコンストラクタの書き方です。

class クラス名 {
  // インスタンス変数
  型 変数名;
  型 変数名;
  // コンストラクタ
  クラス名(引数) {
    コンストラクタの中身
  }
  // メソッド
  戻り値型 メソッド名(引数) {
    メソッドの中身
  }
}

インスタンス変数の宣言はそんなに今まで通りです。
コンストラクタですが、コンストラクタはクラス名と同じになります。

具体的な例を一つあげます。

class Car {
  // インスタンス変数
  String carType;
  String bodyColor;
  int    size;
  // コンストラクタ
  Car(){}
}

class CarTest {
  public static void main( String args[] ) {
    // Carクラスの変数にCarクラスから生成したオブジェクトを入れる。
    // (carオブジェクトは参照型変数なので、正確にはオブジェクトのアドレスが代入される)
    // Car()コンストラクタを使って初期化している。
    Car car = new Car();
    // 生成されたオブジェクトを形作るため、値を代入していく。
    car.carType = "スポーツタイプ";
    car.bodyColor = "赤";
    car.size = 10;
    // 表示
    System.out.println(car.carType);
    System.out.println(car.bodyColor);
    System.out.println(car.size);
  }
}

Car car = new Car();
の一文ですが、これはどういったことを意味しているかというと、
「Carクラス(型)のcarという参照型変数を宣言します。コンストラクタCar()を使ってcarオブジェクトを初期化します。そして、new演算子を使ってcarオブジェクトをメモリ領域に確保します」
という意味です。
めちゃくちゃ細かく説明しましたが、これがすごく大事だと思います。
特にオブジェクト変数は参照型だということが重要な気がします。
コンストラクタを一応Car(){}というように書いていますが、これは必要ありません。
なくてもコンパイルも通るし、実行も出来ます。
なぜかというとJavaコンパイラが気を利かせてくれてコンストラクタを用意してくれるのです。
なんて賢いのでしょう。
コンストラクタを宣言、定義しなかった場合、Car(){}というようなコンストラクタがあるものとして勝手に用意してくれるのです。

コンストラクタを追加する

次にコンストラクタを追加してみましょう。

Car(String carType_, String color_, int size_) {
  carType = carType_;
  color = color_;
  size = size_;
}
Car(String carType_, String color_) {
  carType = carType_;
  color = color_;
  size = 15;
}

このようにコンストラクタに引数を与えていきます。
このようにコンストラクタを定義すると、コンパイラが自動的に作ってくれたとりあえずのコンストラクタCar(){}は使えなくなります。宣言すれば使えるようになるのですが、自動的にコンストラクタは作られなくなります。

ていうか、同じコンストラクタ名が2つありますがいいんでしょうか。
イインデス!

シグネチャが違えばいいのです。

シグネチャとはなんぞや。
シグネチャとはその名前とパラメータの型と引数の数を合わせたものです。
この場合ざっくり言うと、

この3つの要素が違っていればいいのです。
コンストラクタを使うとき、シグネチャにあったコンストラクタコンパイラさんが選んでくれて、それで初期化を行うのです。

このようにクラスには複数コンストラクタを用意することが出来ます。
この機能のことをオーバーロード(多重定義)と言います。

class Car {
	// インスタンス変数
	String carType;
	String color;
	int    size;

	// コンストラクタ1
	Car(String carType_, String color_, int size_) {
	    carType = carType_;
	    color = color_;
	    size = size_;
	}
	// コンストラクタ2
	Car(String carType_, String color_) {
	    carType = carType_;
	    color = color_;
	    size = 15;
	}
}

class CarTest {
	public static void main( String args[] ) {
		Car car = new Car();
		car.carType = "スポーツタイプ";
		car.color = "赤";
		car.size = 10;
		// 表示
		System.out.println(car.carType);
		System.out.println(car.color);
		System.out.println(car.size);
	}
}

実際のコードだとこんなです。
ちなみにこれをコンパイルするとエラーが出ます。

理由はCar(){}というコンストラクタはもはやJavaコンパイラは自動的に用意してくれないからです。
コンストラクタの所にCar(){}を追加してやると通ります。
こんな感じです。

class Car {
	// インスタンス変数
	String carType;
	String color;
	int    size;

	// コンストラクタ1
	Car(String carType_, String color_, int size_) {
	  carType = carType_;
	  color = color_;
	  size = size_;
	}
	// コンストラクタ2
	Car(String carType_, String color_) {
	  carType = carType_;
	  color = color_;
	  size = 15;
	}
	// コンストラクタ3
	Car(){}
}

class CarTest {
	public static void main( String args[] ) {
		// car1オブジェクトをコンストラクタ3を使って生成
		Car car1 = new Car();
		car1.carType = "スポーツタイプ";
		car1.color = "赤";
		car1.size = 10;
		System.out.println(car1.carType);
		System.out.println(car1.color);
		System.out.println(car1.size);

		// car2オブジェクトをコンストラクタ1を使って生成
		Car car2 = new Car("セダン", "シルバー", 12);
		System.out.println(car2.carType);
		System.out.println(car2.color);
		System.out.println(car2.size);

		// car2オブジェクトをコンストラクタ2を使って生成
		Car car3 = new Car("SUV", "黄色");
		System.out.println(car3.carType);
		System.out.println(car3.color);
		System.out.println(car3.size);
	}
}

コンストラクタだけでこんなに時間かかってしまった...
長くなりそうなので続きは次回です。

ジャヴァーーーーー

こんばんは。
アクセスしてくださっている方々ありがとうございます。
習ったことをアウトプットするためにやっているブログなので、文章が稚拙だったり、そもそも誤字脱字が多かったりすると思いますが、ちらっと見て行ってくれるとありがたいです。

今日はjavaの自作クラスの作成について書こうと思ってたのですが、
ちょっと諸事情があり明日書きます。
macのノートパソコンを自習室におきっぱにしていることを忘れていて、そのまま帰宅してしまったので家にwindowsのパソコンしかないのです。
頑張って書こうと思いましたが、macのショートカット操作である、
ctrl + f, b, p, n, h, d, e, a
が使えなくて、
スペースキーの横で英字、かな変換できない
状況です。
パソコンを破壊したい衝動に駆られ、このままでは破壊しかねないので今日はやめることにします。
ショーもない理由ですねw

でもこっちのノーパソのキーボートのほうがタッチした感じは好きです。mac book pro の retina を使っているのですが、どこどこした打ち心地であまり好きではありませんw



今日は盛りだくさんの内容でした。
クラスの作成、コンストラクタオーバーロードシグネチャ、静的変数、静的メソッドインスタンス変数、インスタンスメソッド、thisの使い方等...
かなり書くことが多いです。

明日頑張って書きます。