どうも、solobochiです。
今週からJava勉強中です。
入社以来ずっとバックエンド開発に従事し、直近5年くらいはずっとプロマネ、ITコンサルのため
ずっと興味はあったものの、Javaは新人研修で少しかじった程度の素人レベルです。
目次
7/31更新 Update
Javaとは
👉1995年にSunMicroSystem(現在のOracle)が開発。
👉”Write Once Run Anywhere”(一度書いたらいつでも利用可能)がPolicy。
👉何と言っても、汎用性が高くOS依存しない
👉サーバサイドプログラムに適する(クライアントサイドはJavaScript、Angularなど)
└→マインクラフトもJavaで作られている
👉RDBアクセスがしやすい
👉トランザクション管理が簡単
👉オブジェクト指向言語なので複数人開発に効率的
オブジェクト指向
・オブジェクト指向プログラミング
=データ・メソッドの集合であるオブジェクトをプログラムの基礎として考える
【特徴】
オブジェクト指向とは、⑴カプセル化、⑵継承、⑶多態・ポリモーフィズム
👉⑴カプセル化:クラスを独立したオブジェクトとして他クラスから干渉されないようにする。
👉⑵継承:プログラムの再利用。本質はインターフェース
👉⑶ポリモーフィズム:同一メソッドを異なる複数のクラスで使用可能にする、使い分け。インターフェースに対してプログラムする。
※参考※
・オブジェクト指向プログラミング、手続き型プログラミング、関数型プログラミング
👉オブジェクト指向:データとメソッド(オブジェクト)をまとめてクラスに定義。モノ(カプセル)を組み立てるようにして記述する。
状態変更はオブジェクトへの依頼を通じてのみ行われる。
👉手続き型:データとルーチン。処理の手続きを全て処理の順に記述する。多様な要素全てを記述するのは大変。
C言語は手続き、C++はオブジェクト指向。
👉関数型:やりたい処理中心、全てが関数で記述される。
プログラミングパラダイム。
・DI/AOP
🔸DI(Dependency Injection:依存性の注入)
👉クラス内に固定の変数やインスタンスがあるとき、依存性があるという
👉固定の変数、定数、インスタンスをクラス内から排除して外部から注入する=引数で受け取れるようにする
🔸AOP(Aspect Oriented Programming:アスペクト志向プログラミング) ※Aspect:横断的
👉ポストオブジェクト指向
👉業務プログラマーの負荷削減
👉フレームワークでトランザクション処理を自動的に織り込む(=weaving)ことで、自分でインスタンス化しなくてよい
・JavaのEdition
🔸JavaSE:Java Platform Standard Edition
👉かつてのJ2SE(Java 2 Platform Standard Edition)
👉Javaの基本機能を最低限まとめた
🔸JavaEE:Java Enterprise Edition(JavSE+拡張機能)
👉かつてのJ2EE(Java 2 Platform, Enterprise Edition)
👉Javaのオフィシャルなフレームワークで、JavaSE(Standard Edition)の拡張機能として提供される標準規格
👉JCPによってまとめられたJSRを取り込んでJavaEEを作成してきた
👉JavaEE9以降はJakartaEEとなる
▶️JCP(Java Community Process):企業・個人からなる利害関係者によるJava標準化手続きを行う国際機関、SunMiroSystemsが1998年に設立。
▶️JSR(Java Specification Request):Java仕様要求
・MVCフレームワーク
👉Model:BL(ビジネスロジック)、データ処理
👉View:PL(プレゼンテーションロジック)、クライアント、入出力。出力を描画。
👉Controler:PGMの整理整頓
👉1990年Struts1.0はMVCモデル
※参考※
他のプログラミング言語
ポイント ・プログラミング言語 ▶️FORTRAN:1954年にIBMによって開発された世界最初のプログラミング言語。 ▶️COBOL:1959年に事務所利用に開発されたプログラミング言語、自然言語に近しい言語であり可読性が高い。 ▶️BASIC:1964年に開発された手続き型言語。 ▶️C言語:1972年に開発。汎用性・自由度が高い(=ハードウェアを直接扱う低水準言語にも複雑なアプリケーションを暑かつ高水準言語にも使える)言語。手続き型言語。コンパイラ言語で高速。 ▶️C++:1983年に開発。オブジェクト指向が導入された。汎用プログラミング言語。 ▶️C#:2001年にMicrosoftが開発。オブジェクト指向。
並行処理、バッチ処理、帳票出力に向いていて大規模基幹システムで多く採用。コンパイラ言語で高速。
いよいよコーディングへ
クラス・インスタンス・メソッド
まずは、Javaの基本、クラス・インスタンス・メソッドについて。
・クラス、インスタンス、メソッド
👉クラス:定義、設計図。オブジェクト生成のために定義された概念。クラス自体の定義、クラス内のメソッド定義、変数定義
👉インスタンス:クラスを元に実動するオブジェクト。定義(クラス)に対して実体。
👉メソッド:関数、処理
・ロボット設計図:クラス
・ロボット:インスタンス
クラス ・クラス(Class) ・クラス定義
👉COBOLでいうcopy句に近い?
・メンバ変数定義とメソッド定義
👉メンバ変数:グローバル、クラスどこでも参照できる
👉ローカル変数:メソッド内でのみ参照できる
👉メンバ変数定義=変数の定義、メソッド定義=COBOLでいうPROCEDURE-DIVISION
例:食べ物クラス
Food.java
public class Food {
String name;
int amount;
int kcal;
double fat;
double protein
boolean fastfood;
}
インスタンス化 ・インスタンス化 例)Factory Class
👉クラスをメモリに貼り付ける
=パーマネント領域にあるクラスをヒープ領域にコピーすること
👉メソッドを使うために必要なステップ
👉COBOLではサブルーチンをすぐにCALLできたがJavaではインスタンス化が必要
※staticメソッドで作成すれば、インスタンスメソッド作成しなくてもメソッド呼び出し可能
👉呼び出し元クラスでインスタンス化する
👉インスタンス化しないとメソッドを使うことができない
👉パーマネント領域にあるクラスを、ヒープ領域にコピーしてインスタンスを使う
👉インスタンス化する方法は3つ
▶️呼び出し元でインスタンス化
▶️ファクトリークラスで生成:createメソッドの中でインスタンス化
▶️フレームワークを用いて生成
public class CalculateFactory{
public Calculate create(){
Calculate cal = new Calculate();
return cal;
}
}
インスタンス化(続き) ・new演算子でクラスのインスタンス化 例2) PersonalInfo P_info = new PersonalInfo(); 2行で書くこともできる
👉クラスを元にオブジェクトを生成する
例1)
Material.java
public class Material {
public static void main(String[]) args) {
Food Something = new Food();
Something.name = "Hamburger";
Something.amount = 5;
Something.kcal = 1000;
Something.fat = 600;
Something.protein = 300;
Something.fastfood = true;
:
}
}
PersonalInfo.java
public class PersonlaInfo {
//名前
String name;
//年齢
int age;
}
※クラス名 インスタンス名 = new クラス名
PersonalInfo P_info ▶️変数P_infoの型をPersonalInfoと定義した
P_info = new PersonalInfo() ▶️PersonalInfoインスタンスをnewして戻り値・インスタンスの先頭アドレスをP_info変数に格納した
※インスタンス先頭アドレス=デスクトップのショートカットのようなもので、実体はなくインスタンスの所在を示す
メソッド ・メソッド(Method)
👉COBOLでいうプログラムIDのこと
👉振る舞い、手続き、関数
変数定義
変数定義 ・変数定義 型 △ 変数名 ・プリミティブ型:共通の型定義 ・オブジェクト型:自作の型定義 ▶️オブジェクト型変数の作り方
👉char variantA
👉int customer_ID
👉double numberC
👉Suuzi koza_no
👉Name customer_name
public class Fare {
double room_account;
char room_grade;
double ticket_type;
}
👉オブジェクト型変数をクラスでラッピングする
👉COBOLの階層構造と同じように使える
→01 employee.
05 employee-ID PIC 9(7).
05 employee-name PIC X(30).
引数・戻り値
引数・戻り値 ・引数と戻り値
→引数:親から子へ送る値 ⬅️入力引数など
→戻り値:子から親へ返す値 ⬅️return で返却
🔸戻り値 = インスタンス名.メソッド名(引数)
例)
return = ins1.calculate(argument)
ins1:インスタンス名
calculate:メソッド名
argument:引数
return:戻り値
▶️メンバ変数を使えば、親子のメソッド間でやり取りできる。引数で渡して戻り値で返すことをしなくてもよい。
▶️️️️️️️️️️️️メンバ変数を用いてメソッド間でやる取することは、オブジェクト指向の体現
▶️メンバ変数を用いる=トランザクションスクリプトではなくドメインモデル
▶️複雑な制御システム(航空システムなど)にはドメインモデルが適している
コンパイル
コンパイルについて ・コンパイル
👉Javaはコンパイルするとclassファイルを生成する
👉JVM(VirtualMachine)上で実行するため、OSに依存せず同一のPGMを実行できる
👉コンパイルしてclassファイルを生成して、2回目のコンパイルでVM/OSがclassを読み込むことで実行可能にする
👉COBOLの場合は、コンパイルしてobjファイルを生成して、リンクすることで実行ファイルを生成する
※makeファイルに定義しておいて、コンパイルとリンクを一気に実行
アクセサ
・アクセサ(ゲッタメソッド、セッタメソッド)
アクセサ ・ゲッタメソッド ・セッタメソッド
👉メンバ変数を直接参照するのではなく、メソッドでreturnすることで変数を戻り値として返す
👉getArgxxx(get + メンバ変数の1文字目を大文字)
👉例)
public String getName(){
return name;
}
👉メソッドを介してメンバ変数に値をセットする
👉setArgxxx(set + メンバ変数の1文字目を大文字)
👉例)
public void setName(){
this.name = name;
}
DTO/DAO
・DTOとDAOについて
DTO/DAO ・DTO(Data Transfer Object)、JavaBean ・DAO(Data Access Object)
👉値を受け渡すためのオブジェクト型変数▶️️️️️️️️複数の変数をまとめて引き渡すコンテナ
👉DTOは、純粋に値だけを受け渡す専用クラス▶️メンバ変数とgetter,setterしかない
👉JavaBeanは、少しメソッドも含まれる
👉メソッドの集まり、値を保持しない。
👉正体はクラス。
👉クラスとデータベースのやり取りの橋渡し。
👉SQL文は全てDAOに集約できる。
とりあえず、ざっと概要について調べたことだけまとめてみました。
次はいよいよ開発環境構築して、コーディングにうつります。
新しいプログラム言語の勉強で座学が続くと、早く開発したいー!って気持ちが高ぶって困る。笑
以上