アルゴリズム・オブジェクト指向[自分用メモ]
線形探索
データ群からデータを1つずつ見ていく方法
2分探索
大きさ順に並べることが前提の検索方法
まず真ん中を見て数字が大きいか小さいかで判別してく(ツリーのやつ見たい🥺💛)
log2(個数)(2を何回かけたら4になるか)
ハッシュ法
あらかじめルールを決めて格納する場所を決める。
(格納場所が被ることをシノニムまたは衝突という)でもあんまりない🙃
平均探索回数は1回らしい
ソート(並び替え)
バブルソート:1つ隣の数字と比べて並び替えしていく。片側は確定していく。
選択ソート:列の中の最小値を先頭と交換してく。左側が確定していく
挿入ソート:未整列のグループから整列済みのグループに挿入
シェルソート:一定間隔おきのグループで並び替え(5⇒3のように狭めていく)
クイックソート:🌟いっちばんはやい🌟基準値を決めて大小グループに分ける😳
マージソート:分割し統合した際に整列
ヒープソート:ヒープ木は親が大きく子が小さい
アルゴリズム
オブジェクトの持つ振る舞い==メソッド
カプセル化=隠蔽化(属性と振る舞いを1つにまとめた構造にすることを)
親クラス(スーパー・基底)から子クラス(サブ・派生)に継承することをインヘリタンスという🥺
子クラスのところにextends 親クラス名
で継承できる。
継承すると親クラスの情報をもらえるから子クラスではコード書かなくてもいいんやけど、、このメソッドだけは独自にしたい!設定追加したい!ときは上書き(オーバーライド)も可能🌟
スコープとローカル変数
変数には有効範囲がありこれをスコープと呼ぶ { }
のこと🤧
ちょいちょいSystem
の位置で違うことが出力されたんはこういうことね...
プログラムの性質
オブジェクト指向
オブジェクト指向とはコードを1つのページに書いていくのはなく、「ある役割を持ったモノ」ごとにクラスを分割しモノとモノの関係性を定義していくことでシステムを作り上げようとするシステム構成の考え方のこと!!!🙁
モノを表現するためには属性と機能が必要になる。
属性はクラス内で宣言でき、その変数をフィールドといい、モノの情報を表す。
(もしオブジェクトが車なら車種とか契約書とか色とか、、)
車の機能を書いてるところをメソッドという。
(ライト点滅とかクラクション鳴らす・スピード上げ下げ、、、)
🌟メソッドとフィールドを合わせて「メンバ」という
モノの実態の事をインスタンスという😼
コンストラクタ
さっき属性を書くといったけど、初期値を定めると、インスタンス化するたびにそのデータが持ち込まれ、毎回上書きする手間が発生するため、効率が良くない。
そこで、初期値を空白で書いておき、インスタンス化されると同時に自動で初期値を代入する仕組みを用意する。この役割を果たす特別なメソッドをコンストラクタという!
// 定義 Aクラスに書く
public Car(String carModel) {
this.carModel = carModel;
}
// 呼び出し BやCなど使いたいクラスで書く。
Car myCar = new Car("ノート");
つまり、、、、
- 定義(コンストラクタの作成)は クラスA(Car)に書きます:
public class Car {
String carModel; // 属性(フィールド)
// コンストラクタ
public Car(String carModel) {
this.carModel = carModel; // 引数で渡された値を carModel に設定
// thisはこのクラス内のコンストラクタ=CarModelのこと?
}
}
- 呼び出し(インスタンス化)は クラスB(MainCarB)や他のクラスで行います:
public class MainCarB {
public static void main(String[] args) {
// クラスA(Car)のコンストラクタを呼び出してインスタンスを作成
Car myCar = new Car("ノート"); // これがコンストラクタ呼び出し
// メソッドを使って情報を表示
System.out.println("車種: " + myCar.carModel); // 出力: 車種: ノート
}
}
this/コンストラクタの呼び出し
「this」には「このインスタンス」という意味を表します。
具体的には以下の意味を持つ
thisは使うなら絶対に先頭じゃないとダメ(コンパイルできない)
-
デフォルトコンストラクタ
コンストラクタは絶対に置かなきゃいけないからもし定義してなかったら勝手に作られる。
もし1つでも書いてたらこのデフォルトコンストラクタは作成されない🤧
オブジェクト指向の3大要素
- カプセル化
- 継承
- ポリモーフィズム
カプセル化
publicやprivateなどをつかって外部クラスからのアクセスを制御することをカプセル化という
privateをつけたフィールドに外部から参照するためにはアクセス用メソッド(getterとsetter)を使用する。
(継承してる子クラスでも通常はgetterとか使わないとダメ。けどprotectedって親クラスにかいてあるところはpublic同様さわれる!子クラスだけ特別~~~て仕様。)
// 参照用メソッド
publicフィールドの型 getAbc() {return Abc;}
// 代入用
public void setAbc (フィールドの型 引数名){abc = 引数名;}
クラス単位・メンバ単位でもアクセス修飾子を付けることが出来る😳
クラス単位ではpublicを最初に書いてたらいいけど無指定の場合同パッケージ内からアクセス可能
(メソッドとかコンストラクタはほかのファイルに持ってくことが多いからpublicが多いかな)
継承
あるクラスの情報を受け継いでほかのクラスを作ることを継承という。
この機能を利用することでシステムの拡張部分の差分のみプログラミングで書けばいい。
class サブクラス extends スーパークラス
class toyPoodle extends Dogs{ // Dogクラスの情報をtoypoodleクラスにもってくるようって意味
}
AクラスをBに継承してBをCに継承してた場合、CクラスにはAの情報も使える。
Aクラスの情報を変えるだけでBもCも変わってくれる😼
抽象クラス
これはインスタンス化は目的ではなく、仕様のみを記載した継承前提のクラスのこと
オーバーライドしないとエラーになる仕様。
定義してほしいものが決まってるならここに書いておく(エラーになるから絶対定義する&変数名とか各自だと困るけど、これしとくと統一される🥺💗)
ポリモーフィズム
🌟応用~~
継承の際コンストラクタのみ継承されない🙃
super(引数)
で親クラスからコンストラクタを呼び出せる。持ってこれるのは1つ上まで。
(他のコンストラクタを呼び出す際は一番上にかかなきゃいけない良い仕様のため1つのコンストラクタ内でsuper
やthis
を2つ以上使用はできない)
to String()メソッド
:オブジェクトの情報を文字列として返すために使います。
System.out.println(クラス名) を使うと、自動的にそのクラスのtoString()メソッドが呼ばれます。ただデフォルトでは、クラス名とハッシュコードを返します。(読めるか🙃)
なのでtoString()でオーバーライドして、オブジェクトの属性をわかりやすい文字列として表示することができます。
// オーバーライドなし(デフォ)
<結果>(例: Car@6d06d69c)
// オーバーライド海済
public String toString() {
return "車種: " + model + ", 色: " + color;
}
public static void main(String[] args) {
Car myCar = new Car("ノート", "赤");
System.out.println(myCar); // オーバーライドしたtoString()が呼ばれる
}
<結果> 車種: ノート, 色: 赤
static
ちょいちょい出てくるstatic
について,,,
静的メンバのこと。
-
staticをつける場合
基準: クラス全体で共有したいデータや機能かどうか。
例: 計算ロジックやユーティリティメソッド(Math.random()など)
(上書きされたら困る~~~)
クラス全体で共有するデータ
→ 全インスタンスで共通して扱うデータ。
例: schoolクラスなら全校生徒数とか、 -
- staticをつけない場合
基準: インスタンスごとに異なるデータや処理か?
→ 例えば、schoolクラスなら「名前」や「年齢」は人それぞれ
例: String name; int age;
- staticをつけない場合
適当にやると、メモリあほ程とってよくないから注意🥺💦いつかやりそう~~
Discussion