본문 바로가기

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

プログラミング自主学習 40日目 Class/field/constructor

Class

Classはオブジェクトを作成する設計図である。

Classより生成されたオブジェクトをインスタンスという。

また、Class名はパスカルケースで表記する。(変数はキャメルケース)

 

Class宣言

public class ClassName{
}

 

一つのソースファイルで複数のClassファイルを生成することもできる。

しかし、ソースファイルと同じClass名のみpublicで生成できるため、

Tireをpublicにしたい場合は、別のClassとして作成するしかない。

 

package ch06.sec03;

public class Sportscar{
}

class Tire{
}

 

オブジェクト生成

 

new Classname()

new Classname()   new演算子 
new Classname()   コンストラクタ


Classname classVariable = new Classname();
これにより、Classnameのインスタンスが生成され、classVariableにClassnameのインスタンスのメモリアドレスを代入する。

 

package ch06.sec04;

 

public class Student {

}

 

package ch06.sec04;

 

public class StudentExample {

public static void main(String[] args) {

Student s1 = new Student();

System.out.println("s1 변수가 Student 객체를 참조합니다.");

 

Student s2 = new Student();

System.out.println("s2 변수가 또 다른 student 객체를 참조합니다.");

}

}

 

Classは、実行クラスとライブラリ用のクラスがある。

実行クラス: mainメソッドを持って、実行可能なクラス 

ライブラリ用クラス: 実行でじず、他のクラスより利用するクラス

 

 

Classのメンバー

public class ClassName{
}

 

よりClassを宣言してみた。

しかし、このClassはあくまで、Classを宣言したものにすぎず、実際の値(フィールド)もしくはメソッドはもっていない。

 

1 ) フィールド

オブジェクトに込めるデーター(値)を保存する。

 

2) コンストラクタ

Classを作成する理由は、Classを具現するオブジェクト(インスタンス)を作るためだ。ですので、まずはコンストラクタが必要だ。リターン値がない。

例)Classname();

 

3 ) メソッド

オブジェクトがする動作(メソッド)を保存する。

オブジェクト間の相互作用のため、呼び出される。

 

 

フィールド宣言

フィールドはオブジェクトのデーターを保存する。

フィールドのデーターには、固有データー、現状、部品がある。

 

<オブジェクトモデリング>

自動車オブジェクト   ➡     Class Car

                  public class Car{

                                                             //固有データーを保存するフィールド宣言。

【固有データー】

制作会社              String company;     

モデル               String model;

色相                                                       String color;

最高速度                                                int maxSpeed;

 

【状態】

現在速度             int speed;           

エンジン回転数                                    int rpm;

 

【部品】

車体               Body body;

エンジン                                               Engine engine;

タイヤ                                                   Tire tire;

 

 

(データ)タイプ フィールド名  [ =初期値];

 

package ch06.sec06.exam1;

 

public class Car {

//declare field

String model;

boolean start;

int speed;

}

 

package ch06.sec06.exam1;

 

public class CarExample {

 

public static void main(String[] args) {

//Car 객체 생성

Car myCar = new Car();

 

//Car 객체의 필드값 얻기

System.out.println("모델명: " + myCar.model );

System.out.println("시동여부: " + myCar.speed );

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

}

}

 

<RESULT>

모델명: null
시동여부: 0
현재속도: false

 

 

Classにオブジェクトのフィールドを宣言したが、値を持ってないため、オブジェクトは初期値をもつ。

 

 

フィールド使用

オブジェクト内部のフィールド値を読み、変更することをフィールドを使用するという。

 

package ch06.sec06.exam2;

 

public class Car { //class선언

//필드 선언

 String company = "현대자동차";

 String model = "그랜저";

 String color = "검정";

 int maxSpeed = 350;

 int speed;

}

package ch06.sec06.exam2;

 

public class CarExample {

public static void main(String[] args) {

 

Car myCar = new Car();

 

System.out.println("제작회사: " + myCar.company);

System.out.println("모델명: " + myCar.model);

System.out.println("색깔: " + myCar.color);

System.out.println("최고속도: " + myCar.maxSpeed);

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

 

 

//Car 객체의 필드값 변경

myCar.speed = 60;

System.out.println("수정된 속도:" + myCar.speed);

}

}

 

 

オブジェクトのフィールド

★宣言位置:Class内部

★存在位置:オブジェクト内部

★使用位置:オブジェクト内部でも外部でも使用可能

 

 

コンストラクタ宣言と呼び出し

Class 変数 = new Class();

new演算子を通して、Classのオブジェクト(インスタンス)を生成し、

Class()というコンストラクタを呼び出すことで、Classのオブジェクト(インスタンス)を初期化する。

 

全てのクラスはコンストラクタが存在している。クラスの中で、コンストラクタを宣言しなくても、

コンパイラが基本的にbytefileにコンストラクタを追加する。

 

 

基本コンストラクタ

[public] class() { }

 

Car.java    --------------------------------------------------------> Car. class

public class Car {                                                       public class car{

                                                                                       public Car(){}

}                                                                                 }                                                                                  

 

 

しかし、プログラマーが名刺的に宣言したコンストラクタがあれば、オブジェクトを生成する際に、多様なパータンで

初期化することができる。

 

 

コンストラクタ宣言

Class(parameter){   <ー コンストラクタブロック
   //Objectの初期化コード     
}

コンストラクタはメソッドと似ている形だ。しかし、リターン値がなく、Class名と同じ名前だ。

パラメーターはnew演算子でコンストラクタを呼び出す際に、パラメーターに受けた値(実引数、argument)をコンストラクタブロックに渡す。Carのコンストラクタを呼び出す際に、3つの値をコンストラクタブロックに渡すと仮定する。

 

Car car = new Car ("그랜저", "검정", 300);

 

3つの値を順番に代入するためにはこのようにコンストコンストラクタを宣言する必要がある。

 

 public class Car {
    //コンストラクタ宣言
    Car(String model, String color, int maxSpeed) {.....}
  }

 

フィールド初期化

フィールドを初期化する方法が二つある。

 

1)Class

上術したように、Classで特定な値をフィールドとして宣言することもできる。

Classのオブジェクトが同じ値を持たせたい場合、Classよりフィールドを宣言した方がよい。

固有フィールドを活用したい際にはClassより初期化した方が効率が上がる。

 

2)コンストラクタ

オブジェクト同士に違う値を持たせたい場合はコンストラクタで初期化した方がいい。

 

 package ch06.sec07.exam02;

 

 public class Korean {

 //필드 선언

 String nation = "대한민국";

 String name;

 String ssn;

 

 //생성자 선언

 public Korean(String n, String s) {

     name=n;

     ssn=s;

      }

 

  }

 

  

 package ch06.sec07.exam02;

 

 public class KoreanExample {

 

 public static void main(String[] args) {

 //korean 객체(인스턴스) 생성 

 Korean k1 = new Korean("박자바","011225-1234567");

 //Korean 객체 데이터 읽기 

 System.out.println("k1.nation : " + k1.nation);

 System.out.println("k1.name : " + k1.name);

 System.out.println("k1.ssn : " + k1.ssn);

 

 System.out.println();

 

 //또 다른 Korean 객체(인스턴스) 생성

 Korean k2 = new Korean("김자바","930215-0654321");

 //또 다른 Korean 객체 데이터 읽기

 System.out.println("k2.nation : " + k2.nation);

 System.out.println("k2.name : " + k2.name);

 System.out.println("k2.ssn : " + k2.ssn);

   }

 }

 

 

<result>

k1.nation : 대한민국
k1.name : 박자바
k1.ssn : 011225-1234567

k2.nation : 대한민국

k2.name : 김자바

k2.ssn : 930215-0654321

 

 

パラメターを初期化するフィールド名と同じ名前に指定した方がよい。

 

 

<BEFORE>

 

 //생성자 선언

 public Korean(String nString s) {

     name=n;

     ssn=s;

      }

 

<AFTER>

 

//생성자 선언

public Korean(String nameString ssn) {

       this.name = name;

       this.ssn = ssn;

}

 

}