From 601150ed27338ec8e45ba10a3bfd2f9f7623d53f Mon Sep 17 00:00:00 2001 From: KJY Date: Tue, 16 Jun 2026 13:58:13 +0900 Subject: [PATCH 1/4] =?UTF-8?q?26=5F06=5F16=20=EC=83=81=EC=86=8D=20?= =?UTF-8?q?=EC=97=B0=EC=8A=B5=EB=AC=B8=EC=A0=9C1,2,3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/game.puml | 84 +++++++++++++++++++ .../java/com/survivalcoding/Exercise.java | 9 ++ .../main/java/com/survivalcoding/Hero.java | 5 ++ .../java/com/survivalcoding/PoisonSlime.java | 26 ++++++ .../main/java/com/survivalcoding/Slime.java | 30 +++++++ .../com/survivalcoding/PoisonSlimeTest.java | 29 +++++++ 6 files changed, 183 insertions(+) create mode 100644 game/game.puml create mode 100644 game/src/main/java/com/survivalcoding/PoisonSlime.java create mode 100644 game/src/main/java/com/survivalcoding/Slime.java create mode 100644 game/src/test/java/com/survivalcoding/PoisonSlimeTest.java diff --git a/game/game.puml b/game/game.puml new file mode 100644 index 0000000..8d5d9e6 --- /dev/null +++ b/game/game.puml @@ -0,0 +1,84 @@ +@startuml +package com.survivalcoding { +class Cleric { + {static} +MAXHP : int = 50 + {static} +MAXMP : int = 10 + -SelfAidCost : int = 5 {readOnly} + ~name : String + ~HP : int = 50 + ~MP : int = 10 + + +Cleric(name: String) + +Cleric(name: String, hp: int) + +Cleric(name: String, hp: int, mp: int) + + ~selfAid() : void + ~pray(time: int) : int +} +class Person { + -name : String {readOnly} + -birthYear : int {readOnly} + + +Person(name: String, brithYear: int) + +Person(name: String) + + +getName() : String + +getBirthYear() : int + +getAge() : int +} +class Wand { + -name : String + -power : double + + +getName() : String + +setName(name: String) : void + +getPower() : double + +setPower(power: double) : void +} +class Wizard { + -wand : Wand + -hp : int + -mp : int + -name : String + + ~heal(hero: Hero) : void + +getWand() : Wand + +setWand(wand: Wand) : void + +getHp() : int + +setHp(hp: int) : void + +getMp() : int + +setMp(mp: int) : void + +getName() : String + +setName(name: String) : void +} + +' 클래스 간의 관계 표현 (선택 사항) +Wizard "1" --> "1" Wand : 가집니다 (has) +Wizard ..> Hero : 참조합니다 (uses) +class Hero { + ~name : String + ~HP : int + + +Hero(name: String, HP: int) + +getHP() : int + +setHP(HP: int) : void + ~attack() : void +} +class Slime { + -suffix : String {readOnly} + -hp : int + +Slime(suffix: String, hp: int) + +getSuffix() : String + +getHp() : int + +setHp(hp: int) : void + ~attack(hero: Hero) : void + } + +class PoisonSlime { + -poisonCount : int = 5 + +PoisonSlime(suffix: String) + +attack(hero: Hero) : void + +getPoisonCount() : int + } + } +@enduml \ No newline at end of file diff --git a/game/src/main/java/com/survivalcoding/Exercise.java b/game/src/main/java/com/survivalcoding/Exercise.java index e8f7e73..56f6c34 100644 --- a/game/src/main/java/com/survivalcoding/Exercise.java +++ b/game/src/main/java/com/survivalcoding/Exercise.java @@ -14,4 +14,13 @@ public class Exercise { 2.list(학생의 점수가 곂칠수도 있기에) 3.map(도시의 수가 많으니 키값을 검색해서 빠르게 인구수를 찾을수있기에) */ + /* + 26_06_16 연습문제 1 + 2,3,5 + 연습문제2 + (1) 아이폰 -> Phone -> 기계 + (2) BMW -> Car -> 고철 + (3) 종이 한자 사전 -> Dictionary -> 폐지 + */ + } diff --git a/game/src/main/java/com/survivalcoding/Hero.java b/game/src/main/java/com/survivalcoding/Hero.java index d3864b3..5d369c5 100644 --- a/game/src/main/java/com/survivalcoding/Hero.java +++ b/game/src/main/java/com/survivalcoding/Hero.java @@ -4,6 +4,11 @@ public class Hero { String name; int HP; + public Hero(String name, int HP) { + this.name = name; + this.HP = HP; + } + public int getHP() { return HP; } diff --git a/game/src/main/java/com/survivalcoding/PoisonSlime.java b/game/src/main/java/com/survivalcoding/PoisonSlime.java new file mode 100644 index 0000000..9656e76 --- /dev/null +++ b/game/src/main/java/com/survivalcoding/PoisonSlime.java @@ -0,0 +1,26 @@ +package com.survivalcoding; + +public class PoisonSlime extends Slime { + private int poisonCount = 5; + + public PoisonSlime(String suffix) { + super(suffix, 50); + } + + @Override + public void attack(Hero hero) { + super.attack(hero); + + if (this.poisonCount > 0) { + System.out.println("추가로 독 포자를 살포했다!"); + int poisonDamage = hero.getHP() / 5; + hero.setHP(hero.getHP() - poisonDamage); + System.out.println(poisonDamage + "포인트 데미지"); + this.poisonCount--; + } + } + + public int getPoisonCount() { + return poisonCount; + } +} diff --git a/game/src/main/java/com/survivalcoding/Slime.java b/game/src/main/java/com/survivalcoding/Slime.java new file mode 100644 index 0000000..8bdb51e --- /dev/null +++ b/game/src/main/java/com/survivalcoding/Slime.java @@ -0,0 +1,30 @@ +package com.survivalcoding; + +public class Slime { + private final String suffix; + private int hp; + + public Slime(String suffix, int hp) { + this.suffix = suffix; + this.hp = hp; + } + + public String getSuffix() { + return suffix; + } + + 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/game/src/test/java/com/survivalcoding/PoisonSlimeTest.java b/game/src/test/java/com/survivalcoding/PoisonSlimeTest.java new file mode 100644 index 0000000..9627166 --- /dev/null +++ b/game/src/test/java/com/survivalcoding/PoisonSlimeTest.java @@ -0,0 +1,29 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class PoisonSlimeTest { + + @Test + void attack() { + //준비 + String name = "모험가"; + String suffix = "A"; + int hp = 100; + int nattack; + Hero hero = new Hero(name, hp); + PoisonSlime poisonSlime = new PoisonSlime(suffix); + //실행 + poisonSlime.attack(hero); + //검증 + assertEquals(72, hero.getHP()); + assertEquals(4, poisonSlime.getPoisonCount()); + //실행 + poisonSlime.attack(hero); + //검증 + assertEquals(50, hero.getHP()); + assertEquals(3, poisonSlime.getPoisonCount()); + } +} \ No newline at end of file From 485945138ff7285e31801b95edb019a33ca5fab5 Mon Sep 17 00:00:00 2001 From: KJY Date: Tue, 16 Jun 2026 14:30:27 +0900 Subject: [PATCH 2/4] =?UTF-8?q?26=5F06=5F16=20=EC=83=81=EC=86=8D=20?= =?UTF-8?q?=EC=97=B0=EC=8A=B5=EB=AC=B8=EC=A0=9C=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/game.puml | 130 ++++++++++-------- .../main/java/com/survivalcoding/Wizard.java | 13 +- .../java/com/survivalcoding/WizardTest.java | 25 ++++ 3 files changed, 103 insertions(+), 65 deletions(-) diff --git a/game/game.puml b/game/game.puml index 8d5d9e6..16c0be6 100644 --- a/game/game.puml +++ b/game/game.puml @@ -1,70 +1,65 @@ @startuml package com.survivalcoding { -class Cleric { - {static} +MAXHP : int = 50 - {static} +MAXMP : int = 10 - -SelfAidCost : int = 5 {readOnly} - ~name : String - ~HP : int = 50 - ~MP : int = 10 - +Cleric(name: String) - +Cleric(name: String, hp: int) - +Cleric(name: String, hp: int, mp: int) - - ~selfAid() : void - ~pray(time: int) : int -} -class Person { - -name : String {readOnly} - -birthYear : int {readOnly} - - +Person(name: String, brithYear: int) - +Person(name: String) + class Cleric { + {static} +MAXHP : int = 50 + {static} +MAXMP : int = 10 + -SelfAidCost : int = 5 {readOnly} + ~name : String + ~HP : int = 50 + ~MP : int = 10 + +Cleric(name: String) + +Cleric(name: String, hp: int) + +Cleric(name: String, hp: int, mp: int) + ~selfAid() : void + ~pray(time: int) : int + } - +getName() : String - +getBirthYear() : int - +getAge() : int -} -class Wand { - -name : String - -power : double + class Person { + -name : String {readOnly} + -birthYear : int {readOnly} + +Person(name: String, brithYear: int) + +Person(name: String) + +getName() : String + +getBirthYear() : int + +getAge() : int + } - +getName() : String - +setName(name: String) : void - +getPower() : double - +setPower(power: double) : void -} -class Wizard { - -wand : Wand - -hp : int - -mp : int - -name : String + class Wand { + -name : String + -power : double + +getName() : String + +setName(name: String) : void + +getPower() : double + +setPower(power: double) : void + } - ~heal(hero: Hero) : void - +getWand() : Wand - +setWand(wand: Wand) : void - +getHp() : int - +setHp(hp: int) : void - +getMp() : int - +setMp(mp: int) : void - +getName() : String - +setName(name: String) : void -} + class Wizard { + -wand : Wand + -hp : int + -mp : int + -name : String + ~heal(hero: Hero) : void + +getWand() : Wand + +setWand(wand: Wand) : void + +getHp() : int + +setHp(hp: int) : void + +getMp() : int + +setMp(mp: int) : void + +getName() : String + +setName(name: String) : void + } -' 클래스 간의 관계 표현 (선택 사항) -Wizard "1" --> "1" Wand : 가집니다 (has) -Wizard ..> Hero : 참조합니다 (uses) -class Hero { - ~name : String - ~HP : int + class Hero { + ~name : String + ~HP : int + +Hero(name: String, HP: int) + +getHP() : int + +setHP(HP: int) : void + ~attack() : void + } - +Hero(name: String, HP: int) - +getHP() : int - +setHP(HP: int) : void - ~attack() : void -} -class Slime { + class Slime { -suffix : String {readOnly} -hp : int +Slime(suffix: String, hp: int) @@ -74,11 +69,24 @@ class Slime { ~attack(hero: Hero) : void } -class PoisonSlime { + class PoisonSlime { -poisonCount : int = 5 +PoisonSlime(suffix: String) +attack(hero: Hero) : void +getPoisonCount() : int } - } + +} + +' ---- 클래스 간의 관계 표현 영역 ---- + +' 1. 마법사 관련 관계 +Wizard "1" --> "1" Wand : 가집니다 (has) +Wizard ..> Hero : heal()에서 참조 (uses) + +' 2. 슬라임 관련 관계 +Slime <|-- PoisonSlime : 상속 (extends) +Slime ..> Hero : attack()에서 참조 (uses) +PoisonSlime ..> Hero : attack()에서 참조 (uses) + @enduml \ No newline at end of file diff --git a/game/src/main/java/com/survivalcoding/Wizard.java b/game/src/main/java/com/survivalcoding/Wizard.java index 3d2107c..d45c09e 100644 --- a/game/src/main/java/com/survivalcoding/Wizard.java +++ b/game/src/main/java/com/survivalcoding/Wizard.java @@ -3,13 +3,18 @@ public class Wizard { private Wand wand; private int hp; - private int mp; + private int mp = 100; private String name; void heal(Hero hero) { - int basePoint = 10; - int recovPoint = (int) (basePoint * this.wand.getPower()); - hero.setHP(hero.getHP() + recovPoint); + if (this.mp < 10) { + System.out.println("마나가 부족합니다."); + return; + } + + this.mp -= 10; + hero.setHP(hero.getHP() + 20); + System.out.println("힐을 시전 했습니다. 대상 HP : " + hero.getHP()); } public Wand getWand() { diff --git a/game/src/test/java/com/survivalcoding/WizardTest.java b/game/src/test/java/com/survivalcoding/WizardTest.java index 9ad9233..9369d48 100644 --- a/game/src/test/java/com/survivalcoding/WizardTest.java +++ b/game/src/test/java/com/survivalcoding/WizardTest.java @@ -36,4 +36,29 @@ void WizardTest_() { assertEquals(wand, wizard.getWand()); } + + @Test + void heal() { + //준비 + String name = "집집집"; + int hp = 1; + Hero hero = new Hero(name, hp); + Wizard wizard = new Wizard(); + //실행 + wizard.heal(hero); + //검증 + assertEquals(hp + 20, hero.getHP()); + assertEquals(90, wizard.getMp()); + //준비 + wizard.setMp(8); + int Herohp = hero.getHP(); + int WizardMp = wizard.getMp(); + //실행 + wizard.heal(hero); + //검증 + assertEquals(Herohp, hero.getHP()); + assertEquals(WizardMp, wizard.getMp()); + + + } } \ No newline at end of file From bf0e564186f0072f673f58fa8e7868d2c36b936b Mon Sep 17 00:00:00 2001 From: KJY Date: Tue, 16 Jun 2026 14:48:07 +0900 Subject: [PATCH 3/4] =?UTF-8?q?26=5F06=5F16=20=EC=83=81=EC=86=8D=20?= =?UTF-8?q?=EC=97=B0=EC=8A=B5=EB=AC=B8=EC=A0=9C=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/game.puml | 29 ++++++++++----- .../java/com/survivalcoding/GreatWizard.java | 31 ++++++++++++++++ .../main/java/com/survivalcoding/Hero.java | 21 +++++++++-- .../com/survivalcoding/GreatWizardTest.java | 36 +++++++++++++++++++ 4 files changed, 107 insertions(+), 10 deletions(-) create mode 100644 game/src/main/java/com/survivalcoding/GreatWizard.java create mode 100644 game/src/test/java/com/survivalcoding/GreatWizardTest.java diff --git a/game/game.puml b/game/game.puml index 16c0be6..7e0a2e6 100644 --- a/game/game.puml +++ b/game/game.puml @@ -34,6 +34,20 @@ package com.survivalcoding { +setPower(power: double) : void } + class Hero { + -name : String + -HP : int + -MaxHP : int = 100 + +Hero(name: String, HP: int) + +getHP() : int + +setHP(HP: int) : void + +getName() : String + +setName(name: String) : void + +getMaxHP() : int + +setMaxHP(maxHP: int) : void + ~attack() : void + } + class Wizard { -wand : Wand -hp : int @@ -50,13 +64,10 @@ package com.survivalcoding { +setName(name: String) : void } - class Hero { - ~name : String - ~HP : int - +Hero(name: String, HP: int) - +getHP() : int - +setHP(HP: int) : void - ~attack() : void + class GreatWizard { + +GreatWizard() + ~heal(hero: Hero) : void + +superHeal(hero: Hero) : void } class Slime { @@ -80,9 +91,11 @@ package com.survivalcoding { ' ---- 클래스 간의 관계 표현 영역 ---- -' 1. 마법사 관련 관계 +' 1. 마법사 및 대마법사 관련 관계 Wizard "1" --> "1" Wand : 가집니다 (has) Wizard ..> Hero : heal()에서 참조 (uses) +Wizard <|-- GreatWizard : 상속 (extends) +GreatWizard ..> Hero : heal(), superHeal()에서 참조 (uses) ' 2. 슬라임 관련 관계 Slime <|-- PoisonSlime : 상속 (extends) diff --git a/game/src/main/java/com/survivalcoding/GreatWizard.java b/game/src/main/java/com/survivalcoding/GreatWizard.java new file mode 100644 index 0000000..a34e186 --- /dev/null +++ b/game/src/main/java/com/survivalcoding/GreatWizard.java @@ -0,0 +1,31 @@ +package com.survivalcoding; + +public class GreatWizard extends Wizard { + + public GreatWizard() { + super(); + this.setMp(150); + } + + @Override + void heal(Hero hero) { + if (this.getMp() < 5) { + System.out.println("마나가 부족합니다."); + return; + } + + this.setMp(this.getMp() - 5); + hero.setHP(hero.getHP() + 25); + System.out.println("힐을 시전 했습니다. 대상 HP : " + hero.getHP()); + } + + public void superHeal(Hero hero) { + if (this.getMp() < 50) { + System.out.println("마나가 부족합니다."); + return; + } + this.setMp(this.getMp() - 50); + hero.setHP(hero.getMaxHP()); + System.out.println("슈퍼 힐을 시전했습니다. 대상 HP: " + hero.getHP()); + } +} diff --git a/game/src/main/java/com/survivalcoding/Hero.java b/game/src/main/java/com/survivalcoding/Hero.java index 5d369c5..9c8cb7f 100644 --- a/game/src/main/java/com/survivalcoding/Hero.java +++ b/game/src/main/java/com/survivalcoding/Hero.java @@ -1,8 +1,9 @@ package com.survivalcoding; public class Hero { - String name; - int HP; + private String name; + private int HP; + private int MaxHP = 100; public Hero(String name, int HP) { this.name = name; @@ -21,4 +22,20 @@ void attack() { //sout System.out.println("공격했다"); } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getMaxHP() { + return MaxHP; + } + + public void setMaxHP(int maxHP) { + MaxHP = maxHP; + } } diff --git a/game/src/test/java/com/survivalcoding/GreatWizardTest.java b/game/src/test/java/com/survivalcoding/GreatWizardTest.java new file mode 100644 index 0000000..0783f78 --- /dev/null +++ b/game/src/test/java/com/survivalcoding/GreatWizardTest.java @@ -0,0 +1,36 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class GreatWizardTest { + + @Test + void heal() { + //준비 + String name = "홍홍홍"; + int hp = 10; + Hero hero = new Hero(name, hp); + GreatWizard greatWizard = new GreatWizard(); + //실행 + greatWizard.heal(hero); + //검증 + assertEquals(hp + 25, hero.getHP()); + assertEquals(145, greatWizard.getMp()); + } + + @Test + void superHeal() { + //준비 + String name = "홍홍홍"; + int hp = 10; + Hero hero = new Hero(name, hp); + GreatWizard greatWizard = new GreatWizard(); + //실행 + greatWizard.superHeal(hero); + //검증 + assertEquals(hero.getMaxHP(), hero.getHP()); + assertEquals(100, greatWizard.getMp()); + } +} \ No newline at end of file From edd71c7030c7f714f20b8941925844f7de11c230 Mon Sep 17 00:00:00 2001 From: KJY Date: Tue, 16 Jun 2026 15:49:06 +0900 Subject: [PATCH 4/4] =?UTF-8?q?26=5F06=5F16=20=EC=83=81=EC=86=8D=20TIL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-06-16-\354\203\201\354\206\215.md" | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 "TIL/sample/2026-06-16-\354\203\201\354\206\215.md" diff --git "a/TIL/sample/2026-06-16-\354\203\201\354\206\215.md" "b/TIL/sample/2026-06-16-\354\203\201\354\206\215.md" new file mode 100644 index 0000000..32957dd --- /dev/null +++ "b/TIL/sample/2026-06-16-\354\203\201\354\206\215.md" @@ -0,0 +1,81 @@ +# 2026-06-16 상속 + +## 오늘 배운 내용 + +- 복사 붙여넣기의 경우 추가,수정에 시간이 걸리고 소스의 파악이나 관리가 어려워지기 때문에 해결책으로 상속을 활용한다 +- 다중 상속은 Java에서 금지 + +## 기억할 것 + +- "is-a원칙"이라고 하는 수칙에 따른 상속이 올바른 상속이다 +- 개념적으로 is-a관계가 되지 못 함에도 불구하고 상속을 사용한 경우가 잘못 된 상속 이다. +- 잘못된 상속을 하면 클래스를 확장할때 현실 세계와의 모순이 생기고 객체지향의 3대 특징중 1가지 다형성을 이용할수 없게 된다. +- 자식클래스 일 수록 구체화 되고 부모 클래스 일수록 추상적인 것으로 일반화 된다. + +## 정리 + +### 상속의 기초 + +- extends를 사용하여 기존 클래스를 기초로 하는 새로운 클래스를 정의 할 수 있다 +- 부모 클래스의 멤버는 자동적으로 자식 클래스에 상속되므로, 자식 클래스에는 추가 된 부분만 기술 하면 된다 +- 부모 클래스에 있는 메소드를, 자식 클래스에서 재작성 할 경우 이것을 오버라이드 한다고 한다 +- final 을 붙인 클래스는 상속이 되지 않고, final 이 붙은 메소드는 오버라이드 되지 않는다 +- 올바른 상속이란 “자식 클래스 is-a 부모 클래스" +- 상속에는 “추상적, 구체적" 관계에 있다는 것을 정의하는 역할도 있음 + +### 인스턴스 + +- 인스턴스는 내부에 부모클래스의 인스턴스를 가지는 다중구조를 가진다 +- 보다 외측의 인스턴스에 속하는 메소드가 우선적으로 동작한다 +- 외측의 인스턴스에 속하는 메소드는 super 을 사용하여 내측 인스턴스의 멤버에 점근할 수 있다 + +### 생성자 동작 + +- 다중구조의 인스턴스가 생성되는데, JVM 는 자동적으로 가장 외측 인스턴스의 생성자를 호출 +- 모든 생성자는, “부모 인스턴스의 생성자"를 호출 할 필요가 있다 +- 생성자의 선두에 super() 가 없으면, 암묵적인 “super();” 가 추가 됨 + +## 실습 코드 + +```java +package com.survivalcoding; + +public class PoisonSlime extends Slime { + private int poisonCount = 5; + + public PoisonSlime(String suffix) { + super(suffix, 50); + } + + @Override + public void attack(Hero hero) { + super.attack(hero); + + if (this.poisonCount > 0) { + System.out.println("추가로 독 포자를 살포했다!"); + int poisonDamage = hero.getHP() / 5; + hero.setHP(hero.getHP() - poisonDamage); + System.out.println(poisonDamage + "포인트 데미지"); + this.poisonCount--; + } + } + + public int getPoisonCount() { + return poisonCount; + } +} + + +``` + +## 어려웠던 점 + +- 웬래 코드를 plantUML로 바꾸는 것이 처음이라 오류를 자주냈다 + +## 해결 방법 + +- AI의 도움을 받았다 + +## 내일 더 공부할 것 + +- 상속이랑 plantUML에 대해 좀더 공부해야겠다