Javaを勉強してTypeScriptも知る | Dev Driven 開発・デザインチーム Javaを勉強してTypeScriptも知る | 働くひとと組織の健康を創る iCARE

BLOG

Javaを勉強してTypeScriptも知る

HirosawaTsuyoshi
2021/06/01

何を学んでいるか

  • Javaの基礎であり、主にclassベースのオブジェクト指向の基礎
  • class, field, method, instance, constructor, 例外処理, 参照渡し...

授業前のJavaの印象

  • レガシー技術
  • イケてない
  • 過去の遺物

JavaとTypeScript

共通点

  • 静的型付け言語である
  • classやinterfaceを使った実装ができる
  • オブジェクト指向
  • 制御構文(for, if)や演算子周り、例外処理はほぼ同じ

Java

  • 関数のmain()がエントリーポイント

    public class Hoge {
        public static void main(String[] args){}
    }
  • 配列生成時に要素数を指定する

    int[] array;
    a = new int[2];
    
    a[0] = 10;
    a[1] = 7;
    
    // TypeScriptの場合
    const array: Array = new Array(2);

TypeScript

  • TypeScriptはJavaScriptに対して、省略も可能な静的型付けとクラスベースオブジェクト指向を加えた厳密なスーパーセットとなっている

JavaとTypeScriptで変数に型を付ける場合

Javaで変数に型を付ける場合は、

String a = "Javaだよ";

TypeScriptの場合は↓

const a: string = "Typesctiptだよ";

Javaは静的型付け言語で、TypeScriptは動的型付け言語であるJavaScriptに 型注釈(型指定) をし、コンパイラーに型を注釈として与えています。

Java と TypeScriptでHello Worldを出力する場合

  • クラスの公開は export の有無で、メンバー変数やメソッドのアクセスレベルは Java と 同じ
  • 型を後に書く (e.g. 引数 String[] args が args: String[]、メソッド戻り値が : void と 後)
  • Java の mainメソッド に あたるものは無いので任意のメソッド名でで実行する
public class GreetingJava {
    public static void main(String[] args) {
        System.out.println("Hello World !");
    }
}
export class GreetingTypeScript {
  public static main(args: String[]): void {
    console.log('Hello World !');
  }
}
GreetingTypeScript.main(undefined);

classの概念

  • classは以下のメンバからなる
    • field
    • method
    • constructor
      • インスタンスを作成する(new …() を呼ぶ)とき
        に実⾏される処理を定義したもの(名前はクラス名と同じ)
class Student {
    // field
  private int id; // 外から参照できない局所変数
    private String name; // 外から参照できない局所変数

 // constructor
    public Student(int id) {
        this.id = id // 明示的にfieldを指す場合はthisを使う
    }

    // method
    public int getStudentId() {
        return this.id;
    }
}
class studentManager {
    public static void main(String[] args) {
        // インスタンス作成
        Student student = new Student(12);  
        System.out.println(student.getStudentId()) // 12
    }
} 
  • アクセスを修飾子
    • private
      • 同一class内からのみアクセス可能
      • fieldに直接アクセスできると想定していない値を設定させられるかも
    • public
      • すべてのclassからアクセス可能
    • protected
      • 同一パッケージ内とサブクラスからアクセス可能
  • privateなフィールドにpublicなメソッドを⽤いて
    アクセスできるようにすることをカプセル化と呼ぶ

参照渡しはTypeScriptでも発生する

export class User {
  name: string;
  age: number;
}
class User {
  name: string;
  age: number;
}

const main = () => {
  let users: User[] = [];

  let user: User = { name: "alpha", age: 20 };
  users.push(user);
  console.log('before', { users });

  user.name = "beta";
  users.push(user);

  console.log('after' ,{ users });
};

main();
// before { users: [{ name: "alpha", age: 20 }]}
// after { users: [{ name: 'beta', age: 20 }, { name: 'beta', age: 20 }]}

参考