From 56e476a10eae6a51045fe76181fd26c26e3e9fa9 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 10 Jun 2025 12:02:16 +0900 Subject: [PATCH 01/45] =?UTF-8?q?feat:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=99=80=20=EC=9D=B8=EC=8A=A4=ED=84=B4=EC=8A=A4=20=EC=88=98?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Kinoko.java | 16 ++++++++ src/main/java/com/survivalcoding/Main.java | 11 ++---- .../java/com/survivalcoding/KinokoTest.java | 39 +++++++++++++++++++ 3 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/survivalcoding/Kinoko.java create mode 100644 src/test/java/com/survivalcoding/KinokoTest.java diff --git a/src/main/java/com/survivalcoding/Kinoko.java b/src/main/java/com/survivalcoding/Kinoko.java new file mode 100644 index 00000000..fc29ca6b --- /dev/null +++ b/src/main/java/com/survivalcoding/Kinoko.java @@ -0,0 +1,16 @@ +package com.survivalcoding; + +public class Kinoko { + int hp = 50; + final int level = 10; + + void attack() { + final int level = 20; + hp = 100; + } + + void setHp(int hp) { + this.hp = hp; + System.out.println("hp 를 회복"); + } +} diff --git a/src/main/java/com/survivalcoding/Main.java b/src/main/java/com/survivalcoding/Main.java index 0f5013a7..208e351c 100644 --- a/src/main/java/com/survivalcoding/Main.java +++ b/src/main/java/com/survivalcoding/Main.java @@ -1,15 +1,10 @@ package com.survivalcoding; -//TIP To Run code, press or -// click the icon in the gutter. public class Main { public static void main(String[] args) { - System.out.print("Hello and welcome!"); + Kinoko kinoko = new Kinoko(); + kinoko.setHp(100); - for (int i = 1; i <= 5; i++) { - //TIP Press to start debugging your code. We have set one breakpoint - // for you, but you can always add more by pressing . - System.out.println("i = " + i); - } + System.out.println("hp 100 회복"); } } \ No newline at end of file diff --git a/src/test/java/com/survivalcoding/KinokoTest.java b/src/test/java/com/survivalcoding/KinokoTest.java new file mode 100644 index 00000000..66bae170 --- /dev/null +++ b/src/test/java/com/survivalcoding/KinokoTest.java @@ -0,0 +1,39 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class KinokoTest { + + @Test + @DisplayName("버섯 생성시 hp는 50이어야 한다") + void testCreate() { + Kinoko kinoko = new Kinoko(); + assertEquals(50, kinoko.hp); + } + + + @Test + @DisplayName("attack()을 하면 hp 가 100이 되어야 한다") + void testAttack() { + // given(준비) + Kinoko kinoko = new Kinoko(); + assertEquals(50, kinoko.hp); + + // when(실행) + kinoko.attack(); + + // then(검증) + assertEquals(100, kinoko.hp); + } + + @Test + @DisplayName("hp 설정이 잘 되어야 한다") + void testSetHp() { + Kinoko kinoko = new Kinoko(); + kinoko.setHp(200); + assertEquals(200, kinoko.hp); + } +} \ No newline at end of file From 751a63abd6f3d364f82767300f1193a8e8821dcb Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Mon, 16 Jun 2025 11:19:07 +0900 Subject: [PATCH 02/45] =?UTF-8?q?feat:=20=ED=81=B4=EB=A0=88=EB=A6=AD=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Cleric.java | 37 ++++++++++ .../java/com/survivalcoding/ClericTest.java | 69 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 src/main/java/com/survivalcoding/Cleric.java create mode 100644 src/test/java/com/survivalcoding/ClericTest.java diff --git a/src/main/java/com/survivalcoding/Cleric.java b/src/main/java/com/survivalcoding/Cleric.java new file mode 100644 index 00000000..f4045ab1 --- /dev/null +++ b/src/main/java/com/survivalcoding/Cleric.java @@ -0,0 +1,37 @@ +package com.survivalcoding; + +import java.util.Random; + +public class Cleric { + String name; + int hp = 50; + int mp = 10; + final int maxHp = 50; + final int maxMp = 10; + + // 난수 생성을 위한 Random 객체 한번만 만들자 + Random rand = new Random(); + + public void selfAid() { + if (hp == maxHp) return; // 이미 max라면 return + if (mp < 5) return; // mp가 부족하면 return + mp -= 5; + hp = maxHp; + } + + public int pray(int sec) { + if (mp == maxMp) return 0; // 이미 max라면 return + + // 회복량 recoveryMp에 저장 + int recoveryMp = rand.nextInt(3) + sec; // 0~2 랜덤값 + 기도 시간(s) + + // maxMp 보다 더 회복하는가? + if (recoveryMp + mp > maxMp) { + recoveryMp = maxMp - mp; + } + + // mp 회복 + mp += recoveryMp; + return recoveryMp; + } +} diff --git a/src/test/java/com/survivalcoding/ClericTest.java b/src/test/java/com/survivalcoding/ClericTest.java new file mode 100644 index 00000000..7acba4a2 --- /dev/null +++ b/src/test/java/com/survivalcoding/ClericTest.java @@ -0,0 +1,69 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ClericTest { + + @Test + void selfAid() { + } + + // MP가 꽉 찼을 때는 회복량 0 + // MP가 적을 때는 회복되어야 함 + // sec 가 0 이하면 그냥 0 리턴 + + @Test + @DisplayName("MP가 꽉 찼을 때는 회복량 0") + void pray() { + // MP가 꽉 + Cleric cleric = new Cleric(); + + int recoveredMp = cleric.pray(10); + + assertEquals(0, recoveredMp); + } + + @Test + @DisplayName("MP가 0일 때 회복되어야 함") + void pray2() { + // MP 적게 + Cleric cleric = new Cleric(); + cleric.mp = 0; + + int recoveredMp = cleric.pray(1); // 1 ~ 3 + + assertTrue(recoveredMp >= 1); + assertTrue(recoveredMp <= 3); + + cleric.mp = 0; + + recoveredMp = cleric.pray(8); // 8 ~ 11 + + assertTrue(recoveredMp >= 8); + assertTrue(recoveredMp <= 11); + assertTrue(recoveredMp <= cleric.maxMp); + } + + @Test + @DisplayName("MP가 5일 때 회복되어야 함") + void pray3() { + // MP 적게 + Cleric cleric = new Cleric(); + cleric.mp = 5; + + int recoveredMp = cleric.pray(1); // 6 ~ 8 + System.out.println(recoveredMp); + + assertTrue(cleric.mp >= 6); + assertTrue(cleric.mp <= 8); + + cleric.mp = 5; + + recoveredMp = cleric.pray(8); // 8 ~ 11 + + assertEquals(5, recoveredMp); + } +} \ No newline at end of file From 2722a75fd44d19a32c7970c9ca50c0d28de9a930 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Mon, 16 Jun 2025 13:41:58 +0900 Subject: [PATCH 03/45] =?UTF-8?q?feat:=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=88=98=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Hero.java | 49 ++++++++++++++++++++ src/main/java/com/survivalcoding/Sword.java | 23 +++++++++ src/main/java/com/survivalcoding/Wizard.java | 10 ++++ 3 files changed, 82 insertions(+) create mode 100644 src/main/java/com/survivalcoding/Hero.java create mode 100644 src/main/java/com/survivalcoding/Sword.java create mode 100644 src/main/java/com/survivalcoding/Wizard.java diff --git a/src/main/java/com/survivalcoding/Hero.java b/src/main/java/com/survivalcoding/Hero.java new file mode 100644 index 00000000..771f1111 --- /dev/null +++ b/src/main/java/com/survivalcoding/Hero.java @@ -0,0 +1,49 @@ +package com.survivalcoding; + + +import java.util.Random; + +public class Hero { + // 공유자원 + static int money = 100; + + String name; // null + int hp; // 0 + Sword sword; // null + + static void setRandomMoney() { + Hero.money = new Random().nextInt(1000); + + Hero hero = new Hero("aaa", 10); + hero.name = "홍길동"; + } + + public Hero(String name, int hp) { + this.name = name; + this.hp = hp; + } + + public static void main(String[] args) { + int a = 10; + + Hero.money = 500; + + Hero hero1 = new Hero("홍길동", 100); + System.out.println(Hero.money); + + + Hero hero2 = hero1; + hero2.hp = 200; + System.out.println(hero1.hp); + + Sword sword1 = new Sword(); + sword1.damage = 100; + + hero1.sword = sword1; + + hero1 = null; +// String name = new String("오준석"); + + System.out.println(hero2.hp); + } +} diff --git a/src/main/java/com/survivalcoding/Sword.java b/src/main/java/com/survivalcoding/Sword.java new file mode 100644 index 00000000..b8be7c8d --- /dev/null +++ b/src/main/java/com/survivalcoding/Sword.java @@ -0,0 +1,23 @@ +package com.survivalcoding; + +public class Sword { + String name; + int damage; + + Sword() { + this("기본 이름"); + } + + Sword(String name) { + this.name = name; + damage = 10; + } + + public static void main(String[] args) { + Sword sword = new Sword("엑스칼리버"); + Sword sword2 = new Sword(); + + System.out.println(sword.name); + System.out.println(sword.damage); + } +} diff --git a/src/main/java/com/survivalcoding/Wizard.java b/src/main/java/com/survivalcoding/Wizard.java new file mode 100644 index 00000000..68a06faa --- /dev/null +++ b/src/main/java/com/survivalcoding/Wizard.java @@ -0,0 +1,10 @@ +package com.survivalcoding; + +public class Wizard { + String name; + int hp; + + void heal(Hero hero) { + hero.hp += 10; + } +} From c049ad59be2079bb2c33755c19916c701c092ff9 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 17 Jun 2025 09:38:15 +0900 Subject: [PATCH 04/45] =?UTF-8?q?feat:=20=ED=81=B4=EB=A0=88=EB=A6=AD=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20maxHp,maxMp=20=EB=A5=BC?= =?UTF-8?q?=20static=20=EC=9C=BC=EB=A1=9C=20=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Cleric.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/survivalcoding/Cleric.java b/src/main/java/com/survivalcoding/Cleric.java index f4045ab1..0dc97fcc 100644 --- a/src/main/java/com/survivalcoding/Cleric.java +++ b/src/main/java/com/survivalcoding/Cleric.java @@ -6,8 +6,8 @@ public class Cleric { String name; int hp = 50; int mp = 10; - final int maxHp = 50; - final int maxMp = 10; + static final int maxHp = 50; + static final int maxMp = 10; // 난수 생성을 위한 Random 객체 한번만 만들자 Random rand = new Random(); From 20a719ea912b770e236df77f35fa24c8d5789ffe Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 17 Jun 2025 09:47:48 +0900 Subject: [PATCH 05/45] =?UTF-8?q?feat:=20=ED=81=B4=EB=A0=88=EB=A6=AD=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9E=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Cleric.java | 25 ++++++++-- .../java/com/survivalcoding/ClericTest.java | 48 ++++++------------- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/survivalcoding/Cleric.java b/src/main/java/com/survivalcoding/Cleric.java index 0dc97fcc..acd94c43 100644 --- a/src/main/java/com/survivalcoding/Cleric.java +++ b/src/main/java/com/survivalcoding/Cleric.java @@ -3,15 +3,34 @@ import java.util.Random; public class Cleric { - String name; - int hp = 50; - int mp = 10; static final int maxHp = 50; static final int maxMp = 10; + String name; + int hp; + int mp; + // 난수 생성을 위한 Random 객체 한번만 만들자 Random rand = new Random(); + Cleric(String name, int hp, int mp) { + this.name = name; + this.hp = hp; + this.mp = mp; + } + + Cleric(String name, int hp) { + this.name = name; + this.hp = hp; + this.mp = Cleric.maxMp; + } + + Cleric(String name) { + this.name = name; + this.hp = Cleric.maxHp; + this.mp = Cleric.maxMp; + } + public void selfAid() { if (hp == maxHp) return; // 이미 max라면 return if (mp < 5) return; // mp가 부족하면 return diff --git a/src/test/java/com/survivalcoding/ClericTest.java b/src/test/java/com/survivalcoding/ClericTest.java index 7acba4a2..3fc55499 100644 --- a/src/test/java/com/survivalcoding/ClericTest.java +++ b/src/test/java/com/survivalcoding/ClericTest.java @@ -19,7 +19,7 @@ void selfAid() { @DisplayName("MP가 꽉 찼을 때는 회복량 0") void pray() { // MP가 꽉 - Cleric cleric = new Cleric(); + Cleric cleric = new Cleric("아서스", 40, 10); int recoveredMp = cleric.pray(10); @@ -27,43 +27,23 @@ void pray() { } @Test - @DisplayName("MP가 0일 때 회복되어야 함") - void pray2() { - // MP 적게 - Cleric cleric = new Cleric(); - cleric.mp = 0; + void 클레릭_생성자_테스트() { + Cleric cleric = new Cleric("아서스", 40, 5); - int recoveredMp = cleric.pray(1); // 1 ~ 3 + assertEquals("아서스", cleric.name); + assertEquals(40, cleric.hp); + assertEquals(5, cleric.mp); - assertTrue(recoveredMp >= 1); - assertTrue(recoveredMp <= 3); + cleric = new Cleric("아서스", 35); - cleric.mp = 0; + assertEquals("아서스", cleric.name); + assertEquals(35, cleric.hp); + assertEquals(Cleric.maxMp, cleric.mp); - recoveredMp = cleric.pray(8); // 8 ~ 11 + cleric = new Cleric("아서스"); - assertTrue(recoveredMp >= 8); - assertTrue(recoveredMp <= 11); - assertTrue(recoveredMp <= cleric.maxMp); - } - - @Test - @DisplayName("MP가 5일 때 회복되어야 함") - void pray3() { - // MP 적게 - Cleric cleric = new Cleric(); - cleric.mp = 5; - - int recoveredMp = cleric.pray(1); // 6 ~ 8 - System.out.println(recoveredMp); - - assertTrue(cleric.mp >= 6); - assertTrue(cleric.mp <= 8); - - cleric.mp = 5; - - recoveredMp = cleric.pray(8); // 8 ~ 11 - - assertEquals(5, recoveredMp); + assertEquals("아서스", cleric.name); + assertEquals(Cleric.maxHp, cleric.hp); + assertEquals(Cleric.maxMp, cleric.mp); } } \ No newline at end of file From 3b3b2ad40d9474bcd95e8873bd428644b10f2793 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 17 Jun 2025 09:51:13 +0900 Subject: [PATCH 06/45] =?UTF-8?q?refactor:=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=20=EC=A4=91=EB=B3=B5=20=EC=BD=94=EB=93=9C=20=EC=9E=AC=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Cleric.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/survivalcoding/Cleric.java b/src/main/java/com/survivalcoding/Cleric.java index acd94c43..9bb559bd 100644 --- a/src/main/java/com/survivalcoding/Cleric.java +++ b/src/main/java/com/survivalcoding/Cleric.java @@ -20,15 +20,11 @@ public class Cleric { } Cleric(String name, int hp) { - this.name = name; - this.hp = hp; - this.mp = Cleric.maxMp; + this(name, hp, Cleric.maxMp); } Cleric(String name) { - this.name = name; - this.hp = Cleric.maxHp; - this.mp = Cleric.maxMp; + this(name, Cleric.maxHp); } public void selfAid() { From 64c2521c8e70649aa55e5b2f57b5c83d9eae879b Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 17 Jun 2025 11:55:33 +0900 Subject: [PATCH 07/45] =?UTF-8?q?feat:=20=EC=BA=A1=EC=8A=90=ED=99=94=20?= =?UTF-8?q?=EC=88=98=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Hero.java | 27 +++++++++++++++---- src/main/java/com/survivalcoding/Wizard.java | 3 ++- src/main/java/com/survivalcoding/game.puml | 25 +++++++++++++++++ .../java/com/survivalcoding/HeroTest.java | 24 +++++++++++++++++ 4 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/survivalcoding/game.puml create mode 100644 src/test/java/com/survivalcoding/HeroTest.java diff --git a/src/main/java/com/survivalcoding/Hero.java b/src/main/java/com/survivalcoding/Hero.java index 771f1111..3f7fa292 100644 --- a/src/main/java/com/survivalcoding/Hero.java +++ b/src/main/java/com/survivalcoding/Hero.java @@ -5,13 +5,28 @@ public class Hero { // 공유자원 - static int money = 100; + public static int money = 100; - String name; // null - int hp; // 0 - Sword sword; // null + private String name; // null + private int hp; // 0 + private Sword sword; // null - static void setRandomMoney() { + public int getHp() { + return hp; + } + + public void setHp(int hp) { + if (hp < 0) { + throw new IllegalArgumentException("hp는 음수가 될 수 없음"); + } + this.hp = hp; + } + + public void attack(Kinoko kinoko) { + + } + + public static void setRandomMoney() { Hero.money = new Random().nextInt(1000); Hero hero = new Hero("aaa", 10); @@ -31,6 +46,8 @@ public static void main(String[] args) { Hero hero1 = new Hero("홍길동", 100); System.out.println(Hero.money); + hero1.setHp(-10); + Hero hero2 = hero1; hero2.hp = 200; diff --git a/src/main/java/com/survivalcoding/Wizard.java b/src/main/java/com/survivalcoding/Wizard.java index 68a06faa..b2ac8233 100644 --- a/src/main/java/com/survivalcoding/Wizard.java +++ b/src/main/java/com/survivalcoding/Wizard.java @@ -5,6 +5,7 @@ public class Wizard { int hp; void heal(Hero hero) { - hero.hp += 10; +// hero.hp += 10; + hero.setHp(hero.getHp() + 10); } } diff --git a/src/main/java/com/survivalcoding/game.puml b/src/main/java/com/survivalcoding/game.puml new file mode 100644 index 00000000..5a16a28c --- /dev/null +++ b/src/main/java/com/survivalcoding/game.puml @@ -0,0 +1,25 @@ +@startuml +'https://plantuml.com/class-diagram + +scale 2 + +class Hero { + + String name + - int hp + + + void attack(Kinoko enemy) + + void bye() + - void die() +} + +class Cleric { + + String name + - int hp + + int mp + + + void attack(Kinoko enemy) + + void pray(int sec) + + void selfAid() +} + +@enduml \ No newline at end of file diff --git a/src/test/java/com/survivalcoding/HeroTest.java b/src/test/java/com/survivalcoding/HeroTest.java new file mode 100644 index 00000000..632d0ff2 --- /dev/null +++ b/src/test/java/com/survivalcoding/HeroTest.java @@ -0,0 +1,24 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class HeroTest { + + @Test + void heroTest() { + Hero hero = new Hero("영웅", 100); + assertEquals(100, hero.getHp()); + + hero.setHp(0); + assertEquals(0, hero.getHp()); + hero.setHp(1); + assertEquals(1, hero.getHp()); + + assertThrows(IllegalArgumentException.class, () -> { + hero.setHp(-100); + }); + + } +} \ No newline at end of file From 97aa68313a38962b32c41a5f8b6288b3cb2cb491 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Mon, 23 Jun 2025 09:54:10 +0900 Subject: [PATCH 08/45] =?UTF-8?q?feat:=20=EC=BA=A1=EC=8A=90=ED=99=94=20Wan?= =?UTF-8?q?d,=20Wizard=20=EA=B3=BC=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Wand.java | 39 ++++++++++++ src/main/java/com/survivalcoding/Wizard.java | 63 +++++++++++++++++-- .../java/com/survivalcoding/WandTest.java | 45 +++++++++++++ 3 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/survivalcoding/Wand.java create mode 100644 src/test/java/com/survivalcoding/WandTest.java diff --git a/src/main/java/com/survivalcoding/Wand.java b/src/main/java/com/survivalcoding/Wand.java new file mode 100644 index 00000000..960b5edd --- /dev/null +++ b/src/main/java/com/survivalcoding/Wand.java @@ -0,0 +1,39 @@ +package com.survivalcoding; + +public class Wand { + private String name; // null + private double power; // 0.0 + + public Wand(String name) { + this.name = name; + this.power = 10.0; + } + + public Wand(String name, double power) { + this.name = name; + this.power = power; + } + + public String getName() { + return name; + } + + public void setName(String name) { + if (name == null) { + throw new IllegalArgumentException("지팡이의 이름은 null 일 수 없다"); + } + if (name.length() < 3) { + throw new IllegalArgumentException("지팡이의 이름은 3문자 이상이어야 한다"); + } + + this.name = name; + } + + public double getPower() { + return power; + } + + public void setPower(double power) { + this.power = power; + } +} diff --git a/src/main/java/com/survivalcoding/Wizard.java b/src/main/java/com/survivalcoding/Wizard.java index b2ac8233..02584223 100644 --- a/src/main/java/com/survivalcoding/Wizard.java +++ b/src/main/java/com/survivalcoding/Wizard.java @@ -1,11 +1,66 @@ package com.survivalcoding; public class Wizard { - String name; - int hp; + private String name; + private int hp; + private int mp; + private Wand wand; - void heal(Hero hero) { -// hero.hp += 10; + public Wizard(String name) { + this(name, null); + } + + public Wizard(String name, Wand wand) { + this.name = name; + this.wand = wand; + this.hp = 100; + this.mp = 50; + } + + public Wizard(String name, int hp, int mp, Wand wand) { + this.name = name; + this.hp = hp; + this.mp = mp; + this.wand = wand; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getHp() { + return hp; + } + + public void setHp(int hp) { + this.hp = hp; + + if (this.hp < 0) { + this.hp = 0; + } + } + + public int getMp() { + return mp; + } + + public void setMp(int mp) { + this.mp = mp; + } + + public Wand getWand() { + return wand; + } + + public void setWand(Wand wand) { + this.wand = wand; + } + + public void heal(Hero hero) { hero.setHp(hero.getHp() + 10); } } diff --git a/src/test/java/com/survivalcoding/WandTest.java b/src/test/java/com/survivalcoding/WandTest.java new file mode 100644 index 00000000..1586ad53 --- /dev/null +++ b/src/test/java/com/survivalcoding/WandTest.java @@ -0,0 +1,45 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class WandTest { + Wand wand; + + @BeforeEach + void setUp() { + wand = new Wand("꾸부러진 지팡이"); + } + + @AfterEach + void tearDown() { +// System.out.println("끝날 때"); + } + + @Test + @DisplayName("지팡이의 이름은 null 일 수 없다") + void setNameTest1() { + assertThrows(IllegalArgumentException.class, () -> { + wand.setName(null); + }); + } + + @Test + @DisplayName("지팡이의 이름은 3문자 이상이어야 한다") + void setNameTest2() { + wand.setName("aaaa"); + assertEquals("aaaa", wand.getName()); + + wand.setName("aaa"); + assertEquals("aaa", wand.getName()); + + assertThrows(IllegalArgumentException.class, () -> { + wand.setName("aa"); + }); + } +} \ No newline at end of file From bc3e5ac08da8dcb39c0f1fbf9d4f2c3950082dd2 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Mon, 23 Jun 2025 09:55:42 +0900 Subject: [PATCH 09/45] =?UTF-8?q?feat:=20=EC=BA=A1=EC=8A=90=ED=99=94=20Wan?= =?UTF-8?q?d,=20Wizard=20=EA=B3=BC=EC=A0=9C=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Wand.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/survivalcoding/Wand.java b/src/main/java/com/survivalcoding/Wand.java index 960b5edd..d6157426 100644 --- a/src/main/java/com/survivalcoding/Wand.java +++ b/src/main/java/com/survivalcoding/Wand.java @@ -5,12 +5,11 @@ public class Wand { private double power; // 0.0 public Wand(String name) { - this.name = name; - this.power = 10.0; + this(name, 10.0); } public Wand(String name, double power) { - this.name = name; + setName(name); this.power = power; } From a0fa1177e764ddc8baa8b2e42566986cd372d2ca Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Mon, 23 Jun 2025 10:07:34 +0900 Subject: [PATCH 10/45] =?UTF-8?q?feat:=20=EC=BA=A1=EC=8A=90=ED=99=94=20Per?= =?UTF-8?q?son=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Person.java | 28 +++++++++++++++++++ .../java/com/survivalcoding/PersonTest.java | 16 +++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/main/java/com/survivalcoding/Person.java create mode 100644 src/test/java/com/survivalcoding/PersonTest.java diff --git a/src/main/java/com/survivalcoding/Person.java b/src/main/java/com/survivalcoding/Person.java new file mode 100644 index 00000000..a47b424a --- /dev/null +++ b/src/main/java/com/survivalcoding/Person.java @@ -0,0 +1,28 @@ +package com.survivalcoding; + +import java.util.Calendar; + +public class Person { + private final String name; + private final int birthYear; + + public String getName() { + return name; + } + + public int getBirthYear() { + return birthYear; + } + + public int getAge() { + Calendar calendar = Calendar.getInstance(); + int year = calendar.get(Calendar.YEAR); + + return year - birthYear; + } + + public Person(String name, int birthYear) { + this.name = name; + this.birthYear = birthYear; + } +} diff --git a/src/test/java/com/survivalcoding/PersonTest.java b/src/test/java/com/survivalcoding/PersonTest.java new file mode 100644 index 00000000..64ff1c46 --- /dev/null +++ b/src/test/java/com/survivalcoding/PersonTest.java @@ -0,0 +1,16 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PersonTest { + + @Test + @DisplayName("2000년 생은 25살이다") + void getAge() { + Person person = new Person("홍길동", 2000); + assertEquals(25, person.getAge()); + } +} \ No newline at end of file From 7cd2da6b2d7959b8213cce013776d2d42de2cde1 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 24 Jun 2025 08:18:48 +0900 Subject: [PATCH 11/45] =?UTF-8?q?feat:=20=EC=83=81=EC=86=8D=20=EC=88=98?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Hero.java | 4 ++ .../java/com/survivalcoding/SuperHero.java | 46 +++++++++++++++++++ src/main/java/com/survivalcoding/Wand.java | 4 ++ src/main/java/com/survivalcoding/game.puml | 17 +++++-- 4 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/survivalcoding/SuperHero.java diff --git a/src/main/java/com/survivalcoding/Hero.java b/src/main/java/com/survivalcoding/Hero.java index 3f7fa292..a6de2887 100644 --- a/src/main/java/com/survivalcoding/Hero.java +++ b/src/main/java/com/survivalcoding/Hero.java @@ -23,7 +23,11 @@ public void setHp(int hp) { } public void attack(Kinoko kinoko) { + System.out.println("attack"); + } + public void run() { + System.out.println("run"); } public static void setRandomMoney() { diff --git a/src/main/java/com/survivalcoding/SuperHero.java b/src/main/java/com/survivalcoding/SuperHero.java new file mode 100644 index 00000000..f7d37eff --- /dev/null +++ b/src/main/java/com/survivalcoding/SuperHero.java @@ -0,0 +1,46 @@ +package com.survivalcoding; + +import java.awt.image.Kernel; + +// sub-class extends super-class +public class SuperHero extends Hero { + private boolean isFlying; + + public SuperHero(String name, int hp) { + super(name, hp); + } + + public boolean isFlying() { + return isFlying; + } + + public void setFlying(boolean flying) { + isFlying = flying; + } + + @Override + public void run() { + System.out.println("오버라이드된 run"); + } + + @Override + public void attack(Kinoko kinoko) { + super.attack(kinoko); + + if (isFlying) { + System.out.println("날고 있다"); + } + + super.attack(kinoko); + } + + public static void main(String[] args) { + Hero hero = new Hero("aaa", 10); + + SuperHero superHero = new SuperHero("aaa", 10); + superHero.run(); + + superHero.setFlying(true); + superHero.attack(new Kinoko()); + } +} diff --git a/src/main/java/com/survivalcoding/Wand.java b/src/main/java/com/survivalcoding/Wand.java index d6157426..cebf9630 100644 --- a/src/main/java/com/survivalcoding/Wand.java +++ b/src/main/java/com/survivalcoding/Wand.java @@ -33,6 +33,10 @@ public double getPower() { } public void setPower(double power) { + // 0.5 이상 100.0 이하 + if (!(0.5 <= power && power <= 100.0)) { + throw new IllegalArgumentException("지팡이의 마력은 0.5 이상 100.0 이하여야 함"); + } this.power = power; } } diff --git a/src/main/java/com/survivalcoding/game.puml b/src/main/java/com/survivalcoding/game.puml index 5a16a28c..bd217abb 100644 --- a/src/main/java/com/survivalcoding/game.puml +++ b/src/main/java/com/survivalcoding/game.puml @@ -3,10 +3,21 @@ scale 2 -class Hero { - + String name - - int hp +class SuperHero extends Hero { + + boolean isFlying +} + +class Character { + String name + int hp +} + +class Wizard extends Character { + int mp + + void heal(Hero hero) +} +class Hero extends Character { + void attack(Kinoko enemy) + void bye() - void die() From 8e6ae5ef4686fbd70cf64a10e2107b7d70df0ac9 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 24 Jun 2025 09:49:46 +0900 Subject: [PATCH 12/45] =?UTF-8?q?feat:=20=EC=83=81=EC=86=8D=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=9C=20=EB=A6=AC=EB=B7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- .../java/com/survivalcoding/PoisonSlime.java | 36 ++++++++++ src/main/java/com/survivalcoding/Slime.java | 38 ++++++++++ .../com/survivalcoding/PoisonSlimeTest.java | 71 +++++++++++++++++++ 4 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/survivalcoding/PoisonSlime.java create mode 100644 src/main/java/com/survivalcoding/Slime.java create mode 100644 src/test/java/com/survivalcoding/PoisonSlimeTest.java diff --git a/.gitignore b/.gitignore index c1e48cd1..516c9c12 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,6 @@ bin/ ### Mac OS ### .DS_Store -.idea/ \ No newline at end of file +.idea/ +.claude/ +CLAUDE.md \ No newline at end of file diff --git a/src/main/java/com/survivalcoding/PoisonSlime.java b/src/main/java/com/survivalcoding/PoisonSlime.java new file mode 100644 index 00000000..e72d37b9 --- /dev/null +++ b/src/main/java/com/survivalcoding/PoisonSlime.java @@ -0,0 +1,36 @@ +package com.survivalcoding; + +public class PoisonSlime extends Slime { + public static final int MAX_HP = 10; + public static final int DEFAULT_POISON_COUNT = 5; + + private int poisonCount = DEFAULT_POISON_COUNT; + + public PoisonSlime(String prefix, int hp) { + super(prefix, hp); + } + + public PoisonSlime(String prefix) { + super(prefix, MAX_HP); + } + + public int getPoisonCount() { + return poisonCount; + } + + @Override + public void attack(Hero hero) { + super.attack(hero); // Slime 의 공격 + + if (poisonCount > 0) { + System.out.println("추가로, 독 포자를 살포했다!"); + + int damage = hero.getHp() / 5; + hero.setHp(hero.getHp() - damage); + System.out.println(damage + "포인트의 데미지"); + poisonCount--; + } + } + +} + diff --git a/src/main/java/com/survivalcoding/Slime.java b/src/main/java/com/survivalcoding/Slime.java new file mode 100644 index 00000000..5d9e1148 --- /dev/null +++ b/src/main/java/com/survivalcoding/Slime.java @@ -0,0 +1,38 @@ +package com.survivalcoding; + +public class Slime { + public static final int DEFAULT_DAMAGE = 10; + + private final String prefix; + private int hp; + private int damage = DEFAULT_DAMAGE; + + public Slime(String prefix, int hp) { + this.prefix = prefix; + this.hp = hp; + } + + public String getPrefix() { + return prefix; + } + + public int getHp() { + return hp; + } + + public void setHp(int hp) { + this.hp = hp; + } + + public int getDamage() { + return damage; + } + + public void setDamage(int damage) { + this.damage = damage; + } + + public void attack(Hero hero) { + hero.setHp(hero.getHp() - damage); + } +} diff --git a/src/test/java/com/survivalcoding/PoisonSlimeTest.java b/src/test/java/com/survivalcoding/PoisonSlimeTest.java new file mode 100644 index 00000000..addbf6f4 --- /dev/null +++ b/src/test/java/com/survivalcoding/PoisonSlimeTest.java @@ -0,0 +1,71 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PoisonSlimeTest { + PoisonSlime poisonSlime; + Hero hero; + + @BeforeEach + void setUp() { + poisonSlime = new PoisonSlime("A"); + hero = new Hero("홍길동", 1000000); + } + + @Test + @DisplayName("독 공격 횟수 테스트") + void attack() { + assertEquals(PoisonSlime.DEFAULT_POISON_COUNT, poisonSlime.getPoisonCount()); + + for (int i = 0; i < PoisonSlime.DEFAULT_POISON_COUNT; i++) { + poisonSlime.attack(hero); + } + + assertEquals(0, poisonSlime.getPoisonCount()); + + // 한 번 더 공격 + poisonSlime.attack(hero); + assertEquals(0, poisonSlime.getPoisonCount()); + } + + @Test + @DisplayName("일반 데미지 확인") + void attack2() { + assertEquals(PoisonSlime.DEFAULT_POISON_COUNT, poisonSlime.getPoisonCount()); + + for (int i = 0; i < PoisonSlime.DEFAULT_POISON_COUNT; i++) { + poisonSlime.attack(hero); + } + + assertEquals(0, poisonSlime.getPoisonCount()); + + // 한 번 더 공격해서 일반 데미지 확인 + Hero hero1 = new Hero("김씨", 100); + int expectedHeroHp = hero1.getHp() - PoisonSlime.DEFAULT_DAMAGE; + + poisonSlime.attack(hero1); + assertEquals(expectedHeroHp, hero1.getHp()); + } + + @Test + @DisplayName("독 공격 확인") + void attack3() { + assertEquals(PoisonSlime.DEFAULT_POISON_COUNT, poisonSlime.getPoisonCount()); + + for (int i = 0; i < PoisonSlime.DEFAULT_POISON_COUNT; i++) { + Hero hero1 = new Hero("실험체", 100); + int expectedHeroHp = hero1.getHp() - PoisonSlime.DEFAULT_DAMAGE; + + poisonSlime.attack(hero1); + + assertNotEquals(expectedHeroHp, hero1.getHp()); + assertTrue(expectedHeroHp > hero1.getHp()); + } + + assertEquals(0, poisonSlime.getPoisonCount()); + } +} \ No newline at end of file From 7f046c8538f28afe0ec5f46cf7a03fef8f86322e Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 24 Jun 2025 11:58:42 +0900 Subject: [PATCH 13/45] =?UTF-8?q?feat:=20=EC=B6=94=EC=83=81=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4,=20Interface=20=EC=88=98=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Character.java | 10 ++++++++++ src/main/java/com/survivalcoding/Cleric.java | 7 ++++++- src/main/java/com/survivalcoding/game.puml | 14 +++++++++++--- .../com/survivalcoding/monster/FlyingMonster.java | 9 +++++++++ .../java/com/survivalcoding/monster/Goblin.java | 15 +++++++++++++++ .../java/com/survivalcoding/monster/Monster.java | 9 +++++++++ .../survivalcoding/monster/WalkingMonster.java | 9 +++++++++ .../java/com/survivalcoding/monster/WarWolf.java | 15 +++++++++++++++ .../java/com/survivalcoding/PoisonSlimeTest.java | 4 ++-- 9 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/survivalcoding/Character.java create mode 100644 src/main/java/com/survivalcoding/monster/FlyingMonster.java create mode 100644 src/main/java/com/survivalcoding/monster/Goblin.java create mode 100644 src/main/java/com/survivalcoding/monster/Monster.java create mode 100644 src/main/java/com/survivalcoding/monster/WalkingMonster.java create mode 100644 src/main/java/com/survivalcoding/monster/WarWolf.java diff --git a/src/main/java/com/survivalcoding/Character.java b/src/main/java/com/survivalcoding/Character.java new file mode 100644 index 00000000..30df6ab7 --- /dev/null +++ b/src/main/java/com/survivalcoding/Character.java @@ -0,0 +1,10 @@ +package com.survivalcoding; + +public abstract class Character { + + public abstract void attack(Slime slime); + + public static void main(String[] args) { +// Character c = new Character(); + } +} diff --git a/src/main/java/com/survivalcoding/Cleric.java b/src/main/java/com/survivalcoding/Cleric.java index 9bb559bd..112e72df 100644 --- a/src/main/java/com/survivalcoding/Cleric.java +++ b/src/main/java/com/survivalcoding/Cleric.java @@ -2,7 +2,7 @@ import java.util.Random; -public class Cleric { +public class Cleric extends Character { static final int maxHp = 50; static final int maxMp = 10; @@ -49,4 +49,9 @@ public int pray(int sec) { mp += recoveryMp; return recoveryMp; } + + @Override + public void attack(Slime slime) { + + } } diff --git a/src/main/java/com/survivalcoding/game.puml b/src/main/java/com/survivalcoding/game.puml index bd217abb..45cfab00 100644 --- a/src/main/java/com/survivalcoding/game.puml +++ b/src/main/java/com/survivalcoding/game.puml @@ -1,13 +1,20 @@ @startuml 'https://plantuml.com/class-diagram -scale 2 +scale 1.5 class SuperHero extends Hero { + boolean isFlying } -class Character { +interface Attackable { + {abstract} void attack(Slime slime) +} + +class SoccerPlayer implements Attackable { +} + +abstract class Character implements Attackable { String name int hp } @@ -15,10 +22,11 @@ class Character { class Wizard extends Character { int mp + void heal(Hero hero) + + void attack(Slime slime) } class Hero extends Character { - + void attack(Kinoko enemy) + + void attack(Slime slime) + void bye() - void die() } diff --git a/src/main/java/com/survivalcoding/monster/FlyingMonster.java b/src/main/java/com/survivalcoding/monster/FlyingMonster.java new file mode 100644 index 00000000..1fc8d04c --- /dev/null +++ b/src/main/java/com/survivalcoding/monster/FlyingMonster.java @@ -0,0 +1,9 @@ +package com.survivalcoding.monster; + +public abstract class FlyingMonster extends Monster { + + @Override + public void run() { + System.out.println("FlyingMonster run"); + } +} diff --git a/src/main/java/com/survivalcoding/monster/Goblin.java b/src/main/java/com/survivalcoding/monster/Goblin.java new file mode 100644 index 00000000..ca87f584 --- /dev/null +++ b/src/main/java/com/survivalcoding/monster/Goblin.java @@ -0,0 +1,15 @@ +package com.survivalcoding.monster; + +public class Goblin extends WalkingMonster { + @Override + public void attack() { + System.out.println("Goblin attack"); + } + + @Override + public void run() { + super.run(); + + System.out.println("Goblin run"); + } +} diff --git a/src/main/java/com/survivalcoding/monster/Monster.java b/src/main/java/com/survivalcoding/monster/Monster.java new file mode 100644 index 00000000..3f096e27 --- /dev/null +++ b/src/main/java/com/survivalcoding/monster/Monster.java @@ -0,0 +1,9 @@ +package com.survivalcoding.monster; + +public abstract class Monster { + private int hp; + private int mp; + + public abstract void attack(); + public abstract void run(); +} diff --git a/src/main/java/com/survivalcoding/monster/WalkingMonster.java b/src/main/java/com/survivalcoding/monster/WalkingMonster.java new file mode 100644 index 00000000..620be389 --- /dev/null +++ b/src/main/java/com/survivalcoding/monster/WalkingMonster.java @@ -0,0 +1,9 @@ +package com.survivalcoding.monster; + +public abstract class WalkingMonster extends Monster { + + @Override + public void run() { + System.out.println("WalkingMonster run"); + } +} diff --git a/src/main/java/com/survivalcoding/monster/WarWolf.java b/src/main/java/com/survivalcoding/monster/WarWolf.java new file mode 100644 index 00000000..209e5e8f --- /dev/null +++ b/src/main/java/com/survivalcoding/monster/WarWolf.java @@ -0,0 +1,15 @@ +package com.survivalcoding.monster; + +public class WarWolf extends WalkingMonster { + @Override + public void attack() { + System.out.println("WarWolf attack"); + } + + @Override + public void run() { + super.run(); + + System.out.println("WarWolf run"); + } +} diff --git a/src/test/java/com/survivalcoding/PoisonSlimeTest.java b/src/test/java/com/survivalcoding/PoisonSlimeTest.java index addbf6f4..e9433f3e 100644 --- a/src/test/java/com/survivalcoding/PoisonSlimeTest.java +++ b/src/test/java/com/survivalcoding/PoisonSlimeTest.java @@ -45,7 +45,7 @@ void attack2() { // 한 번 더 공격해서 일반 데미지 확인 Hero hero1 = new Hero("김씨", 100); - int expectedHeroHp = hero1.getHp() - PoisonSlime.DEFAULT_DAMAGE; + final int expectedHeroHp = hero1.getHp() - PoisonSlime.DEFAULT_DAMAGE; poisonSlime.attack(hero1); assertEquals(expectedHeroHp, hero1.getHp()); @@ -58,7 +58,7 @@ void attack3() { for (int i = 0; i < PoisonSlime.DEFAULT_POISON_COUNT; i++) { Hero hero1 = new Hero("실험체", 100); - int expectedHeroHp = hero1.getHp() - PoisonSlime.DEFAULT_DAMAGE; + final int expectedHeroHp = hero1.getHp() - PoisonSlime.DEFAULT_DAMAGE; poisonSlime.attack(hero1); From e1dc083f1414bddd88d6e5ef69e44fa3be72f965 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Mon, 30 Jun 2025 09:31:26 +0900 Subject: [PATCH 14/45] =?UTF-8?q?feat:=20=EC=B6=94=EC=83=81=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4,=20Interface=20=EA=B3=BC=EC=A0=9C=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/survivalcoding/asset/Book.java | 19 ++++++++++ .../com/survivalcoding/asset/Computer.java | 18 +++++++++ .../survivalcoding/asset/TangibleAsset.java | 37 +++++++++++++++++++ .../java/com/survivalcoding/asset/asset.puml | 17 +++++++++ 4 files changed, 91 insertions(+) create mode 100644 src/main/java/com/survivalcoding/asset/Book.java create mode 100644 src/main/java/com/survivalcoding/asset/Computer.java create mode 100644 src/main/java/com/survivalcoding/asset/TangibleAsset.java create mode 100644 src/main/java/com/survivalcoding/asset/asset.puml diff --git a/src/main/java/com/survivalcoding/asset/Book.java b/src/main/java/com/survivalcoding/asset/Book.java new file mode 100644 index 00000000..acf5686c --- /dev/null +++ b/src/main/java/com/survivalcoding/asset/Book.java @@ -0,0 +1,19 @@ +package com.survivalcoding.asset; + +public class Book extends TangibleAsset { + + private String isbn; + + public Book(String name, int price, String color, String isbn) { + super(name, price, color); + this.isbn = isbn; + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } +} diff --git a/src/main/java/com/survivalcoding/asset/Computer.java b/src/main/java/com/survivalcoding/asset/Computer.java new file mode 100644 index 00000000..20f98bf0 --- /dev/null +++ b/src/main/java/com/survivalcoding/asset/Computer.java @@ -0,0 +1,18 @@ +package com.survivalcoding.asset; + +public class Computer extends TangibleAsset { + private String makerName; + + public Computer(String name, int price, String color, String makerName) { + super(name, price, color); + this.makerName = makerName; + } + + public String getMakerName() { + return makerName; + } + + public void setMakerName(String makerName) { + this.makerName = makerName; + } +} diff --git a/src/main/java/com/survivalcoding/asset/TangibleAsset.java b/src/main/java/com/survivalcoding/asset/TangibleAsset.java new file mode 100644 index 00000000..e8095def --- /dev/null +++ b/src/main/java/com/survivalcoding/asset/TangibleAsset.java @@ -0,0 +1,37 @@ +package com.survivalcoding.asset; + +public abstract class TangibleAsset { + private String name; + private int price; + private String color; + + public TangibleAsset(String name, int price, String color) { + this.name = name; + this.price = price; + this.color = color; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } +} diff --git a/src/main/java/com/survivalcoding/asset/asset.puml b/src/main/java/com/survivalcoding/asset/asset.puml new file mode 100644 index 00000000..19cef592 --- /dev/null +++ b/src/main/java/com/survivalcoding/asset/asset.puml @@ -0,0 +1,17 @@ +@startuml +scale 3 + +abstract class TangibleAsset { + String name + int price + String color +} + +class Book extends TangibleAsset { + String isbn +} + +class Computer extends TangibleAsset { + String isbn +} +@enduml \ No newline at end of file From 203ff5093360b267ba7a25e847741dc771e7a1c5 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Mon, 30 Jun 2025 09:36:57 +0900 Subject: [PATCH 15/45] =?UTF-8?q?feat:=20=EC=B6=94=EC=83=81=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4,=20Interface=20=EA=B3=BC=EC=A0=9C=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/survivalcoding/asset/Asset.java | 27 +++++++++++++++++++ .../survivalcoding/asset/TangibleAsset.java | 23 ++-------------- .../java/com/survivalcoding/asset/asset.puml | 10 ++++++- 3 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/survivalcoding/asset/Asset.java diff --git a/src/main/java/com/survivalcoding/asset/Asset.java b/src/main/java/com/survivalcoding/asset/Asset.java new file mode 100644 index 00000000..3536ba0e --- /dev/null +++ b/src/main/java/com/survivalcoding/asset/Asset.java @@ -0,0 +1,27 @@ +package com.survivalcoding.asset; + +public abstract class Asset { + private String name; + private int price; + + public Asset(String name, int price) { + this.name = name; + this.price = price; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } +} diff --git a/src/main/java/com/survivalcoding/asset/TangibleAsset.java b/src/main/java/com/survivalcoding/asset/TangibleAsset.java index e8095def..1631fae1 100644 --- a/src/main/java/com/survivalcoding/asset/TangibleAsset.java +++ b/src/main/java/com/survivalcoding/asset/TangibleAsset.java @@ -1,32 +1,13 @@ package com.survivalcoding.asset; -public abstract class TangibleAsset { - private String name; - private int price; +public abstract class TangibleAsset extends Asset { private String color; public TangibleAsset(String name, int price, String color) { - this.name = name; - this.price = price; + super(name, price); this.color = color; } - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getPrice() { - return price; - } - - public void setPrice(int price) { - this.price = price; - } - public String getColor() { return color; } diff --git a/src/main/java/com/survivalcoding/asset/asset.puml b/src/main/java/com/survivalcoding/asset/asset.puml index 19cef592..effc799b 100644 --- a/src/main/java/com/survivalcoding/asset/asset.puml +++ b/src/main/java/com/survivalcoding/asset/asset.puml @@ -1,9 +1,12 @@ @startuml scale 3 -abstract class TangibleAsset { +abstract class Asset { String name int price +} + +abstract class TangibleAsset extends Asset { String color } @@ -14,4 +17,9 @@ class Book extends TangibleAsset { class Computer extends TangibleAsset { String isbn } + +class Patent extends IntangibleAsset + +abstract class IntangibleAsset extends Asset { +} @enduml \ No newline at end of file From bcd1e25ce29261de8bf192dc11f8b31623fbd41a Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Mon, 30 Jun 2025 09:44:44 +0900 Subject: [PATCH 16/45] =?UTF-8?q?feat:=20=EC=B6=94=EC=83=81=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4,=20Interface=20=EA=B3=BC=EC=A0=9C=203~4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/asset/Book.java | 1 - .../com/survivalcoding/asset/TangibleAsset.java | 13 ++++++++++++- src/main/java/com/survivalcoding/asset/Thing.java | 6 ++++++ src/main/java/com/survivalcoding/asset/asset.puml | 10 ++++++++-- 4 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/survivalcoding/asset/Thing.java diff --git a/src/main/java/com/survivalcoding/asset/Book.java b/src/main/java/com/survivalcoding/asset/Book.java index acf5686c..f0ec22cb 100644 --- a/src/main/java/com/survivalcoding/asset/Book.java +++ b/src/main/java/com/survivalcoding/asset/Book.java @@ -1,7 +1,6 @@ package com.survivalcoding.asset; public class Book extends TangibleAsset { - private String isbn; public Book(String name, int price, String color, String isbn) { diff --git a/src/main/java/com/survivalcoding/asset/TangibleAsset.java b/src/main/java/com/survivalcoding/asset/TangibleAsset.java index 1631fae1..005dbb05 100644 --- a/src/main/java/com/survivalcoding/asset/TangibleAsset.java +++ b/src/main/java/com/survivalcoding/asset/TangibleAsset.java @@ -1,7 +1,8 @@ package com.survivalcoding.asset; -public abstract class TangibleAsset extends Asset { +public abstract class TangibleAsset extends Asset implements Thing { private String color; + private double weight; public TangibleAsset(String name, int price, String color) { super(name, price); @@ -15,4 +16,14 @@ public String getColor() { public void setColor(String color) { this.color = color; } + + @Override + public double getWeight() { + return weight; + } + + @Override + public void setWeight(double weight) { + this.weight = weight; + } } diff --git a/src/main/java/com/survivalcoding/asset/Thing.java b/src/main/java/com/survivalcoding/asset/Thing.java new file mode 100644 index 00000000..af684073 --- /dev/null +++ b/src/main/java/com/survivalcoding/asset/Thing.java @@ -0,0 +1,6 @@ +package com.survivalcoding.asset; + +public interface Thing { + double getWeight(); + void setWeight(double weight); +} diff --git a/src/main/java/com/survivalcoding/asset/asset.puml b/src/main/java/com/survivalcoding/asset/asset.puml index effc799b..f260e01b 100644 --- a/src/main/java/com/survivalcoding/asset/asset.puml +++ b/src/main/java/com/survivalcoding/asset/asset.puml @@ -1,13 +1,19 @@ @startuml scale 3 +interface Thing { + double getWeight() + void setWeight(double weight) +} + abstract class Asset { String name int price } -abstract class TangibleAsset extends Asset { +abstract class TangibleAsset extends Asset implements Thing { String color + double weight } class Book extends TangibleAsset { @@ -15,7 +21,7 @@ class Book extends TangibleAsset { } class Computer extends TangibleAsset { - String isbn + String makerName } class Patent extends IntangibleAsset From 48daf374159592bdb05edbb4656751ce36769796 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Mon, 30 Jun 2025 10:31:41 +0900 Subject: [PATCH 17/45] =?UTF-8?q?feat:=20=EC=B6=94=EC=83=81=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4,=20Interface=20=EA=B3=BC=EC=A0=9C=203~4=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/survivalcoding/asset/AssetMain.java | 30 +++++++++++++++++++ .../java/com/survivalcoding/asset/Book.java | 4 +-- .../com/survivalcoding/asset/Computer.java | 4 +-- .../survivalcoding/asset/TangibleAsset.java | 3 +- .../java/com/survivalcoding/asset/asset.puml | 2 +- 5 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/survivalcoding/asset/AssetMain.java diff --git a/src/main/java/com/survivalcoding/asset/AssetMain.java b/src/main/java/com/survivalcoding/asset/AssetMain.java new file mode 100644 index 00000000..fb340249 --- /dev/null +++ b/src/main/java/com/survivalcoding/asset/AssetMain.java @@ -0,0 +1,30 @@ +package com.survivalcoding.asset; + +import java.util.ArrayList; +import java.util.List; + +public class AssetMain { + public static void main(String[] args) { + Book book = new Book("aa", 10, "bb", "bb", 10.0); + Computer computer = new Computer("aa", 10, "bb", "bb", 10.0); + + Water water = new Water(); + + List assets = new ArrayList<>(); + assets.add(book); + assets.add(computer); + assets.add(water); + } +} + +class Water implements Thing { + @Override + public double getWeight() { + return 0; + } + + @Override + public void setWeight(double weight) { + + } +} diff --git a/src/main/java/com/survivalcoding/asset/Book.java b/src/main/java/com/survivalcoding/asset/Book.java index f0ec22cb..0337d1ce 100644 --- a/src/main/java/com/survivalcoding/asset/Book.java +++ b/src/main/java/com/survivalcoding/asset/Book.java @@ -3,8 +3,8 @@ public class Book extends TangibleAsset { private String isbn; - public Book(String name, int price, String color, String isbn) { - super(name, price, color); + public Book(String name, int price, String color, String isbn, double weight) { + super(name, price, color, weight); this.isbn = isbn; } diff --git a/src/main/java/com/survivalcoding/asset/Computer.java b/src/main/java/com/survivalcoding/asset/Computer.java index 20f98bf0..ca8ca005 100644 --- a/src/main/java/com/survivalcoding/asset/Computer.java +++ b/src/main/java/com/survivalcoding/asset/Computer.java @@ -3,8 +3,8 @@ public class Computer extends TangibleAsset { private String makerName; - public Computer(String name, int price, String color, String makerName) { - super(name, price, color); + public Computer(String name, int price, String color, String makerName, double weight) { + super(name, price, color, weight); this.makerName = makerName; } diff --git a/src/main/java/com/survivalcoding/asset/TangibleAsset.java b/src/main/java/com/survivalcoding/asset/TangibleAsset.java index 005dbb05..96c27416 100644 --- a/src/main/java/com/survivalcoding/asset/TangibleAsset.java +++ b/src/main/java/com/survivalcoding/asset/TangibleAsset.java @@ -4,9 +4,10 @@ public abstract class TangibleAsset extends Asset implements Thing { private String color; private double weight; - public TangibleAsset(String name, int price, String color) { + public TangibleAsset(String name, int price, String color, double weight) { super(name, price); this.color = color; + this.weight = weight; } public String getColor() { diff --git a/src/main/java/com/survivalcoding/asset/asset.puml b/src/main/java/com/survivalcoding/asset/asset.puml index f260e01b..60972b12 100644 --- a/src/main/java/com/survivalcoding/asset/asset.puml +++ b/src/main/java/com/survivalcoding/asset/asset.puml @@ -1,5 +1,5 @@ @startuml -scale 3 +scale 1.5 interface Thing { double getWeight() From 07ca7e22ea443277b34098cc2bf39055b5caaf26 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 1 Jul 2025 11:31:36 +0900 Subject: [PATCH 18/45] =?UTF-8?q?feat:=20=EB=8B=A4=ED=98=95=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/Slime.java | 25 +++++++++++++++++- src/main/java/com/survivalcoding/Wizard.java | 19 +++++++++++++- .../com/survivalcoding/asset/AssetMain.java | 26 +++++++++++++++---- .../com/survivalcoding/list/ListMain.java | 20 ++++++++++++++ .../com/survivalcoding/monster/Goblin.java | 4 --- .../com/survivalcoding/monster/Monster.java | 5 ++-- .../com/survivalcoding/monster/WarWolf.java | 4 --- 7 files changed, 86 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/survivalcoding/list/ListMain.java diff --git a/src/main/java/com/survivalcoding/Slime.java b/src/main/java/com/survivalcoding/Slime.java index 5d9e1148..a8acc4cd 100644 --- a/src/main/java/com/survivalcoding/Slime.java +++ b/src/main/java/com/survivalcoding/Slime.java @@ -1,6 +1,8 @@ package com.survivalcoding; -public class Slime { +import com.survivalcoding.monster.Monster; + +public class Slime extends Monster { public static final int DEFAULT_DAMAGE = 10; private final String prefix; @@ -35,4 +37,25 @@ public void setDamage(int damage) { public void attack(Hero hero) { hero.setHp(hero.getHp() - damage); } + + @Override + public void run() { + System.out.println("2"); + } + + public static void main(String[] args) { + Slime slime = new Slime("", 10); + Monster monster = new Slime("", 10); + slime.run(); + monster.run(); + +// Slime slime1 = (Hero) monster; + + float ff = 10f; + int dd = 10; + + ff = dd; + + dd = (int) ff; + } } diff --git a/src/main/java/com/survivalcoding/Wizard.java b/src/main/java/com/survivalcoding/Wizard.java index 02584223..54985e1b 100644 --- a/src/main/java/com/survivalcoding/Wizard.java +++ b/src/main/java/com/survivalcoding/Wizard.java @@ -1,6 +1,6 @@ package com.survivalcoding; -public class Wizard { +public class Wizard extends Character { private String name; private int hp; private int mp; @@ -24,6 +24,10 @@ public Wizard(String name, int hp, int mp, Wand wand) { this.wand = wand; } + public void fireball(Slime slime) { + + } + public String getName() { return name; } @@ -63,4 +67,17 @@ public void setWand(Wand wand) { public void heal(Hero hero) { hero.setHp(hero.getHp() + 10); } + + @Override + public void attack(Slime slime) { + + } + + public static void main(String[] args) { + Character wizard = new Wizard("aaa"); + Slime slime = new Slime("bbb", 10); + + wizard.attack(slime); +// wizard.fireball(slime); + } } diff --git a/src/main/java/com/survivalcoding/asset/AssetMain.java b/src/main/java/com/survivalcoding/asset/AssetMain.java index fb340249..931b9dce 100644 --- a/src/main/java/com/survivalcoding/asset/AssetMain.java +++ b/src/main/java/com/survivalcoding/asset/AssetMain.java @@ -5,19 +5,35 @@ public class AssetMain { public static void main(String[] args) { - Book book = new Book("aa", 10, "bb", "bb", 10.0); - Computer computer = new Computer("aa", 10, "bb", "bb", 10.0); + Book book = new Book("책", 10, "bb", "a1123123123", 10.0); + Computer computer = new Computer("컴퓨터", 10, "bb", "bb", 10.0); Water water = new Water(); - List assets = new ArrayList<>(); + List assets = new ArrayList<>(); assets.add(book); assets.add(computer); - assets.add(water); + + for (Asset asset : assets) { + System.out.println(asset.getName()); + + if (asset instanceof Book) { + Book bookAsset = (Book) asset; + System.out.println(bookAsset.getIsbn()); + } else if (asset instanceof Computer) { + Computer computerAsset = (Computer) asset; + System.out.println(computerAsset.getMakerName()); + } + } } } -class Water implements Thing { +// marker interface +interface Liquid { + +} + +class Water implements Thing, Liquid { @Override public double getWeight() { return 0; diff --git a/src/main/java/com/survivalcoding/list/ListMain.java b/src/main/java/com/survivalcoding/list/ListMain.java new file mode 100644 index 00000000..f060d9de --- /dev/null +++ b/src/main/java/com/survivalcoding/list/ListMain.java @@ -0,0 +1,20 @@ +package com.survivalcoding.list; + +import java.util.ArrayList; + +public class ListMain { + public static void main(String[] args) { + // 같은 타입을 담을 수 있는 목록 + final ArrayList names = new ArrayList<>(); + + names.add("aa"); + names.add("bb"); + names.add("cc"); + + System.out.println(names); + + names.remove("bb"); + + System.out.println(names); + } +} diff --git a/src/main/java/com/survivalcoding/monster/Goblin.java b/src/main/java/com/survivalcoding/monster/Goblin.java index ca87f584..6105564a 100644 --- a/src/main/java/com/survivalcoding/monster/Goblin.java +++ b/src/main/java/com/survivalcoding/monster/Goblin.java @@ -1,10 +1,6 @@ package com.survivalcoding.monster; public class Goblin extends WalkingMonster { - @Override - public void attack() { - System.out.println("Goblin attack"); - } @Override public void run() { diff --git a/src/main/java/com/survivalcoding/monster/Monster.java b/src/main/java/com/survivalcoding/monster/Monster.java index 3f096e27..22d25989 100644 --- a/src/main/java/com/survivalcoding/monster/Monster.java +++ b/src/main/java/com/survivalcoding/monster/Monster.java @@ -4,6 +4,7 @@ public abstract class Monster { private int hp; private int mp; - public abstract void attack(); - public abstract void run(); + public void run() { + System.out.println("1"); + } } diff --git a/src/main/java/com/survivalcoding/monster/WarWolf.java b/src/main/java/com/survivalcoding/monster/WarWolf.java index 209e5e8f..e9da6e34 100644 --- a/src/main/java/com/survivalcoding/monster/WarWolf.java +++ b/src/main/java/com/survivalcoding/monster/WarWolf.java @@ -1,10 +1,6 @@ package com.survivalcoding.monster; public class WarWolf extends WalkingMonster { - @Override - public void attack() { - System.out.println("WarWolf attack"); - } @Override public void run() { From dad9205ae63376db5b51efe1488650b2b6e1453c Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 1 Jul 2025 13:36:08 +0900 Subject: [PATCH 19/45] =?UTF-8?q?feat:=20=EC=A0=9C=EB=84=A4=EB=A6=AD,=20en?= =?UTF-8?q?um?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/survivalcoding/Character.java | 6 ++++ src/main/java/com/survivalcoding/Cleric.java | 6 ++-- .../com/survivalcoding/generic/AuthState.java | 8 +++++ .../com/survivalcoding/generic/EnumMain.java | 23 ++++++++++++++ .../com/survivalcoding/generic/Pocket.java | 31 +++++++++++++++++++ 5 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/survivalcoding/generic/AuthState.java create mode 100644 src/main/java/com/survivalcoding/generic/EnumMain.java create mode 100644 src/main/java/com/survivalcoding/generic/Pocket.java diff --git a/src/main/java/com/survivalcoding/Character.java b/src/main/java/com/survivalcoding/Character.java index 30df6ab7..01a87a2b 100644 --- a/src/main/java/com/survivalcoding/Character.java +++ b/src/main/java/com/survivalcoding/Character.java @@ -6,5 +6,11 @@ public abstract class Character { public static void main(String[] args) { // Character c = new Character(); + Character character = new Character() { + @Override + public void attack(Slime slime) { + + } + }; } } diff --git a/src/main/java/com/survivalcoding/Cleric.java b/src/main/java/com/survivalcoding/Cleric.java index 112e72df..3ea1182d 100644 --- a/src/main/java/com/survivalcoding/Cleric.java +++ b/src/main/java/com/survivalcoding/Cleric.java @@ -13,17 +13,17 @@ public class Cleric extends Character { // 난수 생성을 위한 Random 객체 한번만 만들자 Random rand = new Random(); - Cleric(String name, int hp, int mp) { + public Cleric(String name, int hp, int mp) { this.name = name; this.hp = hp; this.mp = mp; } - Cleric(String name, int hp) { + public Cleric(String name, int hp) { this(name, hp, Cleric.maxMp); } - Cleric(String name) { + public Cleric(String name) { this(name, Cleric.maxHp); } diff --git a/src/main/java/com/survivalcoding/generic/AuthState.java b/src/main/java/com/survivalcoding/generic/AuthState.java new file mode 100644 index 00000000..79128ddb --- /dev/null +++ b/src/main/java/com/survivalcoding/generic/AuthState.java @@ -0,0 +1,8 @@ +package com.survivalcoding.generic; + +public enum AuthState { + AUTHENTICATED, + UNAUTHENTICATED, + UNKNOWN, + AUTHENTICATING, +} diff --git a/src/main/java/com/survivalcoding/generic/EnumMain.java b/src/main/java/com/survivalcoding/generic/EnumMain.java new file mode 100644 index 00000000..1d0194c0 --- /dev/null +++ b/src/main/java/com/survivalcoding/generic/EnumMain.java @@ -0,0 +1,23 @@ +package com.survivalcoding.generic; + +public class EnumMain { + public static void main(String[] args) { + // 값 + AuthState state = AuthState.AUTHENTICATED; + + switch (state) { + case AuthState.AUTHENTICATED: { + System.out.println("AUTHENTICATED"); + } + case AuthState.UNAUTHENTICATED: { + System.out.println("UNAUTHENTICATED"); + } + case AuthState.UNKNOWN: { + System.out.println("UNKNOWN"); + } + default: { + System.out.println("default"); + } + } + } +} diff --git a/src/main/java/com/survivalcoding/generic/Pocket.java b/src/main/java/com/survivalcoding/generic/Pocket.java new file mode 100644 index 00000000..192faca0 --- /dev/null +++ b/src/main/java/com/survivalcoding/generic/Pocket.java @@ -0,0 +1,31 @@ +package com.survivalcoding.generic; + +import com.survivalcoding.Character; +import com.survivalcoding.Cleric; +import com.survivalcoding.Wizard; + +public class Pocket { + private E data; + + public void put(E data) { + this.data = data; + } + + public E get() { + return data; + } + + public static void main(String[] args) { +// Pocket pocket = new Pocket<>(); +// pocket.put("111"); + +// String name = pocket.get(); +// System.out.println(name); + + Pocket pocket1 = new Pocket<>(); + pocket1.put(new Cleric("11")); + + Pocket pocket2 = new Pocket<>(); + Pocket pocket3 = new Pocket<>(); + } +} From ecd6fe6f39ee2f4faf5312abb298a8010a72cbf9 Mon Sep 17 00:00:00 2001 From: Junsuk Oh Date: Tue, 1 Jul 2025 13:45:19 +0900 Subject: [PATCH 20/45] =?UTF-8?q?feat:=20enum=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/survivalcoding/generic/EnumMain.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/survivalcoding/generic/EnumMain.java b/src/main/java/com/survivalcoding/generic/EnumMain.java index 1d0194c0..3c95d1b9 100644 --- a/src/main/java/com/survivalcoding/generic/EnumMain.java +++ b/src/main/java/com/survivalcoding/generic/EnumMain.java @@ -6,13 +6,13 @@ public static void main(String[] args) { AuthState state = AuthState.AUTHENTICATED; switch (state) { - case AuthState.AUTHENTICATED: { + case AUTHENTICATED: { System.out.println("AUTHENTICATED"); } - case AuthState.UNAUTHENTICATED: { + case UNAUTHENTICATED: { System.out.println("UNAUTHENTICATED"); } - case AuthState.UNKNOWN: { + case UNKNOWN: { System.out.println("UNKNOWN"); } default: { From cff74aecfb92d35a047a1ee455f03f1bf6177643 Mon Sep 17 00:00:00 2001 From: choiain Date: Mon, 9 Jun 2025 10:59:57 +0900 Subject: [PATCH 21/45] =?UTF-8?q?=20README.md=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 00000000..127f5cd1 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# 저는 최아인입니다 + +이 레포지토리는 JAVA 과제를 작성하는 곳입니다. \ No newline at end of file From 70ac8c3f57ec841871bb697c91c087713119c5a8 Mon Sep 17 00:00:00 2001 From: choiain Date: Mon, 9 Jun 2025 15:53:11 +0900 Subject: [PATCH 22/45] =?UTF-8?q?TIL=20=EC=9A=A9=EC=96=B4=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...51\354\226\264\354\240\225\353\246\254.md" | 31 +++++++++++++++++++ src/main/java/com/survivalcoding/Main.java | 8 +++++ 2 files changed, 39 insertions(+) diff --git "a/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" "b/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" index e69de29b..3d01745b 100644 --- "a/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" +++ "b/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" @@ -0,0 +1,31 @@ +# TIL(Today I Learned) + +cd .. - 상위 폴더
+cd 파일이름 - 폴더 안의 파일로 가기 + +## Git 용어 정리 + - git init - 깃 초기화 + - git clone - 복제 + - git status - 작업 디렉토리와 스테이징 내역 확인 + - git add - 파일 추가 + - git reset - 커밋내역 삭제 + - git commit -m "커밋할 내용" - 로컬 저장소에 등록 + - git log - 기록확인 + - git rm - 삭제 + - git push - commit한 내용을 원격저장소에 올리기 + - git pull - 원격 저장소에서 로컬 저장소로 + +## Fork 하는 법 +1. 오픈소스?에 접속하여 Fork 버튼 클릭하기 +2. Create a new fork 클릭 +3. 이름, 설명... 작성 +4. Create fork 버튼 클릭 +5. fork 완료 + +## Requests 하는 법 +1. Pull requests 클릭하기 +2. New pull request 클릭하기 +3. 변경하기 +4. Create pull request 클릭하기 +5. 제목, 설명 변경하기 +6. Create pull request 클릭하기 diff --git a/src/main/java/com/survivalcoding/Main.java b/src/main/java/com/survivalcoding/Main.java index 208e351c..888b5f06 100644 --- a/src/main/java/com/survivalcoding/Main.java +++ b/src/main/java/com/survivalcoding/Main.java @@ -2,6 +2,14 @@ public class Main { public static void main(String[] args) { + int ii = 10; + boolean isMarried = true; + double d = 5.0; + float f = 2.5f; + String name = ""; + + System.out.print("Hello and welcome!"); + Kinoko kinoko = new Kinoko(); kinoko.setHp(100); From f77449ab19d509589636e80e274ef207da06ddee Mon Sep 17 00:00:00 2001 From: choiain Date: Mon, 16 Jun 2025 08:42:19 +0900 Subject: [PATCH 23/45] test code --- ...025.06.10 JAVA\352\270\260\354\264\210.md" | 27 ++++ ...51\354\226\264\354\240\225\353\246\254.md" | 3 +- .../exam01/Cleric.java | 43 ++++++ .../exam01/Kinoko.java | 16 ++ .../exam01/ClericTest.java | 141 ++++++++++++++++++ .../exam01/KinokoTest.java | 25 ++++ 6 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 "TIL/topics/java_basic/2025.06.10 JAVA\352\270\260\354\264\210.md" create mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java create mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Kinoko.java create mode 100644 src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java create mode 100644 src/test/java/com/survivalcoding/assignments_01_instance/exam01/KinokoTest.java diff --git "a/TIL/topics/java_basic/2025.06.10 JAVA\352\270\260\354\264\210.md" "b/TIL/topics/java_basic/2025.06.10 JAVA\352\270\260\354\264\210.md" new file mode 100644 index 00000000..f045c73d --- /dev/null +++ "b/TIL/topics/java_basic/2025.06.10 JAVA\352\270\260\354\264\210.md" @@ -0,0 +1,27 @@ +# TIL(Today I Learned) + +## 객체지향이 필요한이유 + - 컴퓨터의 발전으로? 성능이 좋아져서 메모리 관리의 의미가 없다? + - + +## 용어 정리 + - 오브젝트 (object) - 현실 세계의 모든 객체 + - 클래스 (class) - 오브젝트를 가상세계 용으로 구체화 한것 + - 인스턴스 (instance) - 클래스를 활용해 메모리 상에 만들어 낸 것 + + +## 정리 + - this. - 위에 같은 이름?을 사용 할때 내--이다 같은 의미? + + +## 클래스명과 맵버변수명의 명명 규칙 + + +## 클래스 정의에 따른 효과 +1. 정의한 클래스로 인스턴스를 생성 할 수 있다. +2. 이 클래스로 생성한 인스턴스를 넣을 수 있는 새로운 변수의 타입이 이용 가능 해 진다. + -Hero 클래스를 정의하면 Hero 타입의 변수가 이용 가능 +3. + + +## Test 작성 \ No newline at end of file diff --git "a/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" "b/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" index 3d01745b..8e728800 100644 --- "a/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" +++ "b/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" @@ -11,7 +11,8 @@ cd 파일이름 - 폴더 안의 파일로 가기 - git reset - 커밋내역 삭제 - git commit -m "커밋할 내용" - 로컬 저장소에 등록 - git log - 기록확인 - - git rm - 삭제 + - git rm - 삭제 (add시 잘못한 부분 삭제) + - rm -rf (파일 명) - 파일 삭제 - git push - commit한 내용을 원격저장소에 올리기 - git pull - 원격 저장소에서 로컬 저장소로 diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java new file mode 100644 index 00000000..dbb52f82 --- /dev/null +++ b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java @@ -0,0 +1,43 @@ +package com.survivalcoding.assignments_01_instance.exam01; +import java.util.Random; + +public class Cleric { + String name = "cleric"; + int hp = 50; + final int Max_HP = 50; + int mp = 10; + final int Max_MP = 10; + + //selfAid() 메소드 추가 인수가 없고, 리턴 값도 없다. + public void selfAid() { + mp -= 5; + + if(mp >= 5) { + if (hp < Max_HP) { + hp = Max_HP; + } + } + + System.out.println(name + "셀프 에이드를 사용했습니다"); + System.out.println("HP가 전부 회복되었습니다"); + } + + // 성직자에게 '기도하기'을 지시 - 초당 MP 회복 0~2 랜덤하게 상승/3초 3~5회복 + public int pray(int sec) { + Random rand = new Random(); + + + // 0~2 보정치 추가 + int recovery = sec + rand.nextInt(3); + + // 최대 MP를 넘지 않도록 + int actualRecovery = Math.min(Max_MP - mp, recovery); + mp += actualRecovery; + System.out.println(name + "는 " + sec + "초 동안 기도하여 MP를 " + + actualRecovery + " 회복했습니다."); + return actualRecovery; + + } + + +} diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Kinoko.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Kinoko.java new file mode 100644 index 00000000..67cbcc4c --- /dev/null +++ b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Kinoko.java @@ -0,0 +1,16 @@ +package com.survivalcoding.assignments_01_instance.exam01; + +public class Kinoko { + int hp; + final int level = 10; + + void attack() { + final int level = 20; + hp = 100; + } + + void setHP(int hp) { + this.hp = hp; + } + +} diff --git a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java new file mode 100644 index 00000000..f1c4864e --- /dev/null +++ b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java @@ -0,0 +1,141 @@ +package com.survivalcoding.assignments_01_instance.exam01; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Random; + +import static org.junit.jupiter.api.Assertions.*; + +class ClericTest { + + @Test + @DisplayName("selfAid() 사용 시 MP가 충분하다면, MP 5가 소비되고 HP는 최대 HP로 회복되어야 한다.") + //selfAid() 메소드 추가 인수가 없고, 리턴 값도 없다. + void selfAid1() { + // given + final Cleric cleric = new Cleric(); + cleric.hp = 5; + + // when + cleric.selfAid(); + + // then + assertEquals(50, cleric.hp); + } + + @Test + @DisplayName("selfAid() 사용 시 MP가 부족하다면, HP가 회복되지 않고 MP도 감소하지 않아야 한다.") + void selfAid2() { + // given + final Cleric cleric = new Cleric(); + cleric.hp = 5; + cleric.mp = 4; + + // when + cleric.selfAid(); + + // then + assertEquals(5, cleric.hp); + } + + @Test + @DisplayName("selfAid() 사용 시 HP가 이미 최대치라면, HP는 변하지 않고 MP만 소비되어야 한다.") + void selfAid3() { + // given + final Cleric cleric = new Cleric(); + cleric.hp = 50; + cleric.mp = 6; + + // when + cleric.selfAid(); + + // then + assertEquals(50, cleric.hp); + assertEquals(1, cleric.mp); + + } + + + @Test + @DisplayName("pray() 사용 시 MP가 회복되어야 하며, 반환 값은 실제로 회복된 MP 양과 일치해야 한다.") + void pray1() { + + // given + final Cleric cleric = new Cleric(); + cleric.mp = 2; + + // when + cleric.pray(2); + + // then + assertEquals(4, cleric.mp); + + } + + @Test + @DisplayName("pray()를 일정 시간 기도했을 때, 회복되는 MP 양이 '기도 시간'에서 '기도 시간 + 2' 사이의 랜덤 범위 내에 있어야 한다.") + void pray2() { + + // given + final Cleric cleric = new Cleric(); + cleric.mp = 2; + + // when + cleric.pray(3); + + // then + assertEquals(7, cleric.mp); + + } + + @Test + @DisplayName("pray() 사용 시 MP는 Max_MP를 초과하여 회복될 수 없으며, Max_MP 까지만 회복되어야 한다.") + void pray3() { + + // given + final Cleric cleric = new Cleric(); + cleric.mp = 8; + + // when + cleric.pray(3); + + // then + assertEquals(10, cleric.mp); + + } + + @Test + @DisplayName("pray() 사용 시 기도 시간(prayTimeSec)이 0이거나 음수일 경우, MP는 회복되지 않고 0을 반환해야 한다.") + void pray4() { + + // given + final Cleric cleric = new Cleric(); + cleric.mp = 2; + + // when + cleric.pray(0); + + // then + assertEquals(2, cleric.mp); + + } + + @Test + @DisplayName("pray() 사용 시 MP가 이미 Max_MP 라면, MP는 변하지 않고 0을 반환해야 한다.") + void pray5() { + + // given + final Cleric cleric = new Cleric(); + cleric.mp = 10; + + // when + cleric.pray(3); + + // then + assertEquals(10, cleric.mp); + + } + + +} \ No newline at end of file diff --git a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/KinokoTest.java b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/KinokoTest.java new file mode 100644 index 00000000..ea7f6df3 --- /dev/null +++ b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/KinokoTest.java @@ -0,0 +1,25 @@ +package com.survivalcoding.assignments_01_instance.exam01; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class KinokoTest { + + /*@Test //옵션 설명이 같이 나온다? + @DisplayName("heal을 하면 hp를 10 회복해야 한다") + void heal() { + // given(준비) + final Wizard wizard = new Wizard("마법사", 100); + final Hero hero = new Hero("히어로", 10); + + // when(실행) + wizard.heal(hero); + + // then(검증) + assertEquals(20, hero.hp); + }*/ + + +} \ No newline at end of file From e6a99ee737155883b52a06729841e23ceb4f116b Mon Sep 17 00:00:00 2001 From: choiain Date: Mon, 16 Jun 2025 13:47:25 +0900 Subject: [PATCH 24/45] =?UTF-8?q?2025.06.16=20=EC=88=98=EC=97=85=20hero,?= =?UTF-8?q?=20sword,=20wizard?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...A \355\201\264\353\236\230\354\212\244.md" | 72 +++++++++++++++++++ .../assignments_01_instance/exam01/Hero.java | 47 ++++++++++++ .../assignments_01_instance/exam01/Sword.java | 23 ++++++ .../exam01/Wizard.java | 10 +++ 4 files changed, 152 insertions(+) create mode 100644 "TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" create mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Hero.java create mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Sword.java create mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Wizard.java diff --git "a/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" "b/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" new file mode 100644 index 00000000..c1b200a7 --- /dev/null +++ "b/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" @@ -0,0 +1,72 @@ +# TIL(Today I Learned) + +## 클래스 +가상세계 - 컴퓨터의 메모리 영역 +인스턴스 - heap 영역 안에 확보된 메모리 + +### 참조 +기본형, 참조형 + +### 메모리 + + +null 이 안들어가는것 - 기본형 +String은 참조형이다? 기본형이다? 참조형이다. new도 없고 null도 안들어간다. +기본형은 모두 소문자로 제공?이 된다. +필드에 초기값을 자동 생성하도록 생성자를 자동으로 생성하자? +Sword +Hero +Wizard + +널과 0이 나와요. +세팅을 하고 싶어 HP = 100 으로 하고 싶다. +생성자를 통해서 생성하는 방법 +객체지향 컨셉 +디폴트값을 주는 것도 좋지만 생성자를 활용하자 +클레스 이름하고 똑같은 것을 만들고요 +객체지향 컨셉에서 +역활과 책임? +생성자 이후의 후속 조치를 +생성자 동작 확인 +요렇게 초기값관련된것을 초기값으로 넘가죠 +이름은 외부에서 받자 +받은거를 여기???에 쓰고 싶다. this.활용 + 오버로드는 메서드?에 관련한? +생성자에도 활용 + +모든 클래스는 1개이상의 생성자를 가진다. +생성자를 추가하면 기본 생성자가 날라간다. +생성자가 여러개가 있어 +있는데 +재활용? 기본 생성자 +this를 안쓰면 기본 생성자를 부른다. + +여러 히어로들이 같이 모험을 다니고 히어로마다 각각 돈을 가지고 있다. +static 공유한다. +히어로 에다가 돈을 추가할께요 +int money하면 각각의 자원이야 +그런데 static하면 공유한다고 하는거야.. +hero1.money 하면 + +static을 붙이면 내께 아니야 메모리 자체가 달라!! +클래스 안에 작성은 해야해 +code 아님 data에 있어 + +Heap에 등장을 하잖아 +다 지웠어 얘만 남겨도 잘 동작을 하고 + +static은 메모리에 먼저 올라가 사용하는 시점에 +그리고 메모리는 계속 유지가 됩니다. 끝날때까지? +해지가 안됨. +객체와 상관이 없어요. 임의로 어디서나 사용하기 위해서 쓰는 건데 + +무분별하게 사용하지 말기 특수하게 사용하는거?!! +final static int + +money = new Random(). nextInt(1000); +name을 고치고 싶어 이거 왜 안될까? +다른 동네여서!! static 사용해서!! +그럼 어떻게 접근할까? Hero를 하나 만들어서 hero.name 으로 접근하기 + +여기 안보여 다른 공간이여서 +요즘은 다른 파일에 작성하도록 하지 자바나 C#은 옛날 언어여서 diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Hero.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Hero.java new file mode 100644 index 00000000..71756936 --- /dev/null +++ b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Hero.java @@ -0,0 +1,47 @@ +package com.survivalcoding.assignments_01_instance.exam01; +import java.util.Random; + +public class Hero { + // 공유자원 + static int money = 100; + + String name; // null + int hp; // 0 + Sword sword; // null + + static void setRandomMoney() { + Hero.money = new Random().nextInt(1000); + + Hero hero = new Hero("aaa", 10); + hero.name = "홍길동"; + } + + public Hero(String name, int hp) { + this.name = name; + this.hp = hp; + } + + public static void main(String[] args) { + int a = 10; + + Hero.money = 500; + + Hero hero1 = new Hero("홍길동", 100); + System.out.println(Hero.money); + + + Hero hero2 = hero1; + hero2.hp = 200; + System.out.println(hero1.hp); + + Sword sword1 = new Sword(); + sword1.damage = 100; + + hero1.sword = sword1; + + hero1 = null; +// String name = new String("오준석"); + + System.out.println(hero2.hp); + } +} diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Sword.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Sword.java new file mode 100644 index 00000000..260f6e4d --- /dev/null +++ b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Sword.java @@ -0,0 +1,23 @@ +package com.survivalcoding.assignments_01_instance.exam01; + +public class Sword { + String name; + int damage; + + Sword() { + this("기본 이름"); + } + + Sword(String name) { + this.name = name; + damage = 10; + } + + public static void main(String[] args) { + Sword sword = new Sword("엑스칼리버"); + Sword sword2 = new Sword(); + + System.out.println(sword.name); + System.out.println(sword.damage); + } +} diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Wizard.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Wizard.java new file mode 100644 index 00000000..d1028183 --- /dev/null +++ b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Wizard.java @@ -0,0 +1,10 @@ +package com.survivalcoding.assignments_01_instance.exam01; + +public class Wizard { + String name; + int hp; + + void heal(Hero hero) { + hero.hp += 10; + } +} From 61d04c9f53873102c8695f91aa8b5edbe8217b6d Mon Sep 17 00:00:00 2001 From: choiain Date: Mon, 16 Jun 2025 16:44:13 +0900 Subject: [PATCH 25/45] =?UTF-8?q?2025.06.16=20=EA=B3=BC=EC=A0=9C=20Cleric?= =?UTF-8?q?=20&=20testcode=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...A \355\201\264\353\236\230\354\212\244.md" | 14 +++++---- .../exam01/Cleric.java | 29 +++++++++++++++---- .../exam01/ClericTest.java | 18 ++++++++++++ 3 files changed, 50 insertions(+), 11 deletions(-) diff --git "a/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" "b/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" index c1b200a7..8628eef5 100644 --- "a/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" +++ "b/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" @@ -8,27 +8,28 @@ 기본형, 참조형 ### 메모리 +![](/Users/mr10/Desktop/스크린샷 2025-06-16 오후 2.08.42.png) null 이 안들어가는것 - 기본형 String은 참조형이다? 기본형이다? 참조형이다. new도 없고 null도 안들어간다. 기본형은 모두 소문자로 제공?이 된다. 필드에 초기값을 자동 생성하도록 생성자를 자동으로 생성하자? -Sword -Hero -Wizard +Sword.Java +Hero.Java +Wizard.Java -널과 0이 나와요. +null과 0이 나와요. 세팅을 하고 싶어 HP = 100 으로 하고 싶다. 생성자를 통해서 생성하는 방법 객체지향 컨셉 디폴트값을 주는 것도 좋지만 생성자를 활용하자 -클레스 이름하고 똑같은 것을 만들고요 +클래스 이름하고 똑같은 것을 만들고요 객체지향 컨셉에서 역활과 책임? 생성자 이후의 후속 조치를 생성자 동작 확인 -요렇게 초기값관련된것을 초기값으로 넘가죠 +요렇게 초기값관련된것을 초기값으로 넘기죠 이름은 외부에서 받자 받은거를 여기???에 쓰고 싶다. this.활용 오버로드는 메서드?에 관련한? @@ -70,3 +71,4 @@ name을 고치고 싶어 이거 왜 안될까? 여기 안보여 다른 공간이여서 요즘은 다른 파일에 작성하도록 하지 자바나 C#은 옛날 언어여서 + diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java index dbb52f82..89f2bdb7 100644 --- a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java +++ b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java @@ -2,11 +2,30 @@ import java.util.Random; public class Cleric { - String name = "cleric"; - int hp = 50; - final int Max_HP = 50; - int mp = 10; - final int Max_MP = 10; + String name; + int hp; + static final int Max_HP = 50; + int mp; + static final int Max_MP = 10; + + Cleric(String name, int HP, int MP) { + this.name = name; + this.hp = HP; + this.mp = MP; + } + Cleric(String name, int HP) { + this.name = name; + this.hp = HP; + this.mp = Max_MP; + } + Cleric(String name) { + this.name = name; + this.hp = Max_HP; + this.mp = Max_MP; + } + Cleric() { + + } //selfAid() 메소드 추가 인수가 없고, 리턴 값도 없다. public void selfAid() { diff --git a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java index f1c4864e..29dc54f0 100644 --- a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java +++ b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java @@ -137,5 +137,23 @@ void pray5() { } + public static void main(String[] args) { + // 이름, HP, MP 모두 지정 + Cleric c1 = new Cleric("아서스", 40, 5); + System.out.println("c1 -> 이름: " + c1.name + ", HP: " + c1.hp + ", MP: " + c1.mp); + + // 이름과 HP만 지정 (MP는 최대 MP로 초기화) + Cleric c2 = new Cleric("아서스", 35); + System.out.println("c2 -> 이름: " + c2.name + ", HP: " + c2.hp + ", MP: " + c2.mp); + + // 이름만 지정 (HP, MP 모두 최대값으로 초기화) + Cleric c3 = new Cleric("아서스"); + System.out.println("c3 -> 이름: " + c3.name + ", HP: " + c3.hp + ", MP: " + c3.mp); + + Cleric c4 = new Cleric(); + System.out.println("c4 -> 이름: " + c4.name + ", HP: " + c4.hp + ", MP: " + c4.mp); + } + + } \ No newline at end of file From bebbc741fb1830e5b52d40762ae3075042ad3afd Mon Sep 17 00:00:00 2001 From: Ain_Choi Date: Mon, 16 Jun 2025 17:03:49 +0900 Subject: [PATCH 26/45] =?UTF-8?q?Update=202025.06.16=20JAVA=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" "b/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" index 8628eef5..0bd39325 100644 --- "a/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" +++ "b/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" @@ -8,7 +8,7 @@ 기본형, 참조형 ### 메모리 -![](/Users/mr10/Desktop/스크린샷 2025-06-16 오후 2.08.42.png) +스크린샷 2025-06-16 오후 2 08 42 null 이 안들어가는것 - 기본형 From 6a56fc7113f5d6a0f23b23a54451fd794566a130 Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 17 Jun 2025 14:12:16 +0900 Subject: [PATCH 27/45] =?UTF-8?q?2025.06.17=20=EC=88=98=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...A \355\201\264\353\236\230\354\212\244.md" | 1 + TIL/topics/java_basic/2025.06.17 .md | 50 +++++++++++++++ src/main/java/com/survivalcoding/Cleric.java | 47 ++++++++++---- src/main/java/com/survivalcoding/Hero.java | 31 ++++++++-- src/main/java/com/survivalcoding/Kinoko.java | 2 +- src/main/java/com/survivalcoding/Wizard.java | 8 +-- .../exam01/Cleric.java | 62 ------------------- .../assignments_01_instance/exam01/Hero.java | 47 -------------- .../exam01/Kinoko.java | 16 ----- .../assignments_01_instance/exam01/Sword.java | 23 ------- .../exam01/Wizard.java | 10 --- src/main/java/com/survivalcoding/game.puml | 5 ++ .../exam01/ClericTest.java | 4 +- .../exam01/HeroTest.java | 26 ++++++++ 14 files changed, 150 insertions(+), 182 deletions(-) create mode 100644 TIL/topics/java_basic/2025.06.17 .md delete mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java delete mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Hero.java delete mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Kinoko.java delete mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Sword.java delete mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Wizard.java create mode 100644 src/test/java/com/survivalcoding/assignments_01_instance/exam01/HeroTest.java diff --git "a/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" "b/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" index 0bd39325..7906afd0 100644 --- "a/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" +++ "b/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md" @@ -10,6 +10,7 @@ ### 메모리 스크린샷 2025-06-16 오후 2 08 42 +오버로드 null 이 안들어가는것 - 기본형 String은 참조형이다? 기본형이다? 참조형이다. new도 없고 null도 안들어간다. diff --git a/TIL/topics/java_basic/2025.06.17 .md b/TIL/topics/java_basic/2025.06.17 .md new file mode 100644 index 00000000..8686a5d8 --- /dev/null +++ b/TIL/topics/java_basic/2025.06.17 .md @@ -0,0 +1,50 @@ + +# TIL(Today I Learned) + +## Test Code + - assertEquals(); + + - assertTrue(); + +## commit 메세지 + - feat: 새로운 기능 추가 + - fix: 버그 수정 + - docs: 문서 수정 + - style: 코드 스타일 수정 + - design: 사용자 UI 디자인 변경 + - test: 테스트 코드 + - refactor: 코드 수정 + - build: 빌드 파일 수정 + - ci: CI 설정 파일 수정 + - perf: 성능 개선 + - chore: 빌드 업무 수정, 패키지 매니저 수정 + - rename: 파일 혹은 풀더명을 수정만 한 경우 + - remove: 파일을 삭제만 한 경우 + + +객체지향의 3대 원칙 +캡슐화 (encapsulation) +상속 +다양성 +(추상화) + +오버로드 +없앨 수 없다. +안전한 클래스를 만들어야 하는데!! + +필드에 있는 맴버 변수 함수 + +접근 지정자 +private - 필드 +public - 메소드 +package private (default) +protected + +UML(Unified Modeling Language) + +getter와 setter +getter - 읽기 전용 +setter - 쓰기 전용 + +보일러플레이트 + diff --git a/src/main/java/com/survivalcoding/Cleric.java b/src/main/java/com/survivalcoding/Cleric.java index 3ea1182d..8a187558 100644 --- a/src/main/java/com/survivalcoding/Cleric.java +++ b/src/main/java/com/survivalcoding/Cleric.java @@ -10,36 +10,57 @@ public class Cleric extends Character { int hp; int mp; - // 난수 생성을 위한 Random 객체 한번만 만들자 - Random rand = new Random(); - - public Cleric(String name, int hp, int mp) { + Cleric(String name, int HP, int MP) { this.name = name; - this.hp = hp; - this.mp = mp; + this.hp = HP; + this.mp = MP; } - - public Cleric(String name, int hp) { - this(name, hp, Cleric.maxMp); + Cleric(String name, int HP) { + this.name = name; + this.hp = HP; + this.mp = maxMp; } - - public Cleric(String name) { - this(name, Cleric.maxHp); + Cleric(String name) { + this.name = name; + this.hp = maxHp; + this.mp = maxMp; } + + //selfAid() 메소드 추가 인수가 없고, 리턴 값도 없다. public void selfAid() { if (hp == maxHp) return; // 이미 max라면 return if (mp < 5) return; // mp가 부족하면 return mp -= 5; + + if(mp >= 5) { + if (hp < maxHp) { + hp = maxHp; + } + } + + System.out.println(name + "셀프 에이드를 사용했습니다"); + System.out.println("HP가 전부 회복되었습니다"); hp = maxHp; } + // 성직자에게 '기도하기'을 지시 - 초당 MP 회복 0~2 랜덤하게 상승/3초 3~5회복 public int pray(int sec) { + Random rand = new Random(); if (mp == maxMp) return 0; // 이미 max라면 return // 회복량 recoveryMp에 저장 int recoveryMp = rand.nextInt(3) + sec; // 0~2 랜덤값 + 기도 시간(s) + // 0~2 보정치 추가 + int recovery = sec + rand.nextInt(3); + + // 최대 MP를 넘지 않도록 + int actualRecovery = Math.min(maxMp - mp, recovery); + mp += actualRecovery; + System.out.println(name + "는 " + sec + "초 동안 기도하여 MP를 " + + actualRecovery + " 회복했습니다."); + return actualRecovery; // maxMp 보다 더 회복하는가? if (recoveryMp + mp > maxMp) { recoveryMp = maxMp - mp; @@ -52,6 +73,6 @@ public int pray(int sec) { @Override public void attack(Slime slime) { - } + } diff --git a/src/main/java/com/survivalcoding/Hero.java b/src/main/java/com/survivalcoding/Hero.java index a6de2887..bacc581a 100644 --- a/src/main/java/com/survivalcoding/Hero.java +++ b/src/main/java/com/survivalcoding/Hero.java @@ -1,6 +1,5 @@ package com.survivalcoding; - import java.util.Random; public class Hero { @@ -22,8 +21,33 @@ public void setHp(int hp) { this.hp = hp; } - public void attack(Kinoko kinoko) { - System.out.println("attack"); + private void die() { + System.out.println("죽었다"); + } + + public void attack(Kinoko enemy) { + System.out.println("반격을 받았다"); + hp -= 10; + if (hp < 1) { + die(); + } + } + + public String getName() { + return name; + } + + public void setName(String name) { + if (name == null) { + throw new IllegalArgumentException("이름은 null이 아니어야 함"); + } + if (name.length() <= 1) { + throw new IllegalArgumentException("이름이 너무 짧음"); + } + if (name.length() >= 8) { + throw new IllegalArgumentException("이름이 너무 긺"); + } + this.name = name; } public void run() { @@ -52,7 +76,6 @@ public static void main(String[] args) { hero1.setHp(-10); - Hero hero2 = hero1; hero2.hp = 200; System.out.println(hero1.hp); diff --git a/src/main/java/com/survivalcoding/Kinoko.java b/src/main/java/com/survivalcoding/Kinoko.java index fc29ca6b..8bb0e72c 100644 --- a/src/main/java/com/survivalcoding/Kinoko.java +++ b/src/main/java/com/survivalcoding/Kinoko.java @@ -9,7 +9,7 @@ void attack() { hp = 100; } - void setHp(int hp) { + void setHP(int hp) { this.hp = hp; System.out.println("hp 를 회복"); } diff --git a/src/main/java/com/survivalcoding/Wizard.java b/src/main/java/com/survivalcoding/Wizard.java index 54985e1b..dde295aa 100644 --- a/src/main/java/com/survivalcoding/Wizard.java +++ b/src/main/java/com/survivalcoding/Wizard.java @@ -46,6 +46,10 @@ public void setHp(int hp) { if (this.hp < 0) { this.hp = 0; } + void heal(Hero hero) { + int basePoint = 10; // 기본회복 포인트 + int recovPoint = (int) (basePoint * this.wand.power); // 지팡이에 의한 증폭 + hero.setHp(hero.getHp() + recovPoint); // 용사의 HP를 회복 } public int getMp() { @@ -64,10 +68,6 @@ public void setWand(Wand wand) { this.wand = wand; } - public void heal(Hero hero) { - hero.setHp(hero.getHp() + 10); - } - @Override public void attack(Slime slime) { diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java deleted file mode 100644 index 89f2bdb7..00000000 --- a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Cleric.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.survivalcoding.assignments_01_instance.exam01; -import java.util.Random; - -public class Cleric { - String name; - int hp; - static final int Max_HP = 50; - int mp; - static final int Max_MP = 10; - - Cleric(String name, int HP, int MP) { - this.name = name; - this.hp = HP; - this.mp = MP; - } - Cleric(String name, int HP) { - this.name = name; - this.hp = HP; - this.mp = Max_MP; - } - Cleric(String name) { - this.name = name; - this.hp = Max_HP; - this.mp = Max_MP; - } - Cleric() { - - } - - //selfAid() 메소드 추가 인수가 없고, 리턴 값도 없다. - public void selfAid() { - mp -= 5; - - if(mp >= 5) { - if (hp < Max_HP) { - hp = Max_HP; - } - } - - System.out.println(name + "셀프 에이드를 사용했습니다"); - System.out.println("HP가 전부 회복되었습니다"); - } - - // 성직자에게 '기도하기'을 지시 - 초당 MP 회복 0~2 랜덤하게 상승/3초 3~5회복 - public int pray(int sec) { - Random rand = new Random(); - - - // 0~2 보정치 추가 - int recovery = sec + rand.nextInt(3); - - // 최대 MP를 넘지 않도록 - int actualRecovery = Math.min(Max_MP - mp, recovery); - mp += actualRecovery; - System.out.println(name + "는 " + sec + "초 동안 기도하여 MP를 " - + actualRecovery + " 회복했습니다."); - return actualRecovery; - - } - - -} diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Hero.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Hero.java deleted file mode 100644 index 71756936..00000000 --- a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Hero.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.survivalcoding.assignments_01_instance.exam01; -import java.util.Random; - -public class Hero { - // 공유자원 - static int money = 100; - - String name; // null - int hp; // 0 - Sword sword; // null - - static void setRandomMoney() { - Hero.money = new Random().nextInt(1000); - - Hero hero = new Hero("aaa", 10); - hero.name = "홍길동"; - } - - public Hero(String name, int hp) { - this.name = name; - this.hp = hp; - } - - public static void main(String[] args) { - int a = 10; - - Hero.money = 500; - - Hero hero1 = new Hero("홍길동", 100); - System.out.println(Hero.money); - - - Hero hero2 = hero1; - hero2.hp = 200; - System.out.println(hero1.hp); - - Sword sword1 = new Sword(); - sword1.damage = 100; - - hero1.sword = sword1; - - hero1 = null; -// String name = new String("오준석"); - - System.out.println(hero2.hp); - } -} diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Kinoko.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Kinoko.java deleted file mode 100644 index 67cbcc4c..00000000 --- a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Kinoko.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.survivalcoding.assignments_01_instance.exam01; - -public class Kinoko { - int hp; - final int level = 10; - - void attack() { - final int level = 20; - hp = 100; - } - - void setHP(int hp) { - this.hp = hp; - } - -} diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Sword.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Sword.java deleted file mode 100644 index 260f6e4d..00000000 --- a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Sword.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.survivalcoding.assignments_01_instance.exam01; - -public class Sword { - String name; - int damage; - - Sword() { - this("기본 이름"); - } - - Sword(String name) { - this.name = name; - damage = 10; - } - - public static void main(String[] args) { - Sword sword = new Sword("엑스칼리버"); - Sword sword2 = new Sword(); - - System.out.println(sword.name); - System.out.println(sword.damage); - } -} diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Wizard.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Wizard.java deleted file mode 100644 index d1028183..00000000 --- a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Wizard.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.survivalcoding.assignments_01_instance.exam01; - -public class Wizard { - String name; - int hp; - - void heal(Hero hero) { - hero.hp += 10; - } -} diff --git a/src/main/java/com/survivalcoding/game.puml b/src/main/java/com/survivalcoding/game.puml index 45cfab00..a65de87d 100644 --- a/src/main/java/com/survivalcoding/game.puml +++ b/src/main/java/com/survivalcoding/game.puml @@ -14,6 +14,11 @@ interface Attackable { class SoccerPlayer implements Attackable { } +class Hero{ + + String name + - int hp +} + abstract class Character implements Attackable { String name int hp diff --git a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java index 29dc54f0..fee0d49f 100644 --- a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java +++ b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java @@ -1,10 +1,9 @@ package com.survivalcoding.assignments_01_instance.exam01; +import com.survivalcoding.Cleric; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.util.Random; - import static org.junit.jupiter.api.Assertions.*; class ClericTest { @@ -152,6 +151,7 @@ public static void main(String[] args) { Cleric c4 = new Cleric(); System.out.println("c4 -> 이름: " + c4.name + ", HP: " + c4.hp + ", MP: " + c4.mp); + } diff --git a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/HeroTest.java b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/HeroTest.java new file mode 100644 index 00000000..770ac804 --- /dev/null +++ b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/HeroTest.java @@ -0,0 +1,26 @@ +package com.survivalcoding.assignments_01_instance.exam01; + +import com.survivalcoding.Hero; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class HeroTest { + + + @Test + void heroTest() { + Hero hero = new Hero("영웅", 100); + assertEquals(100, hero.getHp()); + + hero.setHp(0); + assertEquals(0, hero.getHp()); + hero.setHp(1); + assertEquals(1, hero.getHp()); + + assertThrows(IllegalArgumentException.class, () -> { + hero.setHp(-100); + }); + } + +} \ No newline at end of file From 70d34c8c9d15b6f3e91f6c9e03a619e3fd836f91 Mon Sep 17 00:00:00 2001 From: choiain Date: Thu, 19 Jun 2025 18:33:35 +0900 Subject: [PATCH 28/45] =?UTF-8?q?=EC=BA=A1=EC=8A=90=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TIL/topics/java_basic/2025.06.17 .md | 50 ++++-- src/main/java/com/survivalcoding/Wand.java | 17 +- src/main/java/com/survivalcoding/Wizard.java | 47 ++++-- .../exam01/Person.java | 26 +-- .../java/com/survivalcoding/ClericTest.java | 157 ++++++++++++++--- .../java/com/survivalcoding/HeroTest.java | 3 +- .../java/com/survivalcoding/KinokoTest.java | 37 +--- .../exam01/ClericTest.java | 159 ------------------ .../exam01/HeroTest.java | 26 --- .../exam01/KinokoTest.java | 25 --- 10 files changed, 235 insertions(+), 312 deletions(-) delete mode 100644 src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java delete mode 100644 src/test/java/com/survivalcoding/assignments_01_instance/exam01/HeroTest.java delete mode 100644 src/test/java/com/survivalcoding/assignments_01_instance/exam01/KinokoTest.java diff --git a/TIL/topics/java_basic/2025.06.17 .md b/TIL/topics/java_basic/2025.06.17 .md index 8686a5d8..0f8119e2 100644 --- a/TIL/topics/java_basic/2025.06.17 .md +++ b/TIL/topics/java_basic/2025.06.17 .md @@ -2,9 +2,18 @@ # TIL(Today I Learned) ## Test Code - - assertEquals(); - - - assertTrue(); + - assertEquals(); / assertNotEquals(); + 두 값이 같은지/다른지 확인 + - assertSame(); / assertNotSame(); + 두 객체의 참조가 같은지/다른지 확인 + - assertTrue(); / assertFalse(); + 조건이 true/false 인지 확인 + - assertNull(); / assertNotNull() + 객체가 null이 인지/아닌지 확인 + - assertArrayEquals(); + 두 배열이 같은지 확인 + - assertThrows(Exception.class, () -> { ... }); + 예외 발생 여부 확인 ## commit 메세지 - feat: 새로운 기능 추가 @@ -18,17 +27,16 @@ - ci: CI 설정 파일 수정 - perf: 성능 개선 - chore: 빌드 업무 수정, 패키지 매니저 수정 - - rename: 파일 혹은 풀더명을 수정만 한 경우 + - rename: 파일 혹은 풀더 명을 수정만 한 경우 - remove: 파일을 삭제만 한 경우 -객체지향의 3대 원칙 -캡슐화 (encapsulation) -상속 -다양성 -(추상화) +## 객체 지향의 3대 원칙 (4대의 경우 추상화 포함) + - 캡슐화 (encapsulation) + - 상속 + - 다양성 -오버로드 +오버 로드 없앨 수 없다. 안전한 클래스를 만들어야 하는데!! @@ -46,5 +54,25 @@ getter와 setter getter - 읽기 전용 setter - 쓰기 전용 -보일러플레이트 +보일러 플레이트 + +## 자료 구조 +동적 배열(Array) + +연결 리스트(List) + - 단순 연결 리스트 + +스택(Stack) + +큐(Queue) + +## 컬렉션 +List - +Map - +Set - + +Iterator it = names.iterator; + +HashSet - 컨테인즈 +HashMap - 빠르다 diff --git a/src/main/java/com/survivalcoding/Wand.java b/src/main/java/com/survivalcoding/Wand.java index cebf9630..137d15d0 100644 --- a/src/main/java/com/survivalcoding/Wand.java +++ b/src/main/java/com/survivalcoding/Wand.java @@ -1,8 +1,8 @@ package com.survivalcoding; public class Wand { - private String name; // null - private double power; // 0.0 + private String name; // 지팡이의 이름 + private double power; // 지팡이의 마력 public Wand(String name) { this(name, 10.0); @@ -14,29 +14,30 @@ public Wand(String name, double power) { } public String getName() { + return name; } public void setName(String name) { if (name == null) { - throw new IllegalArgumentException("지팡이의 이름은 null 일 수 없다"); + throw new IllegalArgumentException("지팡이 이름은 null일 수 없습니다."); } if (name.length() < 3) { - throw new IllegalArgumentException("지팡이의 이름은 3문자 이상이어야 한다"); + throw new IllegalArgumentException("이름은 3자 이상이어야 합니다."); } - this.name = name; } public double getPower() { + return power; } public void setPower(double power) { - // 0.5 이상 100.0 이하 - if (!(0.5 <= power && power <= 100.0)) { - throw new IllegalArgumentException("지팡이의 마력은 0.5 이상 100.0 이하여야 함"); + if (power < 0.5 || power > 100.0) { + throw new IllegalArgumentException("0.5 이상 100.0이하 이여야 한다."); } + this.power = power; } } diff --git a/src/main/java/com/survivalcoding/Wizard.java b/src/main/java/com/survivalcoding/Wizard.java index dde295aa..474c7532 100644 --- a/src/main/java/com/survivalcoding/Wizard.java +++ b/src/main/java/com/survivalcoding/Wizard.java @@ -28,43 +28,60 @@ public void fireball(Slime slime) { } - public String getName() { + void heal(Hero hero) { + int basePoint = 10; // 기본회복 포인트 + int recovPoint = (int) (basePoint * this.wand.getPower()); // 지팡이에 의한 증폭 + hero.setHp (hero.getHp() + recovPoint); // 용사의 HP를 회복 + } + + public String getName () { + return name; } - public void setName(String name) { + public void setName (String name) { + if (name == null) { + throw new IllegalArgumentException("이름은 null이 아니어야 함"); + } + if (name.length() < 3) { + throw new IllegalArgumentException("이름이 너무 짧음"); + } this.name = name; } - public int getHp() { + public int getHP () { + return hp; } - public void setHp(int hp) { - this.hp = hp; - - if (this.hp < 0) { + public void setHP (int hp) { + if (hp < 0) { this.hp = 0; } - void heal(Hero hero) { - int basePoint = 10; // 기본회복 포인트 - int recovPoint = (int) (basePoint * this.wand.power); // 지팡이에 의한 증폭 - hero.setHp(hero.getHp() + recovPoint); // 용사의 HP를 회복 + else { + this.hp = hp; + } } - public int getMp() { + public int getMP () { return mp; } - public void setMp(int mp) { + public void setMP (int mp) { + if (mp < 0) { + throw new IllegalArgumentException("MP는 0이상 이어야 한다."); + } this.mp = mp; } - public Wand getWand() { + public Wand getWand () { return wand; } - public void setWand(Wand wand) { + public void setWand (Wand wand) { + if (wand == null) { + throw new IllegalArgumentException("지팡이는 null일 수 없습니다."); + } this.wand = wand; } diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Person.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Person.java index 039b0123..e9c01490 100644 --- a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Person.java +++ b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Person.java @@ -1,27 +1,27 @@ package com.survivalcoding.assignments_01_instance.exam01; +import java.util.Calendar; public class Person { - private String name; - private int age; + private final String name; + private final int birthYear; + Calendar cal = Calendar.getInstance(); - public Person(String name, int age) { + public Person(String name, int birthYear) { this.name = name; - this.age = age; + this.birthYear = birthYear; + } public String getName() { return name; } - public int getAge() { - return age; + public int getBirthYear() { + return birthYear; } - public void setAge(int age) { - this.age = age; - } - - public static void main(String[] args) { - Person person = new Person("John", 30); + public int getAge() { + int yy = cal.get(Calendar.YEAR); + return yy - birthYear; } -} +} \ No newline at end of file diff --git a/src/test/java/com/survivalcoding/ClericTest.java b/src/test/java/com/survivalcoding/ClericTest.java index 3fc55499..f1f48519 100644 --- a/src/test/java/com/survivalcoding/ClericTest.java +++ b/src/test/java/com/survivalcoding/ClericTest.java @@ -1,49 +1,154 @@ package com.survivalcoding; - +import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; - class ClericTest { @Test - void selfAid() { + @DisplayName("selfAid() 사용 시 MP가 충분하다면, MP 5가 소비되고 HP는 최대 HP로 회복되어야 한다.") + //selfAid() 메소드 추가 인수가 없고, 리턴 값도 없다. + void selfAid1() { + // given + final Cleric cleric = new Cleric(); + cleric.hp = 5; + + // when + cleric.selfAid(); + + // then + assertEquals(50, cleric.hp); + } + + @Test + @DisplayName("selfAid() 사용 시 MP가 부족하다면, HP가 회복되지 않고 MP도 감소하지 않아야 한다.") + void selfAid2() { + // given + final Cleric cleric = new Cleric(); + cleric.hp = 5; + cleric.mp = 4; + + // when + cleric.selfAid(); + + // then + assertEquals(5, cleric.hp); + } + + @Test + @DisplayName("selfAid() 사용 시 HP가 이미 최대치라면, HP는 변하지 않고 MP만 소비되어야 한다.") + void selfAid3() { + // given + final Cleric cleric = new Cleric(); + cleric.hp = 50; + cleric.mp = 6; + + // when + cleric.selfAid(); + + // then + assertEquals(50, cleric.hp); + assertEquals(1, cleric.mp); + + } + + + @Test + @DisplayName("pray() 사용 시 MP가 회복되어야 하며, 반환 값은 실제로 회복된 MP 양과 일치해야 한다.") + void pray1() { + + // given + final Cleric cleric = new Cleric(); + cleric.mp = 2; + + // when + cleric.pray(2); + + // then + assertEquals(4, cleric.mp); + + } + + @Test + @DisplayName("pray()를 일정 시간 기도했을 때, 회복되는 MP 양이 '기도 시간'에서 '기도 시간 + 2' 사이의 랜덤 범위 내에 있어야 한다.") + void pray2() { + + // given + final Cleric cleric = new Cleric(); + cleric.mp = 2; + + // when + cleric.pray(3); + + // then + assertEquals(7, cleric.mp); + } - // MP가 꽉 찼을 때는 회복량 0 - // MP가 적을 때는 회복되어야 함 - // sec 가 0 이하면 그냥 0 리턴 + @Test + @DisplayName("pray() 사용 시 MP는 Max_MP를 초과하여 회복될 수 없으며, Max_MP 까지만 회복되어야 한다.") + void pray3() { + + // given + final Cleric cleric = new Cleric(); + cleric.mp = 8; + + // when + cleric.pray(3); + + // then + assertEquals(10, cleric.mp); + + } @Test - @DisplayName("MP가 꽉 찼을 때는 회복량 0") - void pray() { - // MP가 꽉 - Cleric cleric = new Cleric("아서스", 40, 10); + @DisplayName("pray() 사용 시 기도 시간(prayTimeSec)이 0이거나 음수일 경우, MP는 회복되지 않고 0을 반환해야 한다.") + void pray4() { - int recoveredMp = cleric.pray(10); + // given + final Cleric cleric = new Cleric(); + cleric.mp = 2; + + // when + cleric.pray(0); + + // then + assertEquals(2, cleric.mp); - assertEquals(0, recoveredMp); } @Test - void 클레릭_생성자_테스트() { - Cleric cleric = new Cleric("아서스", 40, 5); + @DisplayName("pray() 사용 시 MP가 이미 Max_MP 라면, MP는 변하지 않고 0을 반환해야 한다.") + void pray5() { - assertEquals("아서스", cleric.name); - assertEquals(40, cleric.hp); - assertEquals(5, cleric.mp); + // given + final Cleric cleric = new Cleric(); + cleric.mp = 10; - cleric = new Cleric("아서스", 35); + // when + cleric.pray(3); - assertEquals("아서스", cleric.name); - assertEquals(35, cleric.hp); - assertEquals(Cleric.maxMp, cleric.mp); + // then + assertEquals(10, cleric.mp); - cleric = new Cleric("아서스"); + } + + public static void main(String[] args) { + // 이름, HP, MP 모두 지정 + Cleric c1 = new Cleric("아서스", 40, 5); + System.out.println("c1 -> 이름: " + c1.name + ", HP: " + c1.hp + ", MP: " + c1.mp); + + // 이름과 HP만 지정 (MP는 최대 MP로 초기화) + Cleric c2 = new Cleric("아서스", 35); + System.out.println("c2 -> 이름: " + c2.name + ", HP: " + c2.hp + ", MP: " + c2.mp); + + // 이름만 지정 (HP, MP 모두 최대값으로 초기화) + Cleric c3 = new Cleric("아서스"); + System.out.println("c3 -> 이름: " + c3.name + ", HP: " + c3.hp + ", MP: " + c3.mp); + + Cleric c4 = new Cleric(); + System.out.println("c4 -> 이름: " + c4.name + ", HP: " + c4.hp + ", MP: " + c4.mp); - assertEquals("아서스", cleric.name); - assertEquals(Cleric.maxHp, cleric.hp); - assertEquals(Cleric.maxMp, cleric.mp); } + } \ No newline at end of file diff --git a/src/test/java/com/survivalcoding/HeroTest.java b/src/test/java/com/survivalcoding/HeroTest.java index 632d0ff2..1d75c0f2 100644 --- a/src/test/java/com/survivalcoding/HeroTest.java +++ b/src/test/java/com/survivalcoding/HeroTest.java @@ -6,6 +6,7 @@ class HeroTest { + @Test void heroTest() { Hero hero = new Hero("영웅", 100); @@ -19,6 +20,6 @@ void heroTest() { assertThrows(IllegalArgumentException.class, () -> { hero.setHp(-100); }); - } + } \ No newline at end of file diff --git a/src/test/java/com/survivalcoding/KinokoTest.java b/src/test/java/com/survivalcoding/KinokoTest.java index 66bae170..7e38e6fa 100644 --- a/src/test/java/com/survivalcoding/KinokoTest.java +++ b/src/test/java/com/survivalcoding/KinokoTest.java @@ -1,39 +1,20 @@ package com.survivalcoding; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - class KinokoTest { - @Test - @DisplayName("버섯 생성시 hp는 50이어야 한다") - void testCreate() { - Kinoko kinoko = new Kinoko(); - assertEquals(50, kinoko.hp); - } - - - @Test - @DisplayName("attack()을 하면 hp 가 100이 되어야 한다") - void testAttack() { + /*@Test //옵션 설명이 같이 나온다? + @DisplayName("heal을 하면 hp를 10 회복해야 한다") + void heal() { // given(준비) - Kinoko kinoko = new Kinoko(); - assertEquals(50, kinoko.hp); + final Wizard wizard = new Wizard("마법사", 100); + final Hero hero = new Hero("히어로", 10); // when(실행) - kinoko.attack(); + wizard.heal(hero); // then(검증) - assertEquals(100, kinoko.hp); - } + assertEquals(20, hero.hp); + }*/ + - @Test - @DisplayName("hp 설정이 잘 되어야 한다") - void testSetHp() { - Kinoko kinoko = new Kinoko(); - kinoko.setHp(200); - assertEquals(200, kinoko.hp); - } } \ No newline at end of file diff --git a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java deleted file mode 100644 index fee0d49f..00000000 --- a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/ClericTest.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.survivalcoding.assignments_01_instance.exam01; - -import com.survivalcoding.Cleric; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class ClericTest { - - @Test - @DisplayName("selfAid() 사용 시 MP가 충분하다면, MP 5가 소비되고 HP는 최대 HP로 회복되어야 한다.") - //selfAid() 메소드 추가 인수가 없고, 리턴 값도 없다. - void selfAid1() { - // given - final Cleric cleric = new Cleric(); - cleric.hp = 5; - - // when - cleric.selfAid(); - - // then - assertEquals(50, cleric.hp); - } - - @Test - @DisplayName("selfAid() 사용 시 MP가 부족하다면, HP가 회복되지 않고 MP도 감소하지 않아야 한다.") - void selfAid2() { - // given - final Cleric cleric = new Cleric(); - cleric.hp = 5; - cleric.mp = 4; - - // when - cleric.selfAid(); - - // then - assertEquals(5, cleric.hp); - } - - @Test - @DisplayName("selfAid() 사용 시 HP가 이미 최대치라면, HP는 변하지 않고 MP만 소비되어야 한다.") - void selfAid3() { - // given - final Cleric cleric = new Cleric(); - cleric.hp = 50; - cleric.mp = 6; - - // when - cleric.selfAid(); - - // then - assertEquals(50, cleric.hp); - assertEquals(1, cleric.mp); - - } - - - @Test - @DisplayName("pray() 사용 시 MP가 회복되어야 하며, 반환 값은 실제로 회복된 MP 양과 일치해야 한다.") - void pray1() { - - // given - final Cleric cleric = new Cleric(); - cleric.mp = 2; - - // when - cleric.pray(2); - - // then - assertEquals(4, cleric.mp); - - } - - @Test - @DisplayName("pray()를 일정 시간 기도했을 때, 회복되는 MP 양이 '기도 시간'에서 '기도 시간 + 2' 사이의 랜덤 범위 내에 있어야 한다.") - void pray2() { - - // given - final Cleric cleric = new Cleric(); - cleric.mp = 2; - - // when - cleric.pray(3); - - // then - assertEquals(7, cleric.mp); - - } - - @Test - @DisplayName("pray() 사용 시 MP는 Max_MP를 초과하여 회복될 수 없으며, Max_MP 까지만 회복되어야 한다.") - void pray3() { - - // given - final Cleric cleric = new Cleric(); - cleric.mp = 8; - - // when - cleric.pray(3); - - // then - assertEquals(10, cleric.mp); - - } - - @Test - @DisplayName("pray() 사용 시 기도 시간(prayTimeSec)이 0이거나 음수일 경우, MP는 회복되지 않고 0을 반환해야 한다.") - void pray4() { - - // given - final Cleric cleric = new Cleric(); - cleric.mp = 2; - - // when - cleric.pray(0); - - // then - assertEquals(2, cleric.mp); - - } - - @Test - @DisplayName("pray() 사용 시 MP가 이미 Max_MP 라면, MP는 변하지 않고 0을 반환해야 한다.") - void pray5() { - - // given - final Cleric cleric = new Cleric(); - cleric.mp = 10; - - // when - cleric.pray(3); - - // then - assertEquals(10, cleric.mp); - - } - - public static void main(String[] args) { - // 이름, HP, MP 모두 지정 - Cleric c1 = new Cleric("아서스", 40, 5); - System.out.println("c1 -> 이름: " + c1.name + ", HP: " + c1.hp + ", MP: " + c1.mp); - - // 이름과 HP만 지정 (MP는 최대 MP로 초기화) - Cleric c2 = new Cleric("아서스", 35); - System.out.println("c2 -> 이름: " + c2.name + ", HP: " + c2.hp + ", MP: " + c2.mp); - - // 이름만 지정 (HP, MP 모두 최대값으로 초기화) - Cleric c3 = new Cleric("아서스"); - System.out.println("c3 -> 이름: " + c3.name + ", HP: " + c3.hp + ", MP: " + c3.mp); - - Cleric c4 = new Cleric(); - System.out.println("c4 -> 이름: " + c4.name + ", HP: " + c4.hp + ", MP: " + c4.mp); - - } - - - -} \ No newline at end of file diff --git a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/HeroTest.java b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/HeroTest.java deleted file mode 100644 index 770ac804..00000000 --- a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/HeroTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.survivalcoding.assignments_01_instance.exam01; - -import com.survivalcoding.Hero; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class HeroTest { - - - @Test - void heroTest() { - Hero hero = new Hero("영웅", 100); - assertEquals(100, hero.getHp()); - - hero.setHp(0); - assertEquals(0, hero.getHp()); - hero.setHp(1); - assertEquals(1, hero.getHp()); - - assertThrows(IllegalArgumentException.class, () -> { - hero.setHp(-100); - }); - } - -} \ No newline at end of file diff --git a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/KinokoTest.java b/src/test/java/com/survivalcoding/assignments_01_instance/exam01/KinokoTest.java deleted file mode 100644 index ea7f6df3..00000000 --- a/src/test/java/com/survivalcoding/assignments_01_instance/exam01/KinokoTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.survivalcoding.assignments_01_instance.exam01; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class KinokoTest { - - /*@Test //옵션 설명이 같이 나온다? - @DisplayName("heal을 하면 hp를 10 회복해야 한다") - void heal() { - // given(준비) - final Wizard wizard = new Wizard("마법사", 100); - final Hero hero = new Hero("히어로", 10); - - // when(실행) - wizard.heal(hero); - - // then(검증) - assertEquals(20, hero.hp); - }*/ - - -} \ No newline at end of file From e6a4d982ae4f5c4131139640d84f37ead67a01b8 Mon Sep 17 00:00:00 2001 From: choiain Date: Mon, 23 Jun 2025 19:50:43 +0900 Subject: [PATCH 29/45] =?UTF-8?q?=EC=98=A4=EB=8A=98=20=EC=88=98=EC=97=85?= =?UTF-8?q?=20=EB=B0=8F=20=EA=B3=BC=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2025.06.23 \354\203\201\354\206\215.md" | 17 ++++++ src/main/java/com/survivalcoding/Person.java | 20 +++---- .../exam01/Person.java | 27 ---------- src/main/java/inheritance/GreatWizard.java | 23 ++++++++ src/main/java/inheritance/Hero.java | 46 ++++++++++++++++ src/main/java/inheritance/PoisonSlime.java | 24 +++++++++ src/main/java/inheritance/Slime.java | 27 ++++++++++ src/main/java/inheritance/SuperHero.java | 43 +++++++++++++++ src/main/java/inheritance/Wizard.java | 16 ++++++ src/main/java/inheritance/inheritance.puml | 54 +++++++++++++++++++ .../java/inheritance/PoisonSlimeTest.java | 42 +++++++++++++++ 11 files changed, 303 insertions(+), 36 deletions(-) create mode 100644 "TIL/topics/java_basic/2025.06.23 \354\203\201\354\206\215.md" delete mode 100644 src/main/java/com/survivalcoding/assignments_01_instance/exam01/Person.java create mode 100644 src/main/java/inheritance/GreatWizard.java create mode 100644 src/main/java/inheritance/Hero.java create mode 100644 src/main/java/inheritance/PoisonSlime.java create mode 100644 src/main/java/inheritance/Slime.java create mode 100644 src/main/java/inheritance/SuperHero.java create mode 100644 src/main/java/inheritance/Wizard.java create mode 100644 src/main/java/inheritance/inheritance.puml create mode 100644 src/test/java/inheritance/PoisonSlimeTest.java diff --git "a/TIL/topics/java_basic/2025.06.23 \354\203\201\354\206\215.md" "b/TIL/topics/java_basic/2025.06.23 \354\203\201\354\206\215.md" new file mode 100644 index 00000000..cc1e69c4 --- /dev/null +++ "b/TIL/topics/java_basic/2025.06.23 \354\203\201\354\206\215.md" @@ -0,0 +1,17 @@ + +# TIL (Today I Learned) + +## 상속 (inheritance) + 이전에 만든 클래스와 닮았지만, 일부 다른 클래스를 만들 때 + + public class 자식 클래스 extends 부모 클래스 + +## 오버라이드 (Override) + + +## 구제화와 일반화의 관계 +자식 클래스 일 수록 구체화 +부모 클래스 일 수록 추상적인 것으로 일반화 된다. + + +## \ No newline at end of file diff --git a/src/main/java/com/survivalcoding/Person.java b/src/main/java/com/survivalcoding/Person.java index a47b424a..2907d469 100644 --- a/src/main/java/com/survivalcoding/Person.java +++ b/src/main/java/com/survivalcoding/Person.java @@ -5,6 +5,13 @@ public class Person { private final String name; private final int birthYear; + Calendar cal = Calendar.getInstance(); + + public Person(String name, int birthYear) { + this.name = name; + this.birthYear = birthYear; + + } public String getName() { return name; @@ -15,14 +22,9 @@ public int getBirthYear() { } public int getAge() { - Calendar calendar = Calendar.getInstance(); - int year = calendar.get(Calendar.YEAR); - - return year - birthYear; + int yy = cal.get(Calendar.YEAR); + return yy - birthYear; } - public Person(String name, int birthYear) { - this.name = name; - this.birthYear = birthYear; - } -} + +} \ No newline at end of file diff --git a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Person.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Person.java deleted file mode 100644 index e9c01490..00000000 --- a/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Person.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.survivalcoding.assignments_01_instance.exam01; -import java.util.Calendar; - -public class Person { - private final String name; - private final int birthYear; - Calendar cal = Calendar.getInstance(); - - public Person(String name, int birthYear) { - this.name = name; - this.birthYear = birthYear; - - } - - public String getName() { - return name; - } - - public int getBirthYear() { - return birthYear; - } - - public int getAge() { - int yy = cal.get(Calendar.YEAR); - return yy - birthYear; - } -} \ No newline at end of file diff --git a/src/main/java/inheritance/GreatWizard.java b/src/main/java/inheritance/GreatWizard.java new file mode 100644 index 00000000..0d8500cf --- /dev/null +++ b/src/main/java/inheritance/GreatWizard.java @@ -0,0 +1,23 @@ +package inheritance; + +public class GreatWizard extends Wizard { + private int mp = 150; + + @Override + public void heal(Hero hero) { + hero.setHp(hero.getHp() + 25); + mp -= 5; + } + + public void superHeal(Hero hero) { + if (mp < 50) { + System.out.println("마나가 부족합니다"); + } + + hero.setHp(hero.getHp() ); + System.out.println("슈퍼 힐을 시전했습니다. 대상 HP: " + hero.getHp()); + mp -= 50; + } + + +} diff --git a/src/main/java/inheritance/Hero.java b/src/main/java/inheritance/Hero.java new file mode 100644 index 00000000..247b5abb --- /dev/null +++ b/src/main/java/inheritance/Hero.java @@ -0,0 +1,46 @@ +package inheritance; + +public class Hero { + private String name; + private int hp; + + public Hero(String name, int hp) { + this.name = name; + this.hp = hp; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getHp() { + return hp; + } + + public void setHp(int hp) { + this.hp = hp; + } + + // getter, setter, 생성자 생략 + + public void attack(Slime slime) { + System.out.println(name + "이 공격했다"); + hp -= 10; + } + + public void run() { + System.out.println(name + "이 도망쳤다"); + } + + public final void slip() { + hp -= 5; + System.out.println(name + "는 미끄러졌다!"); + System.out.println("5의 데미지!"); + } + + +} diff --git a/src/main/java/inheritance/PoisonSlime.java b/src/main/java/inheritance/PoisonSlime.java new file mode 100644 index 00000000..9367f918 --- /dev/null +++ b/src/main/java/inheritance/PoisonSlime.java @@ -0,0 +1,24 @@ +package inheritance; + +public class PoisonSlime extends Slime{ + private int poisonCount = 5; + + public PoisonSlime(String name, int hp) { + super(name, hp); + } + + + @Override + public void attack(Hero hero) { + System.out.println("보통 슬라임과 같은 공격"); + hero.setHp(hero.getHp() - 10); + + if (poisonCount > 0) { + System.out.println("추가로, 독 포자를 살포한다!"); + int damage = hero.getHp() / 5; + hero.setHp(hero.getHp() - damage); + System.out.println( damage + "포인트의 데미지"); + poisonCount --; + } + } +} diff --git a/src/main/java/inheritance/Slime.java b/src/main/java/inheritance/Slime.java new file mode 100644 index 00000000..bcd60750 --- /dev/null +++ b/src/main/java/inheritance/Slime.java @@ -0,0 +1,27 @@ +package inheritance; + +public class Slime { + private final String suffix; + private int hp; + + // 생성자 + public Slime (String suffix, int hp) { + this.suffix = suffix; + this.hp = hp; // 기본 HP 값 설정 + } + + public int getHP() { + return hp; + } + + public void setHP(int hp) { + this.hp = hp; + } + + void attack(Hero hero) { + System.out.println("슬라임 " + suffix + "이/가 공격했다"); + System.out.println("10의 데미지"); + + hero.setHp(hero.getHp() - 10); + } +} diff --git a/src/main/java/inheritance/SuperHero.java b/src/main/java/inheritance/SuperHero.java new file mode 100644 index 00000000..7b3abf30 --- /dev/null +++ b/src/main/java/inheritance/SuperHero.java @@ -0,0 +1,43 @@ +package inheritance; + +public class SuperHero extends Hero{ + private boolean isFlying; // 필드 추가 + + // 생성자 + public SuperHero(String name, int hp) { + super(name, hp); + } + + // 추가한 메소드들 + public boolean isFlying() { + return isFlying; + } + + public void setFlying(boolean flying) { + isFlying = flying; + } + + @Override + public void run() { + System.out.println("멋지게 퇴각했다"); + } + + @Override + public void attack(Slime slime) { + System.out.println(getName() + "이 공격했다"); + setHp( getHp() - 10); + + if (isFlying) { + slime.setHP(slime.getHP() - 5); + System.out.println("5포인트의 추가 피해를 입혔다"); + } + } + + public static void main(String[] args) { + Hero hero = new Hero("홍길동", 100); + hero.run(); + + SuperHero superHero = new SuperHero("한석봉", 50); + superHero.run(); + } +} diff --git a/src/main/java/inheritance/Wizard.java b/src/main/java/inheritance/Wizard.java new file mode 100644 index 00000000..f8706d7c --- /dev/null +++ b/src/main/java/inheritance/Wizard.java @@ -0,0 +1,16 @@ +package inheritance; + +public class Wizard { + private String name; + private int hp; + private int mp = 100; + + public void heal(Hero hero) { + if (mp < 10) { + System.out.println("마나가 부족합니다"); + } + + hero.setHp(hero.getHp() + 20); + System.out.println("힐을 시전했습니다. 대상 HP: " + hero.getHp()); + } +} diff --git a/src/main/java/inheritance/inheritance.puml b/src/main/java/inheritance/inheritance.puml new file mode 100644 index 00000000..b2106ac7 --- /dev/null +++ b/src/main/java/inheritance/inheritance.puml @@ -0,0 +1,54 @@ +@startuml +'https://plantuml.com/class-diagram + +scale 1 + +class Hero { + - String name + - int hp + + + void attack(Slime slime) + + void run() + + final void slip() +} + +class SuperHero extends Hero { + - boolean isFlying + + + SuperHero (String name, int hp) + + void attack (Slime slime) + + void run () +} + +class Wizard { + - String name + - int hp + - int mp + + + void heal(Hero hero) + +} + +class GreatWizard extends Wizard { + - int mp + + + void heal(Hero hero) + + void superHeal(Hero hero) +} + +class Slime { + - final String suffix + - int hp + + + Slime (String suffix, int hp) + + void attack(Hero hero, int damage) +} + +class PoisonSlime extends Slime { + - int poisonCount + + + PoisonSlime(String name, int hp) + + void attack(Hero hero, int damage) +} + +@enduml \ No newline at end of file diff --git a/src/test/java/inheritance/PoisonSlimeTest.java b/src/test/java/inheritance/PoisonSlimeTest.java new file mode 100644 index 00000000..b71aefd8 --- /dev/null +++ b/src/test/java/inheritance/PoisonSlimeTest.java @@ -0,0 +1,42 @@ +package inheritance; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PoisonSlimeTest { + + @Test + @DisplayName("") + void attack1() { + // given (준비) + final PoisonSlime PoisonSlime = new PoisonSlime("poison", 10); + final Hero hero = new Hero("영웅", 100); + int poisonCount = 1; + + // when (실행) + PoisonSlime.attack(hero); + + // then (검증) + assertEquals(85, hero.getHp()); + assertEquals(0, poisonCount); + + } + + @Test + @DisplayName("") + void attack2() { + // given (준비) + final PoisonSlime PoisonSlime = new PoisonSlime("poison", 10); + final Hero hero = new Hero("영웅", 100); + int poisonCount = 0; + + // when (실행) + PoisonSlime.attack(hero); + + // then (검증) + assertEquals(90, hero.getHp()); + + } +} \ No newline at end of file From 254554129abc8668d34bc914f1027aa982092cc5 Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 24 Jun 2025 16:10:04 +0900 Subject: [PATCH 30/45] =?UTF-8?q?=EC=B6=94=EC=83=81=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4,=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java_basic/2025.06 4\354\243\274.md" | 65 +++++++++++++++++ .../2025.06.23 \354\203\201\354\206\215.md" | 17 ----- src/main/java/Asset/Asset.java | 38 ++++++++++ src/main/java/Asset/Asset.puml | 48 +++++++++++++ src/main/java/Asset/Book.java | 18 +++++ src/main/java/Asset/Computer.java | 18 +++++ src/main/java/Asset/IntangibleAsset.java | 9 +++ src/main/java/Asset/Patent.java | 9 +++ src/main/java/Asset/TangibleAsset.java | 18 +++++ src/main/java/Asset/Thing.java | 9 +++ .../java/inheritance/PoisonSlimeTest.java | 69 +++++++++++++------ 11 files changed, 281 insertions(+), 37 deletions(-) create mode 100644 "TIL/topics/java_basic/2025.06 4\354\243\274.md" delete mode 100644 "TIL/topics/java_basic/2025.06.23 \354\203\201\354\206\215.md" create mode 100644 src/main/java/Asset/Asset.java create mode 100644 src/main/java/Asset/Asset.puml create mode 100644 src/main/java/Asset/Book.java create mode 100644 src/main/java/Asset/Computer.java create mode 100644 src/main/java/Asset/IntangibleAsset.java create mode 100644 src/main/java/Asset/Patent.java create mode 100644 src/main/java/Asset/TangibleAsset.java create mode 100644 src/main/java/Asset/Thing.java diff --git "a/TIL/topics/java_basic/2025.06 4\354\243\274.md" "b/TIL/topics/java_basic/2025.06 4\354\243\274.md" new file mode 100644 index 00000000..223dce73 --- /dev/null +++ "b/TIL/topics/java_basic/2025.06 4\354\243\274.md" @@ -0,0 +1,65 @@ + +# TIL 25.06.23 (Today I Learned) + +## 상속 (inheritance) + 이전에 만든 클래스와 닮았지만, 일부 다른 클래스를 만들 때 + + public class 자식 클래스 extends 부모 클래스 + + 자바는 다중상속을 허용하지 않는다. + + +## 오버라이드 (Override) + + +## 구제화와 일반화의 관계 +자식 클래스 일 수록 구체화 +부모 클래스 일 수록 추상적인 것으로 일반화 된다. + + +# TIL 25.06.24 (Today I Learned) + +## 추상 클래스 + 상속의 재료로 사용 되는 클래스 + 상세 부분이 일부 미정인 클래스 + 인스턴스화가 금지되어 있다. + +### 추상 메소드 + 추상 메소드를 가지려면 반드시 추상 클래스여야 한다. + + public abstract class Character { + + public abstract void attack(Hero hero) { + + } + } + +### 그림에서도 abstract 추가하기 + +## 인터페이스 + 모든 메소드는 추상 메소드 여야 한다. + 필드를 가지지 않는다 + + public interface Creature { + // public static final 이 생략 + double PI = 3.14; + void run(); + } + + interface. + + public class Hero implements Attackable { + protected String name; + protected int hp; + + @Override + public void attack(Slime slime) { + System.out.ptintln(name + "이 공격했다"); + hp -= 10; + } + } + + 인터페이스간의 상속 가능 + +interface / implements + diff --git "a/TIL/topics/java_basic/2025.06.23 \354\203\201\354\206\215.md" "b/TIL/topics/java_basic/2025.06.23 \354\203\201\354\206\215.md" deleted file mode 100644 index cc1e69c4..00000000 --- "a/TIL/topics/java_basic/2025.06.23 \354\203\201\354\206\215.md" +++ /dev/null @@ -1,17 +0,0 @@ - -# TIL (Today I Learned) - -## 상속 (inheritance) - 이전에 만든 클래스와 닮았지만, 일부 다른 클래스를 만들 때 - - public class 자식 클래스 extends 부모 클래스 - -## 오버라이드 (Override) - - -## 구제화와 일반화의 관계 -자식 클래스 일 수록 구체화 -부모 클래스 일 수록 추상적인 것으로 일반화 된다. - - -## \ No newline at end of file diff --git a/src/main/java/Asset/Asset.java b/src/main/java/Asset/Asset.java new file mode 100644 index 00000000..a9b0b96b --- /dev/null +++ b/src/main/java/Asset/Asset.java @@ -0,0 +1,38 @@ +package Asset; + +public abstract class Asset { + + private String name; + private int price; + private String color; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getPrice() { + return price; + } + + public void setPrice(int price) { + this.price = price; + } + + public String getColor() { + return color; + } + + public void setColor(String color) { + this.color = color; + } + + public Asset(String name, int price, String color) { + this.name = name; + this.price = price; + this.color = color; + } +} diff --git a/src/main/java/Asset/Asset.puml b/src/main/java/Asset/Asset.puml new file mode 100644 index 00000000..9b70c4c8 --- /dev/null +++ b/src/main/java/Asset/Asset.puml @@ -0,0 +1,48 @@ +@startuml +'https://plantuml.com/class-diagram + +abstract class Asset { + String name + int price + String color +} + +interface Thing { + double getWeight(); + void setWeight(double weight) +} + +abstract class TangibleAsset{ + +} + +abstract class IntangibleAsset { + +} + +class Computer { + String makerName +} + +class Book { + String isbn +} + +class Patent { + +} + + + +Thing <|.. TangibleAsset + +Asset <|-- TangibleAsset +Asset <|-- IntangibleAsset + +TangibleAsset <|-- Computer +TangibleAsset <|-- Book + +IntangibleAsset <|-- Patent + + +@enduml \ No newline at end of file diff --git a/src/main/java/Asset/Book.java b/src/main/java/Asset/Book.java new file mode 100644 index 00000000..4905078e --- /dev/null +++ b/src/main/java/Asset/Book.java @@ -0,0 +1,18 @@ +package Asset; + +public class Book extends TangibleAsset { + + String isbn; + + public Book(String name, int price, String color) { + super(name, price, color); + } + + public String getIsbn() { + return isbn; + } + + public void setIsbn(String isbn) { + this.isbn = isbn; + } +} diff --git a/src/main/java/Asset/Computer.java b/src/main/java/Asset/Computer.java new file mode 100644 index 00000000..02328173 --- /dev/null +++ b/src/main/java/Asset/Computer.java @@ -0,0 +1,18 @@ +package Asset; + +public class Computer extends TangibleAsset { + + String makerName; + + public Computer(String name, int price, String color) { + super(name, price, color); + } + + public String getMakerName() { + return makerName; + } + + public void setMakerName(String makerName) { + this.makerName = makerName; + } +} diff --git a/src/main/java/Asset/IntangibleAsset.java b/src/main/java/Asset/IntangibleAsset.java new file mode 100644 index 00000000..91b7d6b0 --- /dev/null +++ b/src/main/java/Asset/IntangibleAsset.java @@ -0,0 +1,9 @@ +package Asset; + +public abstract class IntangibleAsset extends Asset { + + + public IntangibleAsset(String name, int price, String color) { + super(name, price, color); + } +} diff --git a/src/main/java/Asset/Patent.java b/src/main/java/Asset/Patent.java new file mode 100644 index 00000000..96ff6836 --- /dev/null +++ b/src/main/java/Asset/Patent.java @@ -0,0 +1,9 @@ +package Asset; + +public class Patent extends IntangibleAsset { + + + public Patent(String name, int price, String color) { + super(name, price, color); + } +} diff --git a/src/main/java/Asset/TangibleAsset.java b/src/main/java/Asset/TangibleAsset.java new file mode 100644 index 00000000..2cb70cc7 --- /dev/null +++ b/src/main/java/Asset/TangibleAsset.java @@ -0,0 +1,18 @@ +package Asset; + +public abstract class TangibleAsset extends Asset implements Thing { + + protected double weight; + + public TangibleAsset(String name, int price, String color) { + super(name, price, color); + } + + public double getWeight() { + return weight; + } + + public void setWeight(double weight) { + this.weight = weight; + } +} diff --git a/src/main/java/Asset/Thing.java b/src/main/java/Asset/Thing.java new file mode 100644 index 00000000..91379a2e --- /dev/null +++ b/src/main/java/Asset/Thing.java @@ -0,0 +1,9 @@ +package Asset; + +public interface Thing { + + double getWeight(); + + void setWeight(double weight); + +} \ No newline at end of file diff --git a/src/test/java/inheritance/PoisonSlimeTest.java b/src/test/java/inheritance/PoisonSlimeTest.java index b71aefd8..ecda4c7f 100644 --- a/src/test/java/inheritance/PoisonSlimeTest.java +++ b/src/test/java/inheritance/PoisonSlimeTest.java @@ -1,42 +1,71 @@ package inheritance; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class PoisonSlimeTest { + PoisonSlime poisonSlime; + Hero hero; + + @BeforeEach + void setUp() { + poisonSlime = new PoisonSlime("A"); + hero = new Hero("홍길동", 1000000); + } @Test - @DisplayName("") - void attack1() { - // given (준비) - final PoisonSlime PoisonSlime = new PoisonSlime("poison", 10); - final Hero hero = new Hero("영웅", 100); - int poisonCount = 1; + @DisplayName("독 공격 횟수 테스트") + void attack() { + assertEquals(PoisonSlime.DEFAULT_POISON_COUNT, poisonSlime.getPoisonCount()); - // when (실행) - PoisonSlime.attack(hero); + for (int i = 0; i < PoisonSlime.DEFAULT_POISON_COUNT; i++) { + poisonSlime.attack(hero); + } - // then (검증) - assertEquals(85, hero.getHp()); - assertEquals(0, poisonCount); + assertEquals(0, poisonSlime.getPoisonCount()); + // 한 번 더 공격 + poisonSlime.attack(hero); + assertEquals(0, poisonSlime.getPoisonCount()); } @Test - @DisplayName("") + @DisplayName("일반 데미지 확인") void attack2() { - // given (준비) - final PoisonSlime PoisonSlime = new PoisonSlime("poison", 10); - final Hero hero = new Hero("영웅", 100); - int poisonCount = 0; + assertEquals(PoisonSlime.DEFAULT_POISON_COUNT, poisonSlime.getPoisonCount()); + + for (int i = 0; i < PoisonSlime.DEFAULT_POISON_COUNT; i++) { + poisonSlime.attack(hero); + } + + assertEquals(0, poisonSlime.getPoisonCount()); + + // 한 번 더 공격해서 일반 데미지 확인 + Hero hero1 = new Hero("김씨", 100); + int expectedHeroHp = hero1.getHp() - PoisonSlime.DEFAULT_DAMAGE; + + poisonSlime.attack(hero1); + assertEquals(expectedHeroHp, hero1.getHp()); + } + + @Test + @DisplayName("독 공격 확인") + void attack3() { + assertEquals(PoisonSlime.DEFAULT_POISON_COUNT, poisonSlime.getPoisonCount()); + + for (int i = 0; i < PoisonSlime.DEFAULT_POISON_COUNT; i++) { + Hero hero1 = new Hero("실험체", 100); + int expectedHeroHp = hero1.getHp() - PoisonSlime.DEFAULT_DAMAGE; - // when (실행) - PoisonSlime.attack(hero); + poisonSlime.attack(hero1); - // then (검증) - assertEquals(90, hero.getHp()); + assertNotEquals(expectedHeroHp, hero1.getHp()); + assertTrue(expectedHeroHp > hero1.getHp()); + } + assertEquals(0, poisonSlime.getPoisonCount()); } } \ No newline at end of file From 493799aa1d41259602ee3cd32e1f5662a8fccf02 Mon Sep 17 00:00:00 2001 From: choiain Date: Mon, 30 Jun 2025 16:58:08 +0900 Subject: [PATCH 31/45] =?UTF-8?q?2025.06.30=20=EC=88=98=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java_basic/2025.07 1\354\243\274.md" | 13 ++++++++ src/main/java/Asset/Asset.puml | 10 +++++- src/main/java/Asset/AssetMain.java | 31 +++++++++++++++++++ src/main/java/Monster/FlyingMonster.java | 10 ++++++ src/main/java/Monster/Goblin.java | 16 ++++++++++ src/main/java/Monster/Monster.java | 11 +++++++ src/main/java/Monster/WalkingMonster.java | 9 ++++++ src/main/java/Monster/WarWolf.java | 16 ++++++++++ src/main/java/com/survivalcoding/Wand.java | 4 +-- .../java/com/survivalcoding/PersonTest.java | 2 +- .../java/com/survivalcoding/WandTest.java | 1 + 11 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 "TIL/topics/java_basic/2025.07 1\354\243\274.md" create mode 100644 src/main/java/Asset/AssetMain.java create mode 100644 src/main/java/Monster/FlyingMonster.java create mode 100644 src/main/java/Monster/Goblin.java create mode 100644 src/main/java/Monster/Monster.java create mode 100644 src/main/java/Monster/WalkingMonster.java create mode 100644 src/main/java/Monster/WarWolf.java diff --git "a/TIL/topics/java_basic/2025.07 1\354\243\274.md" "b/TIL/topics/java_basic/2025.07 1\354\243\274.md" new file mode 100644 index 00000000..6198eafb --- /dev/null +++ "b/TIL/topics/java_basic/2025.07 1\354\243\274.md" @@ -0,0 +1,13 @@ +# TIL 25.06.30 (Today I Learned) + +## 다형성 + +어떤 것을 이렇게도 부를 수 있고, 저렇게도 부를 수 있는 것 + +### 공통 메소드를 통합 + +house.draw() +dog.draw() +car.draw() + +## Interface 정의 diff --git a/src/main/java/Asset/Asset.puml b/src/main/java/Asset/Asset.puml index 9b70c4c8..f7e34aa5 100644 --- a/src/main/java/Asset/Asset.puml +++ b/src/main/java/Asset/Asset.puml @@ -13,7 +13,10 @@ interface Thing { } abstract class TangibleAsset{ + double weight + double getWeight() + void setWeight(double weight) } abstract class IntangibleAsset { @@ -22,10 +25,16 @@ abstract class IntangibleAsset { class Computer { String makerName + + String getMakerName() + void setMakerName(String makerName) } class Book { String isbn + + String getIsbn() + void setIsbn(String isbn) } class Patent { @@ -33,7 +42,6 @@ class Patent { } - Thing <|.. TangibleAsset Asset <|-- TangibleAsset diff --git a/src/main/java/Asset/AssetMain.java b/src/main/java/Asset/AssetMain.java new file mode 100644 index 00000000..e9d7f16c --- /dev/null +++ b/src/main/java/Asset/AssetMain.java @@ -0,0 +1,31 @@ +package Asset; + +import java.util.ArrayList; +import java.util.List; + +public class AssetMain { + + public static void main(String[] args) { + Book book = new Book("aa", 10, "bb"); + Computer computer = new Computer("aa", 10, "bb"); + + Water water = new Water(); + + List assets = new ArrayList<>(); + assets.add(book); + assets.add(computer); + assets.add(water); + } +} + +class Water implements Thing { + @Override + public double getWeight() { + return 0; + } + + @Override + public void setWeight(double weight) { + + } +} \ No newline at end of file diff --git a/src/main/java/Monster/FlyingMonster.java b/src/main/java/Monster/FlyingMonster.java new file mode 100644 index 00000000..796a5f35 --- /dev/null +++ b/src/main/java/Monster/FlyingMonster.java @@ -0,0 +1,10 @@ +package Monster; + +public abstract class FlyingMonster extends Monster { + + @Override + public void run() { + System.out.println("FlyingMonster run"); + } + +} diff --git a/src/main/java/Monster/Goblin.java b/src/main/java/Monster/Goblin.java new file mode 100644 index 00000000..16ad8dd2 --- /dev/null +++ b/src/main/java/Monster/Goblin.java @@ -0,0 +1,16 @@ +package Monster; + +public class Goblin extends WalkingMonster { + + @Override + public void attack() { + System.out.println("Goblin attack"); + } + + @Override + public void run() { + super.run(); + + System.out.println("Goblin run"); + } +} diff --git a/src/main/java/Monster/Monster.java b/src/main/java/Monster/Monster.java new file mode 100644 index 00000000..39add677 --- /dev/null +++ b/src/main/java/Monster/Monster.java @@ -0,0 +1,11 @@ +package Monster; + +public abstract class Monster { + + private int hp; + private int mp; + + public abstract void attack(); + + public abstract void run(); +} diff --git a/src/main/java/Monster/WalkingMonster.java b/src/main/java/Monster/WalkingMonster.java new file mode 100644 index 00000000..54803a8a --- /dev/null +++ b/src/main/java/Monster/WalkingMonster.java @@ -0,0 +1,9 @@ +package Monster; + +public abstract class WalkingMonster extends Monster { + + @Override + public void run() { + System.out.println("WalkingMonster run"); + } +} diff --git a/src/main/java/Monster/WarWolf.java b/src/main/java/Monster/WarWolf.java new file mode 100644 index 00000000..10a8f0d5 --- /dev/null +++ b/src/main/java/Monster/WarWolf.java @@ -0,0 +1,16 @@ +package Monster; + +public class WarWolf extends WalkingMonster { + + @Override + public void attack() { + System.out.println("WarWolf attack"); + } + + @Override + public void run() { + super.run(); + + System.out.println("WarWolf run"); + } +} diff --git a/src/main/java/com/survivalcoding/Wand.java b/src/main/java/com/survivalcoding/Wand.java index 137d15d0..f2a5b361 100644 --- a/src/main/java/com/survivalcoding/Wand.java +++ b/src/main/java/com/survivalcoding/Wand.java @@ -9,7 +9,7 @@ public Wand(String name) { } public Wand(String name, double power) { - setName(name); + this.name = name; this.power = power; } @@ -20,7 +20,7 @@ public String getName() { public void setName(String name) { if (name == null) { - throw new IllegalArgumentException("지팡이 이름은 null일 수 없습니다."); + throw new IllegalArgumentException("지팡이 이름은 null일 수 없다."); } if (name.length() < 3) { throw new IllegalArgumentException("이름은 3자 이상이어야 합니다."); diff --git a/src/test/java/com/survivalcoding/PersonTest.java b/src/test/java/com/survivalcoding/PersonTest.java index 64ff1c46..fa3e9537 100644 --- a/src/test/java/com/survivalcoding/PersonTest.java +++ b/src/test/java/com/survivalcoding/PersonTest.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; class PersonTest { diff --git a/src/test/java/com/survivalcoding/WandTest.java b/src/test/java/com/survivalcoding/WandTest.java index 1586ad53..5f28670b 100644 --- a/src/test/java/com/survivalcoding/WandTest.java +++ b/src/test/java/com/survivalcoding/WandTest.java @@ -9,6 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; class WandTest { + Wand wand; @BeforeEach From 4361b4df0e3e97ed78c2b1ca40153cb0f8e82e98 Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 1 Jul 2025 14:55:03 +0900 Subject: [PATCH 32/45] Push --- .../java_basic/2025.07 1\354\243\274.md" | 20 ++++++- src/main/java/generic/AuthState.java | 7 +++ src/main/java/generic/EnumMain.java | 19 ++++++ src/main/java/generic/Pocket.java | 30 ++++++++++ src/main/java/inheritance/Slime.java | 58 +++++++++++++++---- src/main/java/inheritance/Wizard.java | 4 +- 6 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 src/main/java/generic/AuthState.java create mode 100644 src/main/java/generic/EnumMain.java create mode 100644 src/main/java/generic/Pocket.java diff --git "a/TIL/topics/java_basic/2025.07 1\354\243\274.md" "b/TIL/topics/java_basic/2025.07 1\354\243\274.md" index 6198eafb..e3f943c1 100644 --- "a/TIL/topics/java_basic/2025.07 1\354\243\274.md" +++ "b/TIL/topics/java_basic/2025.07 1\354\243\274.md" @@ -6,8 +6,22 @@ ### 공통 메소드를 통합 -house.draw() -dog.draw() -car.draw() +- house.draw() +- dog.draw() +- car.draw() ## Interface 정의 + +# TIL 25.07.01 (Today I Learned) + +## 제네릭 (Generic) + +타입을 나중에 원하는 형태로 정의 할 수 있음 + +## 열거형 (enum) + +정해 둔 값만 넣어둘 수 있는 타입 + +## 이너클래스 (Inner class) + +클래스 안에 정의하는 클래스 \ No newline at end of file diff --git a/src/main/java/generic/AuthState.java b/src/main/java/generic/AuthState.java new file mode 100644 index 00000000..96e4ccf6 --- /dev/null +++ b/src/main/java/generic/AuthState.java @@ -0,0 +1,7 @@ +package generic; + +public enum AuthState { + AUTHENTICATED, + UNAUTHENTICATED, + AUTHENTICATING, +} diff --git a/src/main/java/generic/EnumMain.java b/src/main/java/generic/EnumMain.java new file mode 100644 index 00000000..4368b55d --- /dev/null +++ b/src/main/java/generic/EnumMain.java @@ -0,0 +1,19 @@ +package generic; + +public class EnumMain { + public static void main(String[] args) { + AuthState state = AuthState.AUTHENTICATED; + + switch (state) { + case AuthState.AUTHENTICATED: { + System.out.println("AUTHENTICATED"); + } + case AuthState.UNAUTHENTICATED: { + System.out.println("UNAUTHENTICATED"); + } + case AuthState.AUTHENTICATING: { + System.out.println("AUTHENTICATING"); + } + } + } +} diff --git a/src/main/java/generic/Pocket.java b/src/main/java/generic/Pocket.java new file mode 100644 index 00000000..2181893b --- /dev/null +++ b/src/main/java/generic/Pocket.java @@ -0,0 +1,30 @@ +package generic; + +import com.survivalcoding.Cleric; +import com.survivalcoding.Wizard; + +public class Pocket { + private E data; + + public void put(E data) { + this.data = data; + } + + public E get() { + return data; + } + + public static void main(String[] args) { + /* Pocket pocket = new Pocket<>(); + pocket.put("111"); + + String name = pocket.get(); + System.out.println(name); */ + + Pocket pocket1 = new Pocket<>(); + pocket1.put(new Cleric("11")); + + Pocket pocket2 = new Pocket<>(); + Pocket pocket3 = new Pocket<>(); + } +} diff --git a/src/main/java/inheritance/Slime.java b/src/main/java/inheritance/Slime.java index bcd60750..2666ed7c 100644 --- a/src/main/java/inheritance/Slime.java +++ b/src/main/java/inheritance/Slime.java @@ -1,27 +1,61 @@ package inheritance; -public class Slime { - private final String suffix; +import Monster.Monster; + +public class Slime extends Monster { + public static final int DEFAULT_DAMAGE = 10; + + private final String prefix; private int hp; + private int damage = DEFAULT_DAMAGE; + + public Slime(String prefix, int hp) { + this.prefix = prefix; + this.hp = hp; + } - // 생성자 - public Slime (String suffix, int hp) { - this.suffix = suffix; - this.hp = hp; // 기본 HP 값 설정 + public String getPrefix() { + return prefix; } - public int getHP() { + public int getHp() { return hp; } - public void setHP(int hp) { + public void setHp(int hp) { this.hp = hp; } - void attack(Hero hero) { - System.out.println("슬라임 " + suffix + "이/가 공격했다"); - System.out.println("10의 데미지"); + public int getDamage() { + return damage; + } + + public void setDamage(int damage) { + this.damage = damage; + } + + public void attack(Hero hero) { + hero.setHp(hero.getHp() - damage); + } + + @Override + public void run() { + System.out.println("2"); + } + + public static void main(String[] args) { + Slime slime = new Slime("", 10); + Monster monster = new Slime("", 10); + slime.run(); + monster.run(); + +// Slime slime1 = (Hero) monster; + + float ff = 10f;Add commentMore actions + int dd = 10; + + ff = dd; - hero.setHp(hero.getHp() - 10); + dd = (int) ff; } } diff --git a/src/main/java/inheritance/Wizard.java b/src/main/java/inheritance/Wizard.java index f8706d7c..73631a04 100644 --- a/src/main/java/inheritance/Wizard.java +++ b/src/main/java/inheritance/Wizard.java @@ -1,9 +1,9 @@ package inheritance; -public class Wizard { +public class Wizard extends Character { private String name; private int hp; - private int mp = 100; + private int mp; public void heal(Hero hero) { if (mp < 10) { From 25dbd46d59a3d3bdbcad0991b1a917f3076ccd7f Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 1 Jul 2025 16:46:30 +0900 Subject: [PATCH 33/45] =?UTF-8?q?=EC=A0=95=EB=A6=AC=ED=95=98=EA=B8=B0git?= =?UTF-8?q?=20add=20.git=20add=20.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/survivalcoding/asset/Asset.java | 27 --------- .../com/survivalcoding/asset/AssetMain.java | 46 --------------- .../java/com/survivalcoding/asset/Book.java | 18 ------ .../com/survivalcoding/asset/Computer.java | 18 ------ .../survivalcoding/asset/TangibleAsset.java | 30 ---------- .../java/com/survivalcoding/asset/Thing.java | 6 -- .../java/com/survivalcoding/asset/asset.puml | 31 ---------- .../com/survivalcoding/generic/AuthState.java | 8 --- .../com/survivalcoding/generic/EnumMain.java | 23 -------- .../com/survivalcoding/generic/Pocket.java | 31 ---------- .../survivalcoding/monster/FlyingMonster.java | 9 --- .../com/survivalcoding/monster/Goblin.java | 11 ---- .../com/survivalcoding/monster/Monster.java | 10 ---- .../monster/WalkingMonster.java | 9 --- .../com/survivalcoding/monster/WarWolf.java | 11 ---- src/main/java/generic/AuthState.java | 1 + src/main/java/generic/EnumMain.java | 16 +++-- src/main/java/inheritance/Hero.java | 5 ++ src/main/java/inheritance/PoisonSlime.java | 9 +-- src/main/java/inheritance/Slime.java | 58 ++++--------------- src/main/java/inheritance/Wizard.java | 4 +- 21 files changed, 36 insertions(+), 345 deletions(-) delete mode 100644 src/main/java/com/survivalcoding/asset/Asset.java delete mode 100644 src/main/java/com/survivalcoding/asset/AssetMain.java delete mode 100644 src/main/java/com/survivalcoding/asset/Book.java delete mode 100644 src/main/java/com/survivalcoding/asset/Computer.java delete mode 100644 src/main/java/com/survivalcoding/asset/TangibleAsset.java delete mode 100644 src/main/java/com/survivalcoding/asset/Thing.java delete mode 100644 src/main/java/com/survivalcoding/asset/asset.puml delete mode 100644 src/main/java/com/survivalcoding/generic/AuthState.java delete mode 100644 src/main/java/com/survivalcoding/generic/EnumMain.java delete mode 100644 src/main/java/com/survivalcoding/generic/Pocket.java delete mode 100644 src/main/java/com/survivalcoding/monster/FlyingMonster.java delete mode 100644 src/main/java/com/survivalcoding/monster/Goblin.java delete mode 100644 src/main/java/com/survivalcoding/monster/Monster.java delete mode 100644 src/main/java/com/survivalcoding/monster/WalkingMonster.java delete mode 100644 src/main/java/com/survivalcoding/monster/WarWolf.java diff --git a/src/main/java/com/survivalcoding/asset/Asset.java b/src/main/java/com/survivalcoding/asset/Asset.java deleted file mode 100644 index 3536ba0e..00000000 --- a/src/main/java/com/survivalcoding/asset/Asset.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.survivalcoding.asset; - -public abstract class Asset { - private String name; - private int price; - - public Asset(String name, int price) { - this.name = name; - this.price = price; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getPrice() { - return price; - } - - public void setPrice(int price) { - this.price = price; - } -} diff --git a/src/main/java/com/survivalcoding/asset/AssetMain.java b/src/main/java/com/survivalcoding/asset/AssetMain.java deleted file mode 100644 index 931b9dce..00000000 --- a/src/main/java/com/survivalcoding/asset/AssetMain.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.survivalcoding.asset; - -import java.util.ArrayList; -import java.util.List; - -public class AssetMain { - public static void main(String[] args) { - Book book = new Book("책", 10, "bb", "a1123123123", 10.0); - Computer computer = new Computer("컴퓨터", 10, "bb", "bb", 10.0); - - Water water = new Water(); - - List assets = new ArrayList<>(); - assets.add(book); - assets.add(computer); - - for (Asset asset : assets) { - System.out.println(asset.getName()); - - if (asset instanceof Book) { - Book bookAsset = (Book) asset; - System.out.println(bookAsset.getIsbn()); - } else if (asset instanceof Computer) { - Computer computerAsset = (Computer) asset; - System.out.println(computerAsset.getMakerName()); - } - } - } -} - -// marker interface -interface Liquid { - -} - -class Water implements Thing, Liquid { - @Override - public double getWeight() { - return 0; - } - - @Override - public void setWeight(double weight) { - - } -} diff --git a/src/main/java/com/survivalcoding/asset/Book.java b/src/main/java/com/survivalcoding/asset/Book.java deleted file mode 100644 index 0337d1ce..00000000 --- a/src/main/java/com/survivalcoding/asset/Book.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.survivalcoding.asset; - -public class Book extends TangibleAsset { - private String isbn; - - public Book(String name, int price, String color, String isbn, double weight) { - super(name, price, color, weight); - this.isbn = isbn; - } - - public String getIsbn() { - return isbn; - } - - public void setIsbn(String isbn) { - this.isbn = isbn; - } -} diff --git a/src/main/java/com/survivalcoding/asset/Computer.java b/src/main/java/com/survivalcoding/asset/Computer.java deleted file mode 100644 index ca8ca005..00000000 --- a/src/main/java/com/survivalcoding/asset/Computer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.survivalcoding.asset; - -public class Computer extends TangibleAsset { - private String makerName; - - public Computer(String name, int price, String color, String makerName, double weight) { - super(name, price, color, weight); - this.makerName = makerName; - } - - public String getMakerName() { - return makerName; - } - - public void setMakerName(String makerName) { - this.makerName = makerName; - } -} diff --git a/src/main/java/com/survivalcoding/asset/TangibleAsset.java b/src/main/java/com/survivalcoding/asset/TangibleAsset.java deleted file mode 100644 index 96c27416..00000000 --- a/src/main/java/com/survivalcoding/asset/TangibleAsset.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.survivalcoding.asset; - -public abstract class TangibleAsset extends Asset implements Thing { - private String color; - private double weight; - - public TangibleAsset(String name, int price, String color, double weight) { - super(name, price); - this.color = color; - this.weight = weight; - } - - public String getColor() { - return color; - } - - public void setColor(String color) { - this.color = color; - } - - @Override - public double getWeight() { - return weight; - } - - @Override - public void setWeight(double weight) { - this.weight = weight; - } -} diff --git a/src/main/java/com/survivalcoding/asset/Thing.java b/src/main/java/com/survivalcoding/asset/Thing.java deleted file mode 100644 index af684073..00000000 --- a/src/main/java/com/survivalcoding/asset/Thing.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.survivalcoding.asset; - -public interface Thing { - double getWeight(); - void setWeight(double weight); -} diff --git a/src/main/java/com/survivalcoding/asset/asset.puml b/src/main/java/com/survivalcoding/asset/asset.puml deleted file mode 100644 index 60972b12..00000000 --- a/src/main/java/com/survivalcoding/asset/asset.puml +++ /dev/null @@ -1,31 +0,0 @@ -@startuml -scale 1.5 - -interface Thing { - double getWeight() - void setWeight(double weight) -} - -abstract class Asset { - String name - int price -} - -abstract class TangibleAsset extends Asset implements Thing { - String color - double weight -} - -class Book extends TangibleAsset { - String isbn -} - -class Computer extends TangibleAsset { - String makerName -} - -class Patent extends IntangibleAsset - -abstract class IntangibleAsset extends Asset { -} -@enduml \ No newline at end of file diff --git a/src/main/java/com/survivalcoding/generic/AuthState.java b/src/main/java/com/survivalcoding/generic/AuthState.java deleted file mode 100644 index 79128ddb..00000000 --- a/src/main/java/com/survivalcoding/generic/AuthState.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.survivalcoding.generic; - -public enum AuthState { - AUTHENTICATED, - UNAUTHENTICATED, - UNKNOWN, - AUTHENTICATING, -} diff --git a/src/main/java/com/survivalcoding/generic/EnumMain.java b/src/main/java/com/survivalcoding/generic/EnumMain.java deleted file mode 100644 index 3c95d1b9..00000000 --- a/src/main/java/com/survivalcoding/generic/EnumMain.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.survivalcoding.generic; - -public class EnumMain { - public static void main(String[] args) { - // 값 - AuthState state = AuthState.AUTHENTICATED; - - switch (state) { - case AUTHENTICATED: { - System.out.println("AUTHENTICATED"); - } - case UNAUTHENTICATED: { - System.out.println("UNAUTHENTICATED"); - } - case UNKNOWN: { - System.out.println("UNKNOWN"); - } - default: { - System.out.println("default"); - } - } - } -} diff --git a/src/main/java/com/survivalcoding/generic/Pocket.java b/src/main/java/com/survivalcoding/generic/Pocket.java deleted file mode 100644 index 192faca0..00000000 --- a/src/main/java/com/survivalcoding/generic/Pocket.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.survivalcoding.generic; - -import com.survivalcoding.Character; -import com.survivalcoding.Cleric; -import com.survivalcoding.Wizard; - -public class Pocket { - private E data; - - public void put(E data) { - this.data = data; - } - - public E get() { - return data; - } - - public static void main(String[] args) { -// Pocket pocket = new Pocket<>(); -// pocket.put("111"); - -// String name = pocket.get(); -// System.out.println(name); - - Pocket pocket1 = new Pocket<>(); - pocket1.put(new Cleric("11")); - - Pocket pocket2 = new Pocket<>(); - Pocket pocket3 = new Pocket<>(); - } -} diff --git a/src/main/java/com/survivalcoding/monster/FlyingMonster.java b/src/main/java/com/survivalcoding/monster/FlyingMonster.java deleted file mode 100644 index 1fc8d04c..00000000 --- a/src/main/java/com/survivalcoding/monster/FlyingMonster.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.survivalcoding.monster; - -public abstract class FlyingMonster extends Monster { - - @Override - public void run() { - System.out.println("FlyingMonster run"); - } -} diff --git a/src/main/java/com/survivalcoding/monster/Goblin.java b/src/main/java/com/survivalcoding/monster/Goblin.java deleted file mode 100644 index 6105564a..00000000 --- a/src/main/java/com/survivalcoding/monster/Goblin.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.survivalcoding.monster; - -public class Goblin extends WalkingMonster { - - @Override - public void run() { - super.run(); - - System.out.println("Goblin run"); - } -} diff --git a/src/main/java/com/survivalcoding/monster/Monster.java b/src/main/java/com/survivalcoding/monster/Monster.java deleted file mode 100644 index 22d25989..00000000 --- a/src/main/java/com/survivalcoding/monster/Monster.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.survivalcoding.monster; - -public abstract class Monster { - private int hp; - private int mp; - - public void run() { - System.out.println("1"); - } -} diff --git a/src/main/java/com/survivalcoding/monster/WalkingMonster.java b/src/main/java/com/survivalcoding/monster/WalkingMonster.java deleted file mode 100644 index 620be389..00000000 --- a/src/main/java/com/survivalcoding/monster/WalkingMonster.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.survivalcoding.monster; - -public abstract class WalkingMonster extends Monster { - - @Override - public void run() { - System.out.println("WalkingMonster run"); - } -} diff --git a/src/main/java/com/survivalcoding/monster/WarWolf.java b/src/main/java/com/survivalcoding/monster/WarWolf.java deleted file mode 100644 index e9da6e34..00000000 --- a/src/main/java/com/survivalcoding/monster/WarWolf.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.survivalcoding.monster; - -public class WarWolf extends WalkingMonster { - - @Override - public void run() { - super.run(); - - System.out.println("WarWolf run"); - } -} diff --git a/src/main/java/generic/AuthState.java b/src/main/java/generic/AuthState.java index 96e4ccf6..a1ee9b30 100644 --- a/src/main/java/generic/AuthState.java +++ b/src/main/java/generic/AuthState.java @@ -3,5 +3,6 @@ public enum AuthState { AUTHENTICATED, UNAUTHENTICATED, + UNKNOWN, AUTHENTICATING, } diff --git a/src/main/java/generic/EnumMain.java b/src/main/java/generic/EnumMain.java index 4368b55d..9bb5dbda 100644 --- a/src/main/java/generic/EnumMain.java +++ b/src/main/java/generic/EnumMain.java @@ -1,18 +1,24 @@ package generic; +import com.survivalcoding.generic.AuthState; + public class EnumMain { public static void main(String[] args) { - AuthState state = AuthState.AUTHENTICATED; + // 값 + com.survivalcoding.generic.AuthState state = AuthState.AUTHENTICATED; switch (state) { - case AuthState.AUTHENTICATED: { + case AUTHENTICATED: { System.out.println("AUTHENTICATED"); } - case AuthState.UNAUTHENTICATED: { + case UNAUTHENTICATED: { System.out.println("UNAUTHENTICATED"); } - case AuthState.AUTHENTICATING: { - System.out.println("AUTHENTICATING"); + case UNKNOWN: { + System.out.println("UNKNOWN"); + } + default: { + System.out.println("default"); } } } diff --git a/src/main/java/inheritance/Hero.java b/src/main/java/inheritance/Hero.java index 247b5abb..e1ba32e7 100644 --- a/src/main/java/inheritance/Hero.java +++ b/src/main/java/inheritance/Hero.java @@ -10,18 +10,22 @@ public Hero(String name, int hp) { } public String getName() { + return name; } public void setName(String name) { + this.name = name; } public int getHp() { + return hp; } public void setHp(int hp) { + this.hp = hp; } @@ -33,6 +37,7 @@ public void attack(Slime slime) { } public void run() { + System.out.println(name + "이 도망쳤다"); } diff --git a/src/main/java/inheritance/PoisonSlime.java b/src/main/java/inheritance/PoisonSlime.java index 9367f918..1b3e5a87 100644 --- a/src/main/java/inheritance/PoisonSlime.java +++ b/src/main/java/inheritance/PoisonSlime.java @@ -1,9 +1,10 @@ package inheritance; -public class PoisonSlime extends Slime{ +public class PoisonSlime extends Slime { private int poisonCount = 5; public PoisonSlime(String name, int hp) { + super(name, hp); } @@ -11,14 +12,14 @@ public PoisonSlime(String name, int hp) { @Override public void attack(Hero hero) { System.out.println("보통 슬라임과 같은 공격"); - hero.setHp(hero.getHp() - 10); + hero.setHp(hero.getHp() - 10); if (poisonCount > 0) { System.out.println("추가로, 독 포자를 살포한다!"); int damage = hero.getHp() / 5; hero.setHp(hero.getHp() - damage); - System.out.println( damage + "포인트의 데미지"); - poisonCount --; + System.out.println(damage + "포인트의 데미지"); + poisonCount--; } } } diff --git a/src/main/java/inheritance/Slime.java b/src/main/java/inheritance/Slime.java index 2666ed7c..455a68f9 100644 --- a/src/main/java/inheritance/Slime.java +++ b/src/main/java/inheritance/Slime.java @@ -1,61 +1,27 @@ package inheritance; -import Monster.Monster; - -public class Slime extends Monster { - public static final int DEFAULT_DAMAGE = 10; - - private final String prefix; +public class Slime { + private final String suffix; private int hp; - private int damage = DEFAULT_DAMAGE; - - public Slime(String prefix, int hp) { - this.prefix = prefix; - this.hp = hp; - } - public String getPrefix() { - return prefix; + // 생성자 + public Slime(String suffix, int hp) { + this.suffix = suffix; + this.hp = hp; // 기본 HP 값 설정 } - public int getHp() { + public int getHP() { return hp; } - public void setHp(int hp) { + public void setHP(int hp) { this.hp = hp; } - public int getDamage() { - return damage; - } - - public void setDamage(int damage) { - this.damage = damage; - } - - public void attack(Hero hero) { - hero.setHp(hero.getHp() - damage); - } - - @Override - public void run() { - System.out.println("2"); - } - - public static void main(String[] args) { - Slime slime = new Slime("", 10); - Monster monster = new Slime("", 10); - slime.run(); - monster.run(); - -// Slime slime1 = (Hero) monster; - - float ff = 10f;Add commentMore actions - int dd = 10; - - ff = dd; + void attack(Hero hero) { + System.out.println("슬라임 " + suffix + "이/가 공격했다"); + System.out.println("10의 데미지"); - dd = (int) ff; + hero.setHp(hero.getHp() - 10); } } diff --git a/src/main/java/inheritance/Wizard.java b/src/main/java/inheritance/Wizard.java index 73631a04..f8706d7c 100644 --- a/src/main/java/inheritance/Wizard.java +++ b/src/main/java/inheritance/Wizard.java @@ -1,9 +1,9 @@ package inheritance; -public class Wizard extends Character { +public class Wizard { private String name; private int hp; - private int mp; + private int mp = 100; public void heal(Hero hero) { if (mp < 10) { From d01d0dc98ebcee5f6f350f0615a68a052824d22b Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 1 Jul 2025 18:30:28 +0900 Subject: [PATCH 34/45] =?UTF-8?q?=EC=97=B4=EA=B1=B0=ED=98=95=20StrongBox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2025.07.01\352\263\274\354\240\234.puml" | 139 ++++++++++++++++++ src/main/java/com/survivalcoding/Cleric.java | 6 +- src/main/java/com/survivalcoding/KeyType.java | 21 +++ .../java/com/survivalcoding/StrongBox.java | 65 ++++++++ src/main/java/generic/EnumMain.java | 4 +- src/main/java/generic/Pocket.java | 4 +- 6 files changed, 233 insertions(+), 6 deletions(-) create mode 100644 "src/main/java/com/survivalcoding/2025.07.01\352\263\274\354\240\234.puml" create mode 100644 src/main/java/com/survivalcoding/KeyType.java create mode 100644 src/main/java/com/survivalcoding/StrongBox.java diff --git "a/src/main/java/com/survivalcoding/2025.07.01\352\263\274\354\240\234.puml" "b/src/main/java/com/survivalcoding/2025.07.01\352\263\274\354\240\234.puml" new file mode 100644 index 00000000..35602d46 --- /dev/null +++ "b/src/main/java/com/survivalcoding/2025.07.01\352\263\274\354\240\234.puml" @@ -0,0 +1,139 @@ +@startuml +scale 1 +!theme cerulean-outline +skinparam backgroundColor #FAFAFA +skinparam classBackgroundColor #FFFFFF +skinparam classBorderColor #2E86AB +skinparam classArrowColor #A23B72 +skinparam classFontSize 10 +skinparam packageStyle rectangle +skinparam minClassWidth 120 +skinparam ClassSpacing 30 +skinparam PackageSpacing 25 +left to right direction + +' 게임 시스템 +package "Game System" { + class Game { + +bool battleState + } + class Player { + -PlayerSquad playSquad + } + class PlayerSquad { + -List heroes + -Faction faction + +void AllHeroesUseSkill(hero : Hero) + +void AllHeroesMove() + } +} + +' 팩션 +package "Factions" { + abstract class Faction { + -String factionName + } + class Marvel extends Faction + class DC extends Faction + class Xmen extends Faction +} + +' 메인 히어로 클래스 +package "Heroes" { + abstract class Hero { + -int energyPoint + -Faction faction + } + class HumanHero extends Hero + class TechHero extends Hero + class EnhancedHero extends Hero { + +void selfRecovery() + +void attack() + } +} + +' 인터페이스 (간격 조정) +package "Interfaces" { + interface ISelfRecoverable { + +void selfRecovery() + } + + ISelfRecoverable -[hidden]- IAttackable + + interface IAttackable { + +void attack(hero : Hero) + } + + IAttackable -[hidden]- IEnhanceable + + interface IEnhanceable + + IEnhanceable -[hidden]- IShieldable + + interface IShieldable { + +void shieldRecovery() + } +} + +' 구체적인 히어로들 (메서드 간소화) +package "Specific Heroes" { + ' Tech Heroes + class Jarvis extends TechHero { + +void gatherInformation() + +void repair(techHero : TechHero) + } + class IronMan extends TechHero + class WarMachine extends TechHero + class Cyborg extends TechHero +' Human Heroes + class Hawkeye extends HumanHero + class SuperMan extends HumanHero + class BlackWidow extends HumanHero { + +void enhance(target: IEnhanceable) + } + + ' Enhanced Heroes + class Wolverine extends EnhancedHero + class Beast extends EnhancedHero +} + +' 시설 +package "Facilities" { + abstract class Facility + class EnhancedFacility extends Facility + class MarvelFacility extends Facility + class XmenFacility extends EnhancedFacility + class DCFacility extends Facility +} + +' 기본 관계 +Player --> PlayerSquad +PlayerSquad --> Hero +Hero --> Faction + +' EnhancedHero 인터페이스 구현 (Heroes 패키지 내의 EnhancedHero만) +Heroes.EnhancedHero ..|> ISelfRecoverable #FF6B35 +Heroes.EnhancedHero ..|> IAttackable #28A745 +Heroes.EnhancedHero ..|> IEnhanceable #0019f4 + +' IAttackable 구현 +IronMan ..|> IAttackable #28A745 +WarMachine ..|> IAttackable #28A745 +Cyborg ..|> IAttackable #28A745 +Hawkeye ..|> IAttackable #28A745 +SuperMan ..|> IAttackable #28A745 + +' IShieldable 구현 +Cyborg ..|> IShieldable #ff0000 +SuperMan ..|> IShieldable #ff0000 +DCFacility ..|> IShieldable #ff0000 + +' IEnhanceable 구현 +Hawkeye ..|> IEnhanceable #0019f4 +SuperMan ..|> IEnhanceable #0019f4 +Jarvis ..|> IEnhanceable #0019f4 + +' ISelfRecoverable 구현 +XmenFacility ..|> ISelfRecoverable #FF6B35 + +@enduml \ No newline at end of file diff --git a/src/main/java/com/survivalcoding/Cleric.java b/src/main/java/com/survivalcoding/Cleric.java index 8a187558..918e2b93 100644 --- a/src/main/java/com/survivalcoding/Cleric.java +++ b/src/main/java/com/survivalcoding/Cleric.java @@ -15,11 +15,13 @@ public class Cleric extends Character { this.hp = HP; this.mp = MP; } + Cleric(String name, int HP) { this.name = name; this.hp = HP; this.mp = maxMp; } + Cleric(String name) { this.name = name; this.hp = maxHp; @@ -33,7 +35,7 @@ public void selfAid() { if (mp < 5) return; // mp가 부족하면 return mp -= 5; - if(mp >= 5) { + if (mp >= 5) { if (hp < maxHp) { hp = maxHp; } @@ -59,7 +61,7 @@ public int pray(int sec) { int actualRecovery = Math.min(maxMp - mp, recovery); mp += actualRecovery; System.out.println(name + "는 " + sec + "초 동안 기도하여 MP를 " - + actualRecovery + " 회복했습니다."); + + actualRecovery + " 회복했습니다."); return actualRecovery; // maxMp 보다 더 회복하는가? if (recoveryMp + mp > maxMp) { diff --git a/src/main/java/com/survivalcoding/KeyType.java b/src/main/java/com/survivalcoding/KeyType.java new file mode 100644 index 00000000..c6234505 --- /dev/null +++ b/src/main/java/com/survivalcoding/KeyType.java @@ -0,0 +1,21 @@ +package com.survivalcoding; + +public enum KeyType { + PADLOCK(1024), + BUTTON(10000), + DIAL(30000), + FINGER(1000000); + + + private final int usageLimit; + + // 생성자 + KeyType(int usageLimit) { + this.usageLimit = usageLimit; + } + + // 사용 횟수 제한을 반환하는 메서드 + public int getUsageLimit() { + return usageLimit; + } +} diff --git a/src/main/java/com/survivalcoding/StrongBox.java b/src/main/java/com/survivalcoding/StrongBox.java new file mode 100644 index 00000000..ed8dd04d --- /dev/null +++ b/src/main/java/com/survivalcoding/StrongBox.java @@ -0,0 +1,65 @@ +package com.survivalcoding; + +public class StrongBox { + /* private T item; + + public void put(T item) { + this.item = item; + } + + public T get() { + return item; + } */ + + private T item; + private final KeyType keyType; + private int accessCount = 0; + private boolean isEmpty = true; + + public StrongBox(KeyType keyType) { + this.keyType = keyType; + } + + public void put(T item) { + if (!isEmpty) { + throw new IllegalStateException("StrongBox already contains an item."); + } + this.item = item; + isEmpty = false; + } + + public T get() { + if (isEmpty) { + throw new IllegalStateException("StrongBox is empty."); + } + + accessCount++; + if (accessCount >= keyType.getUsageLimit()) { + T temp = item; + item = null; + isEmpty = true; + return temp; + } else { + return null; + } + } + + public static void main(String[] args) { + /* StrongBox stringBox = new StrongBox<>(); + stringBox.put("Hello"); + + String value = stringBox.get(); + System.out.println(name); */ + + StrongBox box = new StrongBox<>(KeyType.PADLOCK); + box.put("Secret Document"); + + + for (int i = 0; i < 1024; i++) { + String result = box.get(); + if (result != null) { + System.out.println("Retrieved: " + result); + } + } + } +} diff --git a/src/main/java/generic/EnumMain.java b/src/main/java/generic/EnumMain.java index 9bb5dbda..fdf1d1ff 100644 --- a/src/main/java/generic/EnumMain.java +++ b/src/main/java/generic/EnumMain.java @@ -1,11 +1,9 @@ package generic; -import com.survivalcoding.generic.AuthState; - public class EnumMain { public static void main(String[] args) { // 값 - com.survivalcoding.generic.AuthState state = AuthState.AUTHENTICATED; + AuthState state = AuthState.AUTHENTICATED; switch (state) { case AUTHENTICATED: { diff --git a/src/main/java/generic/Pocket.java b/src/main/java/generic/Pocket.java index 2181893b..e1330ba2 100644 --- a/src/main/java/generic/Pocket.java +++ b/src/main/java/generic/Pocket.java @@ -7,10 +7,12 @@ public class Pocket { private E data; public void put(E data) { + this.data = data; } public E get() { + return data; } @@ -22,7 +24,7 @@ public static void main(String[] args) { System.out.println(name); */ Pocket pocket1 = new Pocket<>(); - pocket1.put(new Cleric("11")); + //pocket1.put(new Cleric("11")); Pocket pocket2 = new Pocket<>(); Pocket pocket3 = new Pocket<>(); From f6676f0fd2c9a074ff418898fe4ae546a33d7c90 Mon Sep 17 00:00:00 2001 From: choiain Date: Mon, 7 Jul 2025 13:51:55 +0900 Subject: [PATCH 35/45] =?UTF-8?q?07.07=20=EC=88=98=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java_basic/2025.07 1\354\243\274.md" | 3 +- .../java_basic/2025.07 2\354\243\274.md" | 210 ++++++++++++++++++ ...51\354\226\264\354\240\225\353\246\254.md" | 48 +++- src/main/java/aa.java | 6 + src/main/java/generic/EnumMain.java | 4 +- src/main/java/instance/ListMain.java | 18 ++ src/main/java/instance/SetMain.java | 17 ++ src/main/java/instance/ToString.java | 13 ++ 8 files changed, 304 insertions(+), 15 deletions(-) create mode 100644 "TIL/topics/java_basic/2025.07 2\354\243\274.md" create mode 100644 src/main/java/aa.java create mode 100644 src/main/java/instance/ListMain.java create mode 100644 src/main/java/instance/SetMain.java create mode 100644 src/main/java/instance/ToString.java diff --git "a/TIL/topics/java_basic/2025.07 1\354\243\274.md" "b/TIL/topics/java_basic/2025.07 1\354\243\274.md" index e3f943c1..aa0ed30a 100644 --- "a/TIL/topics/java_basic/2025.07 1\354\243\274.md" +++ "b/TIL/topics/java_basic/2025.07 1\354\243\274.md" @@ -24,4 +24,5 @@ ## 이너클래스 (Inner class) -클래스 안에 정의하는 클래스 \ No newline at end of file +클래스 안에 정의하는 클래스 + diff --git "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" new file mode 100644 index 00000000..40846aed --- /dev/null +++ "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" @@ -0,0 +1,210 @@ +# TIL 25.07.07 (Today I Learned) + +## 인스턴스 기본 조작 + +장표는 몇장 안되요 +자 오브젝트 배울 건데요 +오브젝트 클래스는 지난주에 등장 했습니다. +조상님이라고 +대표 메서드가 ... 이 있는데 +표현해보자면 +어.... + +instance 라는 데다가 +String[] args 는 특수한 거여서 +모든 타입의 인스턴스를 대입할 수 있습니다. +상속 계층을 확인 했을 떄 +타입 하이러하키 창을 켜면 +모든 상속 관계를 볼 수 있스비다. + +모든 클래스는 객체다. +오브젝트를 암묵적으로 상속 받는다. +퍼블릭 클래스 오브젝트 해가주고 + +오브젝트가 꼭대기에 있다!! +이 안에 어떤 기능들이 있는지 +파일 스트럭스?? +M 은 매서드 +PPT에서 언급하는 것들이 중요하는 거지 + +히어로를 생성을 하고 나서 히어로. 찍었을때 +내가 만들지 않은 것이 있다는 것이 있다는거지 +투 스트링은 오버라이드 해가지고 원하는 결과를 + +히어로를 프린트 하면 요거예요 요거 + +위치.타입@..?? + +직접적으로 쓰지 않아도 되요 + +있는 것들을 표현하고 싶다. + +정신없는 애가 많다. +정신없어 Person +여기에 정보들이 있어요. +이런식으로 오버라이드 해가지고 원하는 데로 쓰면 되여. + +위로 올릴꼐요 제가 +생성자 + +맨 아래에다가 많이 만들기 때문에 +static은 모아 놓을 게요\ +원하는데로 +나오는 거야 + +리스트에 사이즈를 찍으면 1이 나오겠지 +예상을 해서 찍어보시죠 +자 0,1 둘중에 하나 찍으시면 돼. +마지막꺼 +1번 넣고 2번 지우고 뭘까여?? + +이름이 다르다는 것을 알수 있어요 +리스트 하고 set은 + +set은 속도가 굉장히 빨라요. + +실행해보면 똑같죠!! +같아야지 중복을 제거하잖아 +어떤 식으로 중복을 체크하는 지를 +add하면 둘다 들어갑니다?? +모르죠 모르니까 +equals가 어디에서 왔는지는 +오브젝트에서 왔고 내가 제정의를 해서 뭔가를 해보겠다. + +우리가 봤잖아 +둘이는 달라 +이렇게 하면은 주소 비굔데 +.equals는 같아.. +동등성을 +그렇게 프로그램을 짜고 싶은 거야 +히어로 안에다가 equals 안에다가 제정의를 할께요 +여기 보시면 샘플인데 + +프리미티브 타입은 ==으로 비교하면 되 아니면 + +자동완성으로 만들 수가 있는데 generate 메뉴에 equals해서 ok + +== 은 주소 비교라서 T/F +equals 는 이름만으로 동등성을 체크하는거야? +동등성 규칙을 재정의를 하는거야 이런식으로 다시 재정의를 하면 +list / set + +Hash 값 기준으로 동등성 체크르 해요 +HashSet 같은거? +Hashcode() +Hash 값을 재정의를 해야해요 +하나만 재정의 하는게 아니라 둘다 해줘야 해요 +List / Set ?!! + +자동으로 만들수 있다구?! +둘다 같게 작동하게?? + +왜하냐?? +복사가 아니라 두 군데에 동작을하게 하는거잖아요 +레퍼런스 기반으로하는거 긴한데 편하게 규칙을 정하는거예요. +언제 어떻게 사용할지 모르기 떄문에 + +Map, Set 이 엄청 빠르게 검색을 한다?? +둘다 항상 동일하게 속도가 엄청 빨라 + +시간복잡도 +이게 데이터 양에 따라서 +빅 오 표기법 + +equals로 찾는 방법이 +이름 하나가지고 재정의를 하면은 + +필드가 복잡하게 더 많으면 많을 수록 더 오래 걸릴꺼야 + +칼 안에 있는 거까지 다 비교해줄 꺼야 + +어떤 하나의 숫자로 만들거든요 +숫자 연산이고 논리연산이거든요 + +단순하게 곱하고 더하고 이헌게 더 빠르고요 + +객체를 표현하는 숫자값이 + +비교 로직이 여기서 돌거든요 + +해시코드는 ==으로 비교를 하거든요 + +하나씩 보겠다는 거야?!! +비교를 하나하나 다 하겠다는거가 +해시코드는 숫자로 표현을 하는거야 1번 = 1번? +주민번호만 본다?? 이런 느낌?! + +모든 객체는 해시값을 가진다. + +해시 알고리즘의 허점 +해시값이 같다고 해서 무조건 같은 거는 아닐 수 있다. +둘이서 같은 해시값이 나올 수도 있다는 거야 + +중요한건 List / Set / Map +해시값 + +List는 순차검색이라서 느림 +equals 를 최대한 않돌리는게 빠른거여서 + +Integer + +Collections.sort() +컬랙션 내부를 정렬을 해줘서 오름차순 정렬을 해주거든요. +? + +Hero 를 정렬하려면 기준을 정해줘야해 +이름 , hp 니까?!! +규칙에 안맞아서?? +compareTo(T) 매서드 대상을 T로 받아 +Cmpareable 인터페이스를 구현해줘야만 가능! +숫자 +implements Comparables +재정의 해줍니다. 그럼 알아서 들어와요 + +이름으로 해보겠습니다. +글자 대소비교를 해야해 compareTo를 호출 +hp를 가지고 하면 조금 쉬워 +String.java에 정의 +정의된 룰 +반대로 하려면 +, - 뒤집기? +규칙을 뒤집기 +Comparator +compare + +인스턴스의 복사 PPT 13장 T +복사 개념이 아니라는거야 + +동일한 속성을 가진 인스턴스를 만들고 싶어 +복사 +안에 있는 걸 하나하나 다 복사해야 한다. 오브젝트는 + +얕은 복사 +레퍼런스 복사 주소만 복사 된다는 개념 +.clone() 해서 복사해라! 암묵적인 룰 + +lang 마커 인터페이스 +clone 자동으로 생성 +Cloneable 인터페이스 + +모든 언어들이 얕은 복사가 디폴트예요. +필요할떄 인스턴스를 생성해 준다고?? +효율이 좋다. + +깊은 복사 +진짜루 다 복사하는거야 + +toString 객체 안에 내용을 알기 쉽게 보여주는 메서드 +equals +hashCode +Cloneable +얕은 복사 / 깊은 복사 + +비유를 통해서 설명 (내가 이해한 내용으로) + +Date 년월일 시간 시분초 까지 전부 가지고 있는 +동등성 비교 규칙 +List/ Set / Map 까지 전부 동일한 객체 +sort가 되게 만들기 Collections.sort() +clone()을 하면 깊은 복사 + +NotebookLM \ No newline at end of file diff --git "a/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" "b/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" index 8e728800..ee9e2cce 100644 --- "a/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" +++ "b/TIL/topics/java_basic/\354\232\251\354\226\264\354\240\225\353\246\254.md" @@ -4,29 +4,53 @@ cd .. - 상위 폴더
cd 파일이름 - 폴더 안의 파일로 가기 ## Git 용어 정리 - - git init - 깃 초기화 - - git clone - 복제 - - git status - 작업 디렉토리와 스테이징 내역 확인 - - git add - 파일 추가 - - git reset - 커밋내역 삭제 - - git commit -m "커밋할 내용" - 로컬 저장소에 등록 - - git log - 기록확인 - - git rm - 삭제 (add시 잘못한 부분 삭제) - - rm -rf (파일 명) - 파일 삭제 - - git push - commit한 내용을 원격저장소에 올리기 - - git pull - 원격 저장소에서 로컬 저장소로 + +- git init - 깃 초기화 +- git clone - 복제 +- git status - 작업 디렉토리와 스테이징 내역 확인 +- git add - 파일 추가 +- git reset - 커밋내역 삭제 +- git commit -m "커밋할 내용" - 로컬 저장소에 등록 +- git log - 기록확인 +- git rm - 삭제 (add시 잘못한 부분 삭제) +- rm -rf (파일 명) - 파일 삭제 +- git push - commit한 내용을 원격저장소에 올리기 +- git pull - 원격 저장소에서 로컬 저장소로 ## Fork 하는 법 + 1. 오픈소스?에 접속하여 Fork 버튼 클릭하기 -2. Create a new fork 클릭 +2. Create a new fork 클릭 3. 이름, 설명... 작성 4. Create fork 버튼 클릭 5. fork 완료 ## Requests 하는 법 + 1. Pull requests 클릭하기 2. New pull request 클릭하기 3. 변경하기 4. Create pull request 클릭하기 5. 제목, 설명 변경하기 6. Create pull request 클릭하기 + +## 클래스 + +## 인스턴스 + +## 캡슐화 + +## 컬렉션 + +## 상속 + +## 추상 클래스 + +## 인터페이스 + +## 다형성 + +## 제네릭 + +## 열거형 + diff --git a/src/main/java/aa.java b/src/main/java/aa.java new file mode 100644 index 00000000..c11e59a3 --- /dev/null +++ b/src/main/java/aa.java @@ -0,0 +1,6 @@ +import java.util.Scanner; + +public class aa { + + Scanner sc = new Scanner(System.in) +} diff --git a/src/main/java/generic/EnumMain.java b/src/main/java/generic/EnumMain.java index fdf1d1ff..2d4c6ada 100644 --- a/src/main/java/generic/EnumMain.java +++ b/src/main/java/generic/EnumMain.java @@ -15,8 +15,8 @@ public static void main(String[] args) { case UNKNOWN: { System.out.println("UNKNOWN"); } - default: { - System.out.println("default"); + case AUTHENTICATING: { + System.out.println("AUTHENTICATING"); } } } diff --git a/src/main/java/instance/ListMain.java b/src/main/java/instance/ListMain.java new file mode 100644 index 00000000..41bfcf6c --- /dev/null +++ b/src/main/java/instance/ListMain.java @@ -0,0 +1,18 @@ +package instance; + +import java.util.ArrayList; + +public class ListMain { + + public static void main(String[] args) { + List heroesList = new ArrayList<>(); + Hero h1 = new Hero("슈퍼맨", 100); + Hero h2 = new Hero("슈퍼맨", 100); + + heroesList.add(h1); + System.out.printl(heroeslist.size()); + + heroesList.remove(h2); + System.out.printl(heroeslist.size()); + } +} diff --git a/src/main/java/instance/SetMain.java b/src/main/java/instance/SetMain.java new file mode 100644 index 00000000..9f1cf14b --- /dev/null +++ b/src/main/java/instance/SetMain.java @@ -0,0 +1,17 @@ +package instance; + +import java.util.HashSet; + +public class SetMain { + public static void main(String[] args) { + Set heroesSet = new HashSet<>(); + Hero h1 = new Hero("슈퍼맨", 100); + Hero h2 = new Hero("슈퍼맨", 100); + + heroesSet.add(h1); + System.out.printl(heroesSet.size()); + + heroesSet.remove(h2); + System.out.printl(heroesSet.size()); + } +} diff --git a/src/main/java/instance/ToString.java b/src/main/java/instance/ToString.java new file mode 100644 index 00000000..6a5443ef --- /dev/null +++ b/src/main/java/instance/ToString.java @@ -0,0 +1,13 @@ +package instance; + +public class ToString { + public static void main(String[] args) { + Object object = new Hero("aaa", 10); + object = 10; + object = true; + object = null; + + Hero hero = new Hero("hero", 10); + System.out.println(hero.hashCode()); + } +} \ No newline at end of file From 3a824941a32af559f26a66eca24496970520fed3 Mon Sep 17 00:00:00 2001 From: choiain Date: Mon, 7 Jul 2025 14:02:15 +0900 Subject: [PATCH 36/45] =?UTF-8?q?=EA=B3=BC=EC=A0=9C=20-=20Book=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/instance/Book.java | 34 ++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/main/java/instance/Book.java diff --git a/src/main/java/instance/Book.java b/src/main/java/instance/Book.java new file mode 100644 index 00000000..3687495e --- /dev/null +++ b/src/main/java/instance/Book.java @@ -0,0 +1,34 @@ +package instance; + +import java.util.Date; + +public class Book { + private String title; + private Date publishDate; + private String comment; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Date getPublishDate() { + return publishDate; + } + + public void setPublishDate(Date publishDate) { + this.publishDate = publishDate; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + +} From af14193afa61f41f8eab7f8563cd78310bf2dcc4 Mon Sep 17 00:00:00 2001 From: choiain Date: Mon, 7 Jul 2025 17:55:24 +0900 Subject: [PATCH 37/45] =?UTF-8?q?=EA=B3=BC=EC=A0=9C=EC=A4=91..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java_basic/2025.07 2\354\243\274.md" | 32 ++++++++++++++----- src/main/java/aa.java | 3 -- src/main/java/com/survivalcoding/Main.java | 2 +- .../java/com/survivalcoding/PoisonSlime.java | 2 +- src/main/java/com/survivalcoding/Slime.java | 10 +++--- src/main/java/instance/Book.java | 26 +++++++++++++++ src/main/java/instance/BookList.java | 25 +++++++++++++++ src/main/java/instance/BookSet.java | 20 ++++++++++++ src/main/java/instance/ListMain.java | 8 +++-- src/main/java/instance/SetMain.java | 7 ++-- src/main/java/instance/ToString.java | 2 ++ 11 files changed, 115 insertions(+), 22 deletions(-) create mode 100644 src/main/java/instance/BookList.java create mode 100644 src/main/java/instance/BookSet.java diff --git "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" index 40846aed..774450aa 100644 --- "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" +++ "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" @@ -2,13 +2,29 @@ ## 인스턴스 기본 조작 -장표는 몇장 안되요 -자 오브젝트 배울 건데요 -오브젝트 클래스는 지난주에 등장 했습니다. -조상님이라고 -대표 메서드가 ... 이 있는데 -표현해보자면 -어.... +## Object 클래스 + +모든 클래스의 최상위(루트) 클래스 - 클래스를 자동으로 상속받는다. + +## 대표 메서드 + +### 1. toString() + +객체 안에 내용을 알기 쉽게 보여주는 메서드 +List / Set / Map + +### 2. equals() + +equals / == + +### 3. hashCode() + +### 4. Collections.sort() + +### 얕은 복사 / 깊은 복사 + +clone +Cloneable instance 라는 데다가 String[] args 는 특수한 거여서 @@ -33,7 +49,7 @@ PPT에서 언급하는 것들이 중요하는 거지 히어로를 프린트 하면 요거예요 요거 -위치.타입@..?? +위치.타입(클래스 이름)@해시코드 직접적으로 쓰지 않아도 되요 diff --git a/src/main/java/aa.java b/src/main/java/aa.java index c11e59a3..9e8f9daf 100644 --- a/src/main/java/aa.java +++ b/src/main/java/aa.java @@ -1,6 +1,3 @@ -import java.util.Scanner; - public class aa { - Scanner sc = new Scanner(System.in) } diff --git a/src/main/java/com/survivalcoding/Main.java b/src/main/java/com/survivalcoding/Main.java index 888b5f06..78884bdc 100644 --- a/src/main/java/com/survivalcoding/Main.java +++ b/src/main/java/com/survivalcoding/Main.java @@ -11,7 +11,7 @@ public static void main(String[] args) { System.out.print("Hello and welcome!"); Kinoko kinoko = new Kinoko(); - kinoko.setHp(100); + kinoko.setHP(100); System.out.println("hp 100 회복"); } diff --git a/src/main/java/com/survivalcoding/PoisonSlime.java b/src/main/java/com/survivalcoding/PoisonSlime.java index e72d37b9..b42dba13 100644 --- a/src/main/java/com/survivalcoding/PoisonSlime.java +++ b/src/main/java/com/survivalcoding/PoisonSlime.java @@ -1,6 +1,6 @@ package com.survivalcoding; -public class PoisonSlime extends Slime { +public abstract class PoisonSlime extends Slime { public static final int MAX_HP = 10; public static final int DEFAULT_POISON_COUNT = 5; diff --git a/src/main/java/com/survivalcoding/Slime.java b/src/main/java/com/survivalcoding/Slime.java index a8acc4cd..9cc6991d 100644 --- a/src/main/java/com/survivalcoding/Slime.java +++ b/src/main/java/com/survivalcoding/Slime.java @@ -1,8 +1,8 @@ package com.survivalcoding; -import com.survivalcoding.monster.Monster; +import Monster.Monster; -public class Slime extends Monster { +public abstract class Slime extends Monster { public static final int DEFAULT_DAMAGE = 10; private final String prefix; @@ -49,13 +49,13 @@ public static void main(String[] args) { slime.run(); monster.run(); -// Slime slime1 = (Hero) monster; + // Slime slime1 = (Hero) monster; float ff = 10f; int dd = 10; - ff = dd; + // ff = dd; - dd = (int) ff; + // dd = (int) ff; } } diff --git a/src/main/java/instance/Book.java b/src/main/java/instance/Book.java index 3687495e..b09297cf 100644 --- a/src/main/java/instance/Book.java +++ b/src/main/java/instance/Book.java @@ -1,12 +1,18 @@ package instance; import java.util.Date; +import java.util.Objects; public class Book { private String title; private Date publishDate; private String comment; + public Book(String title, Date publishDate) { + this.title = title; + this.publishDate = publishDate; + } + public String getTitle() { return title; } @@ -31,4 +37,24 @@ public void setComment(String comment) { this.comment = comment; } + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + return Objects.equals(title, book.title) && + Objects.equals(publishDate.getYear(), book.publishDate.getYear()); + } + + @Override + public int hashCode() { + return Objects.hash(title, publishDate); + } + + public static void main(String[] args) { + + Book book1 = new Book("aaa", new Date(2025, 1, 1)); + Book book2 = new Book("bbb", new Date(2025, 2, 1)); + + + } } diff --git a/src/main/java/instance/BookList.java b/src/main/java/instance/BookList.java new file mode 100644 index 00000000..4171ecfd --- /dev/null +++ b/src/main/java/instance/BookList.java @@ -0,0 +1,25 @@ +package instance; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +public class BookList { + + public static void main(String[] args) { + List bookList = new ArrayList<>(); + Book b1 = new Book("aaa", new Date(2025, 1, 1, 1, 1)); + Book b2 = new Book("aaa", new Date(2025, 1, 1, 2, 2)); + + bookList.add(b1); + System.out.println(bookList.size()); //1 + + bookList.remove(b2); + System.out.println(bookList.size()); //0 + + Collections.sort(); + + } + +} diff --git a/src/main/java/instance/BookSet.java b/src/main/java/instance/BookSet.java new file mode 100644 index 00000000..f7b2f6a2 --- /dev/null +++ b/src/main/java/instance/BookSet.java @@ -0,0 +1,20 @@ +package instance; + +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +public class BookSet { + + public static void main(String[] args) { + Set bookList = new HashSet<>(); + Book b1 = new Book("aaa", new Date(2025, 1, 1, 1, 1)); + Book b2 = new Book("bbb", new Date(2025, 2, 1, 2, 2)); + + bookList.add(b1); + System.out.println(bookList.size()); + + bookList.remove(b2); + System.out.println(bookList.size()); + } +} diff --git a/src/main/java/instance/ListMain.java b/src/main/java/instance/ListMain.java index 41bfcf6c..31175414 100644 --- a/src/main/java/instance/ListMain.java +++ b/src/main/java/instance/ListMain.java @@ -1,18 +1,22 @@ package instance; +import com.survivalcoding.Hero; + import java.util.ArrayList; +import java.util.List; public class ListMain { public static void main(String[] args) { + List heroesList = new ArrayList<>(); Hero h1 = new Hero("슈퍼맨", 100); Hero h2 = new Hero("슈퍼맨", 100); heroesList.add(h1); - System.out.printl(heroeslist.size()); + System.out.println(heroesList.size()); heroesList.remove(h2); - System.out.printl(heroeslist.size()); + System.out.println(heroesList.size()); } } diff --git a/src/main/java/instance/SetMain.java b/src/main/java/instance/SetMain.java index 9f1cf14b..dd7d5bbc 100644 --- a/src/main/java/instance/SetMain.java +++ b/src/main/java/instance/SetMain.java @@ -1,6 +1,9 @@ package instance; +import com.survivalcoding.Hero; + import java.util.HashSet; +import java.util.Set; public class SetMain { public static void main(String[] args) { @@ -9,9 +12,9 @@ public static void main(String[] args) { Hero h2 = new Hero("슈퍼맨", 100); heroesSet.add(h1); - System.out.printl(heroesSet.size()); + System.out.println(heroesSet.size()); heroesSet.remove(h2); - System.out.printl(heroesSet.size()); + System.out.println(heroesSet.size()); } } diff --git a/src/main/java/instance/ToString.java b/src/main/java/instance/ToString.java index 6a5443ef..526dcbe4 100644 --- a/src/main/java/instance/ToString.java +++ b/src/main/java/instance/ToString.java @@ -1,5 +1,7 @@ package instance; +import com.survivalcoding.Hero; + public class ToString { public static void main(String[] args) { Object object = new Hero("aaa", 10); From 7f568a57aa4e075ef26faf3e8f03bfebf8da9224 Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 8 Jul 2025 10:48:10 +0900 Subject: [PATCH 38/45] =?UTF-8?q?git=20branch=20issue1=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/instance/BookTest.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/test/java/instance/BookTest.java diff --git a/src/test/java/instance/BookTest.java b/src/test/java/instance/BookTest.java new file mode 100644 index 00000000..7a605edc --- /dev/null +++ b/src/test/java/instance/BookTest.java @@ -0,0 +1,4 @@ +import static org.junit.jupiter.api.Assertions.*; +class BookTest { + +} \ No newline at end of file From 7056b34f36b255262f5b06d854a848aff39bdaf6 Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 8 Jul 2025 10:55:16 +0900 Subject: [PATCH 39/45] =?UTF-8?q?=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java_basic/2025.07 2\354\243\274.md" | 18 +++++++++++++++- src/main/java/instance/Book.java | 17 ++++++++++++--- src/test/java/instance/BookTest.java | 21 +++++++++++++++++-- 3 files changed, 50 insertions(+), 6 deletions(-) diff --git "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" index 774450aa..7ecfd6e1 100644 --- "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" +++ "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" @@ -223,4 +223,20 @@ List/ Set / Map 까지 전부 동일한 객체 sort가 되게 만들기 Collections.sort() clone()을 하면 깊은 복사 -NotebookLM \ No newline at end of file +NotebookLM + +# TIL 25.07.08 (Today I Learned) + +## Git + +https://backlog.com/ja/git-tutorial/stepup/06/ + +## 브랜치 + +- 자유롭게 만들 수 있다. +- git branch - 브랜치 확인하기 +- git branch issue1 - issue1 브랜치 만들기 +- git checkout issue1 - issue1 브랜치로 전환한다. +- git checkout -b issue2 - issue2 브랜치 생성, 전환 한번에 +- git merge issue1 - issue1을 현재 브랜치에 합치 + diff --git a/src/main/java/instance/Book.java b/src/main/java/instance/Book.java index b09297cf..d2c21fcf 100644 --- a/src/main/java/instance/Book.java +++ b/src/main/java/instance/Book.java @@ -3,7 +3,7 @@ import java.util.Date; import java.util.Objects; -public class Book { +public class Book implements Comparable, Cloneable { private String title; private Date publishDate; private String comment; @@ -41,8 +41,7 @@ public void setComment(String comment) { public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; Book book = (Book) o; - return Objects.equals(title, book.title) && - Objects.equals(publishDate.getYear(), book.publishDate.getYear()); + return Objects.equals(title, book.title) && Objects.equals(publishDate, book.publishDate); } @Override @@ -50,6 +49,17 @@ public int hashCode() { return Objects.hash(title, publishDate); } + @Override + public int compareTo(Book o) { + + return 0; + } + + @Override + public Book clone() { + + } + public static void main(String[] args) { Book book1 = new Book("aaa", new Date(2025, 1, 1)); @@ -57,4 +67,5 @@ public static void main(String[] args) { } + } diff --git a/src/test/java/instance/BookTest.java b/src/test/java/instance/BookTest.java index 7a605edc..2c51d35e 100644 --- a/src/test/java/instance/BookTest.java +++ b/src/test/java/instance/BookTest.java @@ -1,4 +1,21 @@ -import static org.junit.jupiter.api.Assertions.*; +package instance; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Calendar; + class BookTest { - + + @Test + @DisplayName("제목과 출간일(예: 2024-01-01)이 같으면 같은 책으로 판단한다.") + void shouldConsiderBookWithSameTitleAndPublicationDateAsEqual() { + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.YEAR, 2024); + calendar.set(Calendar.MONTH, 1); + Calendar.set(Calendar.DAY_OF_MONTH, 1); + + + } + } \ No newline at end of file From d2c4d1aa197c25cf522079819ae0961178945afa Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 8 Jul 2025 11:02:50 +0900 Subject: [PATCH 40/45] =?UTF-8?q?=EA=B3=BC=EC=9E=A5=EB=8B=98=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EC=B9=98=20=EC=88=98=EC=A0=95=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/aa.java | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 src/main/java/aa.java diff --git a/src/main/java/aa.java b/src/main/java/aa.java deleted file mode 100644 index 9e8f9daf..00000000 --- a/src/main/java/aa.java +++ /dev/null @@ -1,3 +0,0 @@ -public class aa { - -} From 9ea209a5b6d467791a656efa794c6e42a35599f6 Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 8 Jul 2025 11:05:09 +0900 Subject: [PATCH 41/45] =?UTF-8?q?=EB=B6=80=EC=9E=A5=EB=8B=98=20=EB=B8=8C?= =?UTF-8?q?=EB=9E=9C=EC=B9=98=20=EC=88=98=EC=A0=95=EC=82=AC=ED=95=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "TIL/topics/java_basic/2025.07 2\354\243\274.md" | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" index 7ecfd6e1..822fe1a3 100644 --- "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" +++ "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" @@ -238,5 +238,9 @@ https://backlog.com/ja/git-tutorial/stepup/06/ - git branch issue1 - issue1 브랜치 만들기 - git checkout issue1 - issue1 브랜치로 전환한다. - git checkout -b issue2 - issue2 브랜치 생성, 전환 한번에 -- git merge issue1 - issue1을 현재 브랜치에 합치 +- git merge issue1 - issue1을 현재 브랜치에 합치기 +- git branch -d issue1 - issue1 브랜치 삭제 +- + +수정사항 만들기!!!!!! 부장님 브랜치 From a5fa9054bc62cbe1439695858cc76fe7a718a39a Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 8 Jul 2025 11:07:44 +0900 Subject: [PATCH 42/45] =?UTF-8?q?.md=ED=8C=8C=EC=9D=BC=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "TIL/topics/java_basic/2025.07 2\354\243\274.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" index 7ecfd6e1..9b9b4146 100644 --- "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" +++ "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" @@ -238,5 +238,6 @@ https://backlog.com/ja/git-tutorial/stepup/06/ - git branch issue1 - issue1 브랜치 만들기 - git checkout issue1 - issue1 브랜치로 전환한다. - git checkout -b issue2 - issue2 브랜치 생성, 전환 한번에 -- git merge issue1 - issue1을 현재 브랜치에 합치 +- git merge issue1 - issue1을 현재 브랜치에 합치기 +- From ae9c864b18927ab95d0c8f042d3c10648fe5020a Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 8 Jul 2025 11:26:46 +0900 Subject: [PATCH 43/45] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "TIL/topics/java_basic/2025.07 2\354\243\274.md" | 2 -- 1 file changed, 2 deletions(-) diff --git "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" index 822fe1a3..279d1176 100644 --- "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" +++ "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" @@ -242,5 +242,3 @@ https://backlog.com/ja/git-tutorial/stepup/06/ - git branch -d issue1 - issue1 브랜치 삭제 - -수정사항 만들기!!!!!! 부장님 브랜치 - From d75fe77fec81c1153414761ae60a8d91b7e3f40d Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 8 Jul 2025 13:29:55 +0900 Subject: [PATCH 44/45] =?UTF-8?q?txt=ED=8C=8C=EC=9D=BC=20=EB=A7=8C?= =?UTF-8?q?=EB=93=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- myfile.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 myfile.txt diff --git a/myfile.txt b/myfile.txt new file mode 100644 index 00000000..e69de29b From 91cd111dfc14c53e3045e23d401003b4d9b6891f Mon Sep 17 00:00:00 2001 From: choiain Date: Tue, 8 Jul 2025 14:09:56 +0900 Subject: [PATCH 45/45] =?UTF-8?q?git=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "TIL/topics/java_basic/2025.07 2\354\243\274.md" | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" index 279d1176..6321c4d3 100644 --- "a/TIL/topics/java_basic/2025.07 2\354\243\274.md" +++ "b/TIL/topics/java_basic/2025.07 2\354\243\274.md" @@ -234,11 +234,20 @@ https://backlog.com/ja/git-tutorial/stepup/06/ ## 브랜치 - 자유롭게 만들 수 있다. +- Fast-forward - git branch - 브랜치 확인하기 - git branch issue1 - issue1 브랜치 만들기 - git checkout issue1 - issue1 브랜치로 전환한다. - git checkout -b issue2 - issue2 브랜치 생성, 전환 한번에 - git merge issue1 - issue1을 현재 브랜치에 합치기 - git branch -d issue1 - issue1 브랜치 삭제 -- +- git reset --hard HEAD~ - 리셋 완전 삭제!! +- git rebase - 브랜치의 커밋 기록을 다른 브랜치 위에 깔끔하게 이어붙이는 것 + +## git merge / git rebase의 차이 + +- merge는 병합 커밋이 생겨 기록이 분기됨 / rebase는 선형 히스토리 +- merge는 브랜치 구조 보존 / rebase는 브랜치 구조 변경 +- merge는 충돌은 병합 시 발생 / rebase는 충돌이 중간중간 발생 가능 +- merge는 비교적 안전 / rebase는 위험할 수 있음