メソッド (2)

前回のまとめ等

  • メソッド
    • 教科書P.74
    • メソッドとは?Cにおける関数と大体同じ。
    • メソッドは、クラスの中に定義される。
    • メソッドの定義には「public」をつける(今のところ、本講義では)
    • Cとの違い: メソッドは、同じクラスのフィールドを使うことができる。
    • trivia: 教科書に「return (x);とも書きます。」とあるが、今時、カッコはつけない(つけるべきではない)ので、当該箇所は無視すること。詳しくは「c言語 return カッコ」等で検索。
  • クラスの概念(教科書P.68)
    • フィールドとメソッドのことを「メンバー」という。
    • クラスはメンバーのみで構成される(メンバー以外の構成要素はない)。
    • クラスは設計図。利用するときはインスタンス(実体、オブジェクト)を作成する。
  • クラスの定義(書式)
    • クラス名は大文字から始める。
    • ファイル名は「クラス名.java」にする(基本的に1クラス1ファイル)。
    • フィールド2つ、メソッド1つ(引数が2つの場合)のクラスの例:

もっとメソッドを定義してみよう

Personクラスのポイント

  • 「/**」から始まるコメントはJavaDocというソースコード中にコードの説明を書いて後から簡単に参照する仕組み。IntelliJ IDEAではカーソルを合わせてF1キーを押すと参照できる。
  • setメソッド(23-29行目)
    • フィールド名と引数名が同じ場合は、どのように扱われるか?メソッド本体では、引数の方が優先されて使われる。メソッド本体でフィールドを参照したい場合は「this.フィールド名」とする(教科書P.110)。
    • メソッドを介してフィールドの値をセットしている。なぜわざわざメソッドを介してセットするのか考えてみよう。
  • getStatusメソッド(35-49行目): 特筆する点無し。
  • getBmiCategoryメソッド(55-64行目)
    • 同じクラス内のメソッドを呼び出すことができる(教科書P.76)
  • getBmiAfterDieting(55-64行目)
    • 引数有りのメソッド

メソッド (1)

前回のまとめ等

  • 変数・演算子・制御文はCとだいたい同じだが、Cにはなかった型としてbooleanとStringがある。比較演算子等がbooleanを返すことに注意。
  • パッケージ(教科書P.164〜)
    • クラスをひとまとめにしたもの
    • パッケージが違えば名前のクラスでも同時に存在できる
    • パッケージに所属した状態とは?: 1) パッケージを表すディレクトリ(フォルダの中にソースコードが入っている)、2) ソースコードにパッケージ宣言が書かれている
  • クラスとは(前回までの説明。クラスの説明の全てではないことに注意すること)
    • データと処理をまとめたもの(教科書P.68)
    • 既存の型を組み合わせて、「新しい型」を作る仕組み
    • 構造体に関数がついたもの(C言語がきちんとわかっている人向けの説明)
  • 前回作ったクラスについて
    • 既存の型(int型)を組み合わせて、新しい型を作った。
    • クラスの中で定義される変数のことを「フィールド」という(教科書P.72)。
    • クラスの定義とその中のフィールドの定義には「public」をつける(今のところ、本講義では)。
    • クラスは「設計図」といえる。実際に使うには、「実体」を作る必要がある。実体のことを「インスタンス」という(教科書では「オブジェクト」と呼んでいる)。
    • インスタンス化(インスタンスを作ること)にはnew演算子を使う(教科書P.70,71)。
    • インスタンスのフィールドにアクセスするには「.」を使う(例えば、以下はフィールドに代入する場合)。

復習

  1. パッケージ「d00000.lecture05」を作る。
  2. d00000.lecture05に、前回と同様にPersonクラスを作る。
  3. さらに次のフィールドを追加する。
    • 名前を表すnameフィールド
    • 年齢を表すageフィールド
    • 運転免許証の有無を表すhasDriverLicenseフィールド

クラスにメソッドを追加する

  • 教科書P.74
  • メソッドとは?Cにおける関数と大体同じ。
  • メソッドは、クラスの中に定義される。
  • Cとの違い: メソッドは、同じクラスのフィールドを使うことができる。
  • メソッドの定義には「public」をつける(今のところ、本講義では)
  • フィールドとメソッドのことを「メンバー」という。
  • trivia: 教科書に「return (x);とも書きます。」とあるが、今時、カッコはつけない(つけるべきではない)ので、当該箇所は無視すること。詳しくは「c言語 return カッコ」等で検索。

フィールド2つ、メソッド1つ(引数が2つの場合)のクラスの例:

PersonにBMIを計算するメソッドを付け加えてみよう。

ポイント:

  • BMIの計算には2つの値(身長と体重)が必要。Cの場合は関数の引数としたが、Personクラスにメソッドを記述する場合、フィールドの値を使えば良い(使うべき)なので、引数無しになる。

Javaにおける変数・演算子・制御文とクラス

IntelliJ IDEAでJavaのプログラム作成して実行するための基礎知識

  • 本講義では最初から「パッケージ(教科書P.164)」を用いる。同じクラス名であってもパッケージが違えば区別できる。
  • 「src」を右クリック→New→Package→「d00000.lecture04」と入力(d00000はユーザ名)しOKをクリック
  • Print.java(教科書P.4)をIntelliJで作成して実行しよう。
  • 対象のパッケージを右クリック→New→Java Class
  • mainメソッドの中身を追記する。
  • IntelliJで作成したPrint.java
  • 教科書との違い
    • 1行目: package宣言がある。
    • 3行目: classの前にpublicが付いている。
  • ポイント
    • Cの場合はmain関数から実行が開始されるが、Javaの場合はクラスの中に定義されたmainメソッドが実行の起点となる。
    • mainメソッドの定義には「public static」がつく。とりあえずつけておく(今後、解説)。

IntelliJ IDEAでよく使う機能(使って欲しい機能)

  • Rerformat Code(インデントを整える等、ソースースコードを綺麗に整形する): Alt + Ctrl + L
  • Rename(変数やメソッド等の名前を変更する):対象にカーソルがある状態でShift + F6

Android StudioはIntelliJ IDEAがベースであり、操作方法はほぼ同じなので参考になる。

変数・演算子・制御文

変数・演算子・制御文について、C言語との違いを中心に。詳しくは教科書を参照すること。

注: 「だいたい同じ」とは「(些細な)違いがある」ということなので全く同じと思わないこと。

実際に実行してみるとわかりやすい。確認用のクラス(例えばSandbox.javaのように)を作って確かめながら進めよう。

変数(教科書P.8〜)

数値(教科書P.10)

C言語において、数値を格納する変数の型はint、long、float、double。Java言語でもだいたい同じ。

文字(教科書P.12)

C言語で文字はchar型を使う。文字をシングルクォーテーションで囲むことによって文字を表現する。

これで、変数vには文字「a」が代入される(正確には文字「a」の文字コードである97が代入される。つまりcharは整数型)。

Java言語でもだいたい同じ。

文字列(教科書P.13)

C言語ではchar型の配列として扱う。

Java言語ではString型を使う。

「+」で連結することができる(教科書P.13)。

boolean型(教科書P.34)

C言語では、真偽を表すのにint型を使い、真が0以外、偽が0としてきた。

例えば、

とした場合、aには0が格納される。

Java言語には真偽を表すboolean型(論理型)がある。boolean型は値としてtrue(真)かfalse(偽)をとる。比較演算子や論理演算子はboolean型を返す演算子ということに注意する(演算子については後述)。

論理演算はC言語と同じ。

型の種類

Java言語の型は、大きく2種類に分類される。

  • プリミティブ型
  • 参照型(クラス型)

ここまで紹介した型のうち、String型が参照型で、それ以外はプリミティブ型。とりあえず、ここでは「2つの種類がある(違いがある)」ということを覚えておくこと。

変数の宣言

C言語では変数の宣言は関数の最初で行う(最近のC言語ではそうでもない)。Javaでは関数(メソッド)の最初じゃなくても良い。

演算子(教科書P.25〜)

演算子とは「演算を表わす記号」のこと。

C言語とだいたい同じ。

演算子によって、被演算子(演算が作用する対象)として使える型が違うことに注意すること。

  • 算術演算子
  • 代入演算子
  • インクリメント演算子、デクリメント演算子
  • 比較演算子
  • 条件演算子
  • 論理演算子
  • キャスト演算子
  • ビット演算子

どんな演算が行われているか?演算の結果がどうなるか?を理解しよう。

制御文

Java言語の制御文は条件の判定にboolean型を使う(C言語は0かそれ以外かを判定する)。これ以外はC言語とだいたい同じ。

制御文の記述に関する注意: かっこは省略するな!ただ「省略できる」ということは知っていなければならない。

  • if else
  • for
  • while
  • break
  • continue
  • switch

クラス

  • データと処理をまとめたもの(教科書)
  • 構造体に関数がついたもの(C言語がきちんとわかっている人向けの説明)
  • 型の定義
  • etc..

とりあえず、現段階では「変数と関数をまとめたもの」と考えよう。とりあえず、変数だけをまとめた場合(変数だけをまとめた型、つまりCにおける構造体とほぼ同様)を考えよう。例として「BMIを計算するプログラム」を作成する。

参考: BMIと適正体重

クラスを使わない場合

比較のため、まずは(mainメソッドが含まれるクラス以外の)クラスを作成しない場合を考えてみよう。

2人分のデータを扱うために、double型の変数を4つ作成している。

CalcBmi1

身長と体重をフィールドとして持つPersonクラス

次にデータを身長と体重をまとめて扱うためのPersonクラスを作成し、それを用いてBMIを計算してみよう。

ポイント

  • Personクラスではクラスに所属するフィールドを2つ定義している。
  • mainメソッドでは、Personクラスののインスタンスを生成し、インスタンスのフィールドに値を代入している。

Personというクラスを作ることによって、Personという型を使えるようになったと考えよう。Person型は、これまで使ってきた型(intやdouble等のプリミティブ型)と違い、値を1つだけ格納するのではなく複数の値を格納することができる。

CalcBmi2

何が嬉しいのか?これまでは関連するデータであっても別の変数で管理するしかなかった(あるいは、変数名で工夫するか、配列にするか)が、クラス(=新しい型)を定義することによって、関連するデータをまとめて扱えるようになる。

クラスにフィールドを追加しよう

次のフィールドを(定義に)追加してみよう。型は(指定がない場合は)適切なものを考えよう。課題ではないが、次回講義で実装例を紹介するので、取り組んでおくこと。

  • 名前を表すnameフィールド
  • 年齢を表すageフィールド
  • 運転免許証の有無を表すhasDriverLicenseフィールド

学生に伝えたいツイート

Spring Bootでチャートを生成・表示する

チャートを生成・表示する

ソースコード

変更(追加)

新規作成

実行例

chart

ポイント

  • チャート描画はJavaScriptで行うのが一般的だが、ここではJFreeChartを用いてサーバーサイドで生成している。
  • 画像ファイルを生成するのではなく、data URIで画像データを表示している。

Spring Bootで日付を扱う(フォームから日付を入力する)

日付を扱う

ソースコード

新規作成

ポイント

  • Javaにおいて日付の扱いは1)従来からあるDateクラスを使う方法と、2)Time APIを使う方法がある。教科書でどちらも詳しく解説されている。
  • inputタグのtypeとして、dateやdatetime-localが使える。他にもmonth等がある。
  • ThymeleafではDateに対するユーティリティーメソッドがある。

関連文書

変数の値とアドレス

前回のまとめ等

  • 配列
    • 同一型の複数のデータで、各データを添字によって区別する
    • 添字は0から始まる整数
  • 課題の解答例

課題の回答状況

  • ◯ コンパイルできるソースコードを提出している。
  • × 関数の定義の形が理解できていない。例: fizzbuzzの戻り値の型をintにしている、あるいは指定していない。
  • × 演算子を正しく理解していない。例: for文で i=i++
  • × 関数の使い方を理解していない。例: printf(“FizzBuzz “,i);

C言語における変数の値とアドレス、代入という操作について

変数の値とアドレスについて

  • 変数は値を入れておく箱のようなもの。箱の名前のことを「変数名」という。
  • 変数の値はコンピューターのメモリのどこかにに保存される。
  • 「どこか」を知りたい場合、アドレス演算子を使うと取り出すことができる。
  • 「アドレスを保存するための変数」があり、それを「ポインタ変数」という(教科書P.106、重要ポイント及び表7.1)。

この辺りをしっかり理解しておくと、Javaを勉強するときに役立つ。

代入という演算について

  • 「a = b」はbの値をコピーしてaの値にするという操作
  • 「func(a)」とした場合、aの値をコピーして関数にわたされる

値とアドレスとポインタに関するサンプルプログラム

address.c

実行して結果を確かめよう。

ポイント:

  • b: aを変更してもbの値は変わらない。
  • *c: aと同じアドレスなので、aを変更すれば*cも変わる(変わるというかaの別名が*cと言っても良い)。
  • 関数の引数は、値のコピー。

配列を引数とする関数

array.c

実行して結果を確かめよう。

ポイント:

  • 値がコピーされた新しい配列が作られるわけではない。
  • 先頭アドレスがコピーされる。
  • 値がコピーされた新しい配列が欲しい場合は、関数ないで配列を宣言し値をコピーする。

変数の入れ替え

次の実行例と同じになるように、変数の値を入れ替えるプログラムを完成させよう。

元のプログラム: swap.c

Spring Bootでメール送信を行う

メール送信

ソースコード

Gmailを使う場合の例。

変更(追加)

新規作成

関連文書

Spring Bootでユーザ認証を行う

ユーザ認証

ソースコード

変更(追加)

  • build.grade: spring-boot-starter-securityをdependenciesに追加

新規作成

関連文書

昨年度の資料はバージョンが古いので注意する必要があるが、参考になるはず。

大量のデータを扱えますか?

前回のまとめ等

  • 関数
    • 関数を定義するときの書式と意味をきちんと理解する
    • 戻り値(返り値)の型、関数名、引数(仮引数の型と引数名)、関数の本体(処理内容)
  • 前回、説明を省略したもの(そのうち説明する)
    • プロトタイプ宣言
    • 値渡しと参照渡し
    • 再帰呼び出し
    • etc…
  • 課題の解答例

配列を使おう

実行例と同じになるようにプログラムを修正(関数を追加するだけで、元のコードは変更しない)して実行しよう。

BMI算出

元のプログラム: bmi.c

BMIの計算は用意されている関数(calc_bmi)を使う。

三目並べ

三目並べを作ろう。石を同じところに置いた場合のチェックや入力間違いのチェックはしなくてよい。

元のプログラム: tictactoe.c

物足りない人へ

ライフゲームを作ろう。

さらに物足りない人はLangton’s loopsを作ろう。さらに物足りない人はEvoloopを作ろう。