Skip to content

Latest commit

 

History

History
296 lines (261 loc) · 15 KB

File metadata and controls

296 lines (261 loc) · 15 KB

Java入門2(いろいろなデータ型、キャスト演算子、命名規則、基本ライブラリ、演算子、while文、ジャンプによる制御)

<目次>


  • 基本データ型
    • 整数型: byte, short, int, long
      • 具体的な違いはp.47参照。
    • 浮動小数点型: float, double
      • floatとdoubleの違いは調べてみよう。普段はdoubleだけで問題ない。
    • 文字型: char
      • char型(=1文字)の場合は char c = 'a'; のように、シングルクォート で囲うこと。
    • (文字列型: String)
      • String型の場合は String str = "hoge"; のように、ダブルクォート で囲うこと。
    • 論理型: boolean
  • リテラル(p.43)
    • 具体的な値(e.g., int型の値5)
    • 整数リテラル
    • 浮動小数点リテラル
    • 文字リテラル
      • 1つの文字。シングルクォーテーションで囲う事。
      • ユニコード(Unicode):世界標準の文字コード体系。
      • エスケープ文字(p.46):特殊文字。教科書の円マークはバックスラッシュ
        • 改行: \n
        • タブ文字: \t
    • 論理値リテラル
      • true, false
        • "true"trueは異なる点に注意。
  • 扱える値の範囲(pp.47-48)
    • 型ごとに範囲があることに注意。
    • int型が32bit(-2^31 〜 +2^31-1)
      • その半分16bitがshort。
      • その倍64bitがlong。
    • char型は16bit。
  • 演習例
    • (演習1-1) \n を用い、「文字列の間に改行を含む」文字列を出力せよ。文字列は自由に設定して構わない。
    • (演習1-2) trueとfalseの論理和を求め、その結果をboolean型変数として保存し、その変数を標準出力に出力せよ。なお、論理和は リテラル || リテラル という書式で求めることができる。
  • 識別子: クラス名、メソッド名、変数名などのプログラマが自由につけて良い名前のこと。
    • 使える文字: 英数字, _, $
    • 数字から始まってはならない。
    • 大文字小文字は異なる文字として扱われる。
    • 予約語(p.53)は使えない。
    • 名前の長さに事実上制限はない(理論的にはint型整数の最大値と同じ)。
  • 慣習上の命名規則
    • クラス名の先頭文字は大文字にする。
    • パッケージ名、変数名、メソッド名は小文字にする。
    • 2つ以上の単語を連結して名前を作る時は、2つ目以降の単語の先頭文字だけを大文字にする。(あるいは_で繋ぐ。)
  • 変数に代入するリテラルは同じ型である必要があるが、厳密にしすぎるとプログラムが書きづらくなってしまう。
    • double x = 15;
      • 右辺は整数型(int)リテラルだが、15.0に自動型変換されて代入される。
    • double y = x + 2
      • 上記は、xが浮動小数点型ならば自動変換される。
      • 逆に言えば、「xが浮動小数点型でない」ならば、自動変換されない点に注意。
        • int a = 1;
        • double b = a / 2;
          • 上記のケースでは、aも2も整数型なので、割り算は整数型で行う。
          • 1を2で割った答えは0(整数型)。この値が浮動小数点型に自動型変換されて0.0が変数bに代入される。
          • 浮動小数点型で処理して欲しい時には、演算対象を腐造小数点型と明示しよう。
            • 明示方法1: 数値を直接コードに書いてるなら、 2.2.0 のように小数点付きで書くと浮動小数点型と解釈される。(「2.」はタイプミスではなく、正しい書き方)。
            • 明示方法2: キャストする(後述)。
  • 自動型変換できないケース
    • int n = 15.432;
      • システム側では「切り捨ててよいのか四捨五入すべきか」どうか判断できない。->コンパイルエラー(文法エラー)
  • 演習例
    • (演習2-1) int a=1; double b=a/2; の結果、変数bの値がどのようになるのか標準出力して確認せよ。その結果から、変数bの値がどのように算出されているか考察せよ。
    • (演習2-2) 一般的な算数としての「1÷2の結果は0.5」という結果を得たいものとする。結果は浮動小数点数であるため、まずは変数bを浮動小数点数型に変更せよ。その上で、必要があればコードを追加修正し、bの値が0.5となっていることを標準出力で確認せよ。

  • よく使うものは覚えておこう
    • メソッド呼び出し
    • 配列要素の参照
    • オブジェクトのメンバ参照
    • インクリメント、デクリメント
      • i++ と ++i は動作が異なる。(pp.74-75)
    • 論理否定
    • オブジェクトの生成
    • 四則演算
    • 関係演算子
    • 論理演算子
  • 優先順位も覚えておくべきだが、それ以上に「誤読されにくいコードを書く」方が良い。
    • 優先順位は()で変更(丸括弧付きを優先的に処理させる)できる。
  • プログラマの責任で強制的に型変換する操作のこと。
    • int number = (int)10.5; // 小数点以下を切り捨ててint型に変換。
    • float x = (float)1.234; // 小数点型はデフォルトでdoubleになるが、float精度(1.234f)で代入される。
  • char型とint型の間での型変換(pp.81-)
    • char型は厳密にはユニコードであるため、int型との型変換が可能。
  • 演習例
    • (演習3-1) 10.9をint型にキャストした結果を標準出力し、確認せよ。
    • (演習3-2) char型で'a'を保存し、その変数をint型にキャストした結果を標準出力し、確認せよ。
    • (演習3-3) 演習3-2の結果は「97」となるはずだ。これを踏まえ、その次の値となる「98」をchar型にキャストした結果を標準出力し、確認せよ。
  • 例1
String s = "こんにちは" + "太郎"+ "さん";
  • 例2
String name = "太郎";
System.out.println("こんにちは" + name + "さん");
  • Stringではない型の変数を連結する(pp.89-)
  • 演習例
    • (演習4-1) String[] text = {"This", "is", "test."}; として保存されたString配列型に対し、全要素を結合した文字列(Thisistest.)を作り、標準出力せよ。 *できればループ処理を使おう。

  • 平方根の計算
double x = Math.sqrt(2.0);
System.out.println("2.0の平方根=" + x);
  • Math.sqrt(): Mathクラスのsqrtメソッド
  • MathクラスのAPI(pp.107-)
    • 絶対値、三角関数(ラジアン単位、角度単位)、自然対数、べき乗、max/min、0.0以上~1.0未満乱数、平方根、四捨五入、、、
  • 教科書にあるのは標準ライブラリではない。
    • 著者が独自に用意したライブラリ。興味のある人は使ってみよう。
  • レポート1で示したSampleScanner.javaは、標準ライブラリを使用した例。
  • 文字列の長さ
    • String.length()メソッド
  • Stringクラスの代表的なAPI
    • boolean equals(String str): 文字列が、別の文字列strを等しい時trueを返す
    • char charAt(int i): 先頭からi番目の文字(char)を返す。
    • int length(): 文字列の長さ(文字数)を返す。
    • String toLowerCase(): 英字を小文字にした文字列を返す。
    • String toUpperCase(): 英字を大文字にした文字列を返す。
    • String trim(): 先頭と末尾の空白を削除した文字列を返す。
    • String[] split(String regex): 与えられた正規表現regexに基づき、文字列を分解した配列を返す。
  • 演習例
    • 前提: String str = "This is test."; というString型変数を用意する。
      • (演習5-1) 上記strの文字列を、toLowerCaseメソッドを使って全てを小文字に変換した文字列を作成し、標準出力せよ。
      • (演習5-2) 上記strの文字列を、splitメソッドを使い、「スペース記号」を区切り文字として分割したString配列を作成し、標準出力せよ。(出力体裁は自由で構わない)
  • APIドキュメントからIntegerクラスを探してみよう。
  • Integerクラスのフィールド変数
    • MAX_VALUE
    • MIN_VALUE
  • Integerクラスの代表的なAPI
    • int max(int a, int b)
    • int min(int a, int b)
    • int parseInt(String s): 文字列sをint(符号付き10進数整数)型に解析し直す(パースする)。
      • 浮動小数点型、ブーリアン型へ変換するには下記を使おう。
        • Float.parseFloat(String s)
        • Double.parseDouble(String s)
        • Boolean.parseBoolean(String s)
    • String toString(): Stringに変換。
  • 演習例
    • (演習6-1) String data = "3.14"; と保存されているとし、変数dataをdouble型変数に変換した結果をdouble型変数として保持し、その変数を標準出力せよ。

  • 「関係演算子==」は、String型(参照型)には 適用できない。意味が異なる。
    • 文字列がnullかどうか調べる場合だけ使える。
      • object == null //objectがnullである(実体がない)時にtrue
  • 文字列そのもの値を比較するには、String.equals()メソッドを使う。
String str = "Java";
boolean answer = str.equals("Java");
  • &&: 論理積
  • ||: 論理和
  • !: 否定
  • 3項演算子の例。
  • 条件演算子
    • 条件部がtrueかfalseかで違う値になる式を作る。簡単なif文なら1行で書いてしまった方が全体を俯瞰しやすくなる。(使うことを推奨するわけではない)
    • 以下の例では「aの値が偶数ならnの値を100に、そうでないならnの値を0にする」。
int a = 5;
int n = a%2==0 ? 100 : 0;

省略。


  • 条件を満足している間、ループ処理を実行し続ける。
int i = 0;
while( i<3 ){
    System.out.println(i);
    i++;
}
  • 最初に処理を実行し、その後で条件を確認する。(最低1回は処理を実行する)
int i = 0;
do {
    System.out.println(i);
    i++;
} while( i<3 );

  • swich文は、非常に多くの分岐先がある時に有効な構文。if-else文でも同じ処理を書けるが、switch文の方が高速。
import java.util.Random;

public class SampleSwitch {
    public static void main(String[] args) {
        Random rnd = new Random(); // Randomクラスのインスタンスを用意。
        int num = rnd.nextInt(5); // 0〜4の乱数を返す。
        switch (num) {
            case 1:
                System.out.println("numが1のときの処理");
                break;
            case 3:
                System.out.println("numが3のときの処理");
                break;
            default:
                System.out.println("case文のどれにも該当しなかった場合の処理");
        }
        System.out.println("switch()文終了。");
    }
}

  • caseで指定された値と等しい箇所があれば、そこにジャンプする。
    • ジャンプ先にbreakがあれば、そのブロックを抜ける。(ここではswitch文を抜ける)。
    • ジャンプ先にbreakがなければ、ブロックを抜けず、処理を継続する点に注意。
      • 例えば、num = 1時に、上記コードで「case 1」時にbreakがない場合、
        • まず case 1 のコードを実行し、
        • 続けて case 3 には該当しないため無視し、
        • 最後に default にはどの値でも該当するため、defaultのコードも実行する。
  • switch() のカッコ内に記述できる変数の型は「整数型、文字列型、列挙型」のみ。

    • caseにはリテラルだけが使用可能。変数や式は使えない。
  • 演習のコード例: Week2.java