본문 바로가기

IT自主学習 (2023.05.23~)/Java(2023.05.23~)

プログラミング自主学習 44日目 全体復習/アクセス修飾子/Getter・Setter/Singletone

アクセス修飾

種類(Class, Field, Method, Constuctor) 範囲
pubilic      どこでもオッケー
(default) 同じパッケージ内
private 同じオブジェクト内

 

protectedは特殊なやつで、同じパッケージ内と継承したオブジェクトのみ使用可能。

今後、勉強するため、その際にまとめる。

 

OOTの原則である、カプセル化とも関係がある。

 

https://github.com/HyonHyonKOR/Thisisjava/tree/main/Chapter6/sec13

 

 

Getter・Setter

外部からオブジェクトのフィールドを勝手に読み、変更する場合、オブジェクトは壊れる。

例えば、自動車の速度は負数にはなれない。しかし、外部で負数に変更すれば、

オブジェクトのデーターの整合性(date integrity) が損なう。

 

Car myCar = new Car();
myCar.speed = -100;

 

そのため、アクセス修飾子でカプセル化をし、フィールドにアクセスを防ぐ代わりに、

Setter methodを活用するができる。

 

Private double speed;

public void setSpeed(double speed){
  if(speed < 0 ) {
      this.speed = 0;
      return;
  } else {
  this.speed = speed;
  }
}

 

また、オブジェクトののフィールドを読みたい際に、メソッドが必要な場合もある。

private double speed;   //speedはmile

public double getSpeed(){
     double km  = speed*1.6;
     return km;
 }

fieldの値 mileをkmに変換した後、return

 

この際にはGettter methodを活用する。

 

 

private fieldtype fieldName;    <--- インスタンスフィールドはprivate

//getter
public fieldtype getFieldName(){                    *booleanはgetをisに変更する。
return fieldName;
}

//setter
public void setFieldName(fieldtype fieldName){
this.fieldname = fieldname;
}

 

package ch06.sec14;

 

public class Car {

//필드 선언

private int speed;

private boolean stop;

 

//speed 필드의 Getter/Setter 선언

public int getSpeed() {

return speed;

}

public void setSpeed(int speed) {

if(speed<0) {

this.speed=0;

return;

}else {

this.speed=speed;

}

}

 

//stop 필드의 Getter/Setter 선언

public boolean isStop() {

return stop;

}

public void setStop(boolean stop) {

this.stop = stop;

if(stop == true) this.speed=0;

}

}

 

package ch06.sec14;

 

public class CarExample {

public static void main(String[] args) {

//객체 생성

Car myCar = new Car();

 

//잘못된 속도 변경

myCar.setSpeed(-50);

System.out.println("현재 속도: " + myCar.getSpeed());

 

//올바른 속도 변경

myCar.setSpeed(60);

System.out.println("현재 속도: " + myCar.getSpeed());

 

//멈춤

if(!myCar.isStop()) {

myCar.setStop(true);

}

System.out.println("현재 속도: " + myCar.getSpeed());

 

System.out.println(myCar.isStop());

 

}

 

}

 

Singletone

オブジェクト(インスタンス)を一つ生成し、コントロールする方法。

 

1. コンストラクタprivateにする。

外部からのインスタンス化を防ぐためだ。

 

2. フィールドprivate staticに宣言し、new演算子コンストラクタを呼び出すことで、オブジェクトを生成する。

インスタンスにフィールドを持たせない。また、自動的にメソッドの静的フィールドにインスタンスの参照値(アドレス)をもたせる。生成されたオブジェクトは全部同じインスタンスを参照する。

 

3. public static + getInstanceで、生成されたオブジェクトをリターンするメソッドを宣言する。

インスタンス化をせずに(static)、どこでも生成できるように(public)するためだ。

 

package ch06.sec15;

 

public class Singleton {

private static Singleton singleton = new Singleton();

 

private Singleton() {};

 

public static Singleton getInstance() {

 

return singleton;

 

}

}

 

 

package ch06.sec15;

 

public class SingletonExample {

 

public static void main(String[] args) {

/*

* Singleton obj1 = new Singleton();

* Singleton obj2 = new Singleton();

*

*

*/

 

//정적 메소드를 호출해서 싱글톤 객체 얻음

Singleton obj1 = Singleton.getInstance();

Singleton obj2 = Singleton.getInstance();

 

//동일한 객체를 참조하는지 확인

if(obj1 == obj2) {

System.out.println("같은 singleton 객체입니다.");

}else {

System.out.println("다른 singleton 객체입니다.");

}

 

}

 

}

 

같은 singleton 객체입니다.