Javaクリーンアップ(4月19日)


TIP


final定数を最大限に利用する

    final int maxHp = 50;       //최대 hp
    final int maxMp = 10;       //최대 mp
    String name;                //이름
    int hp = 50;                 //hp
    int mp = 10;                 //mp
上記初期化と比較して、定数値を最大限に利用して次のように記述することが望ましい.
    final int maxHp = 50;       //최대 hp
    final int maxMp = 10;       //최대 mp
    String name;                //이름
    int hp = maxHp;                 //hp
    int mp = maxMp;                 //mp
また,クラスにおける静的変数以外の初期化はジェネレータを用いて行うことが望ましい.

コードテスト方法


1. white box test


ホワイトボックステストテクノロジーは、ソフトウェア内部のソースコードをテストするテクノロジーです.
サンプルコードのテスト
import org.junit.Before;
import org.junit.Test;

import java.util.Random;

import static org.junit.Assert.*;

public class ClericTest {
    Cleric cleric;
    Random random = new Random();

    @Before
    public void setUp() {
        cleric = new Cleric();
    }

    @Test
    public void selfAid() {
        for (int i = 0; i < 100; i++) {
            cleric.mp = cleric.maxMp;
            cleric.hp = random.nextInt(51);
            cleric.selfAid();
            assertEquals(cleric.maxHp, cleric.hp);
        }

        for (int i = 0; i < 100; i++) {
            cleric.mp = 4;
            int hp = random.nextInt(51);
            cleric.hp = hp;
            cleric.selfAid();
            assertEquals(hp, cleric.hp);
        }
    }

    // 이전 mp 와
    @Test
    public void pray() {
        for (int i = 0; i < 100; i++) {
            int sec = random.nextInt(11);
            int mp = random.nextInt(11);

            cleric.mp = mp;
            int recoveryMp = cleric.pray(sec);

            assertTrue(cleric.mp <= cleric.maxMp);
            assertEquals(mp + recoveryMp, cleric.mp);
        }
    }
}

2. black box test


ブラックボックス検査法は,ソフトウェア内部を見ずに入出力値を検査することで,機能の有効性を判断する試験方法である.

カテゴリ


メモリ領域



では、静的変数はどこに格納されますか?
静的変数は、オブジェクトに含まれるのではなく、DATA領域に格納されます.

クラス参照

package com.jinho.day7;

public class Code01 {
    public static void main(String[] args) {
        Hero hero1 = new Hero();
        hero1.hp = 100;

        Hero hero2 = hero1;
        hero2.hp = 200;

        System.out.println(hero1.hp);


    }
}
以上の例題の中の英雄1.HPはどんな価格になりますか?

図に示すように200ある

フィールドとしての他のタイプのクラス


Swordクラス
package com.jinho.day7;

public class Sword {
    String name;
    int damage;
}
Swordクラスを含むHeroクラス
package com.jinho.day7;

public class Hero {
    
    
    String name;
    int hp;
    Sword sword;


    void attack() {
        System.out.println(this.name + "는 공격했다!");
        System.out.println("적에게 5포인트의 데미지를 주었다");
    }
}
表玄関
package com.jinho.day7;

public class Code02 {
    public static void main(String[] args) {


        Sword sword = new Sword();
        sword.name = "불의 검";
        sword.damage = 10;


        Hero hero = new Hero();
        hero.hp = 100;
        hero.sword = sword;


        System.out.println("현재의 무기는 " + hero.sword.name);


    }
}

クラス形式をパラメータとするクラス


Heroクラスをパラメータとするウィザードクラス
package com.jinho.day7;

public class Wizard {
    String name;
    int hp;

    void heal(Hero hero) {
        hero.hp += 10;
        System.out.println(hero.name + "의 hp를 10만큼 회복했다!!");
    }

}
表玄関
package com.jinho.day7;

public class Code03 {
    public static void main(String[] args) {
       
        Hero hero1 = new Hero();
        hero1.name = "최진호";
        hero1.hp = 100;

        Wizard wizard = new Wizard();
        wizard.name = "닥터 스트레인지";
        wizard.hp = 100;

        System.out.println(hero1.hp);
        wizard.heal(hero1); 
        System.out.println(hero1.hp);   
    }
}

Stringタイプ検証


次のコードを実行すると、name変数の「金振浩」が更新されたように見えます.
Stringタイプ変数はreferencetypeでnewは省略
したがって、新しいメモリはnewとして作成され、指すアドレス値のみが変更されます!
package com.jinho.day7;

public class Code04 {
    public static void main(String[] args) {
        String name = "최진호";
        name = "김진호";

    }
}

したがって、文字列をname=name+「i」と貼り付けると
後ろに貼ってあるように見えますが、これもnewで新築され、アドレス値のみ変更されました.
したがって、文字列をマージするときはStringBuilderを使用する必要があります.
これらのハッシュコードと例について
package com.jinho.day7;

public class Code04 {
    public static void main(String[] args) {
        String name = "최진호";

        for (int i = 0; i < 10; i++) {
            name = name + "i";
            System.out.println(name.hashCode() + "   " + name);
        }

        System.out.println();
        System.out.println();

        StringBuilder sb = new StringBuilder("최진호");
        for (int i = 0; i < 10; i++) {
            sb.append("i");
            System.out.println(sb.hashCode() + "   " + sb);
        }

    }
}

作成者の例


クラスにはコンストラクション関数が必要です

package com.jinho.day7.quiz9;

import java.util.Random;

public class Cleric {

    static final int maxHp = 50;       //최대 hp
    static final int maxMp = 10;       //최대 mp
    String name;                //이름
    int hp;                 //hp
    int mp;                 //mp


    //생성자 A (이름,hp,mp)
    Cleric(String name, int hp, int mp) {
        this.name = name;
        this.hp = hp;
        this.mp = mp;
    }

    //생성자 B  (이름,hp)
    Cleric(String name, int hp) {
        this.name = name;
        this.hp = hp;
        this.mp = Cleric.maxMp;
    }

    //생성자 C (이름)
    Cleric(String name) {
        this.name = name;
        this.hp = Cleric.maxHp;
        this.mp = Cleric.maxMp;

    }
    
    //기본 생성자
    Cleric() {
    
    }

}
上記の例は、リロードジェネレータによる複数の例の作成です.
A->名称、HP、MP
B->名称、HP
C->名称
D->ベーシックジェネレータ
なぜここで基本ジェネレータを作成しますか?
ジェネレータを作成しない場合は、基本ジェネレータが呼び出すと仮定します.
つまり、生成者には
ただし、基本ジェネレータ以外のジェネレータをオーバーロードして作成すると、基本ジェネレータがないと判断し、基本ジェネレータにする方法がエラーになります.
したがって、コンストラクション関数によって再ロードされて作成された場合は、基本コンストラクション関数も作成する必要があります.
package com.jinho.day7.quiz9;


public class GameMain {
    public static void main(String[] args) {

        System.out.println("static 최대 HP : " + Cleric.maxHp);
        System.out.println("static 최대 MP : " + Cleric.maxMp);

        Cleric clericA = new Cleric("jinHo", 30, 20);
        Cleric clericB = new Cleric("minHo", 15);
        Cleric clericC = new Cleric("lala");

        //Cleric clericD = new Cleric(); 기본생성자 안되도록 했음


        System.out.printf("이름 : %s  HP : %d  MP : %d\n", clericA.name, clericA.hp, clericA.mp);
        System.out.printf("이름 : %s  HP : %d  MP : %d\n", clericB.name, clericB.hp, clericB.mp);
        System.out.printf("이름 : %s  HP : %d  MP : %d\n", clericC.name, clericC.hp, clericC.mp);


    }
}


静的サンプル

package com.jinho.day7;

public class StaticExample {

    static int staticNum = 5;
    int justNum = 10;

    static void staticMethod() {
        System.out.println("staticMethod");
    }

    void justMethod() {
        System.out.println("justMethod");
    }

}
package com.jinho.day7;

public class Code06 {
    public static void main(String[] args) {

        //int num = StaticExample.justNum;   static이 아닌 인스턴스 변수는 무조건 new로 객체를 생성해야만 사용할수있다
        int num = StaticExample.staticNum;  //static 으로 정의한 클래스 변수는 new로 객체 생성하지않아도 사용할수있다 프로그램 시작과 동시에 DATA 영역에 저장되기때문이다
        System.out.println(num);

        //StaticExample.justMethod();   //매서드도 변수와 동일하다
        StaticExample.staticMethod();


        //아래처럼 new로 객체 생성하면 인스턴스 변수, 인스턴스 메서드 모두 사용이 가능하다
        StaticExample ex = new StaticExample();
        num = ex.justNum;
        System.out.println(num);
        ex.justMethod();

    }
}


プログラム起動時にDATA領域に格納される静的に定義されたクラス変数.
新しいオブジェクトを別途作成せずに使用
ただし、インスタンス変数がstaticとして定義されていない場合は、メソッドはnewでオブジェクトを作成する必要があります.
使用可能
また、静的変数、メソッドは、使用時にクラス名として使用する必要があります.