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でオブジェクトを作成する必要があります.
使用可能
また、静的変数、メソッドは、使用時にクラス名として使用する必要があります.
Reference
この問題について(Javaクリーンアップ(4月19日)), 我々は、より多くの情報をここで見つけました
https://velog.io/@emb220117/Java-정리4월-19일-zzuskmp6
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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
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);
}
}
}
メモリ領域
では、静的変数はどこに格納されますか?
静的変数は、オブジェクトに含まれるのではなく、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でオブジェクトを作成する必要があります.
使用可能
また、静的変数、メソッドは、使用時にクラス名として使用する必要があります.
Reference
この問題について(Javaクリーンアップ(4月19日)), 我々は、より多くの情報をここで見つけました https://velog.io/@emb220117/Java-정리4월-19일-zzuskmp6テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol