diff --git "a/TIL/sample/2026-06-15-\354\272\241\354\212\220-\354\273\254\353\240\211\354\205\230.md" "b/TIL/sample/2026-06-15-\354\272\241\354\212\220-\354\273\254\353\240\211\354\205\230.md" index 463ad8f..157c23f 100644 --- "a/TIL/sample/2026-06-15-\354\272\241\354\212\220-\354\273\254\353\240\211\354\205\230.md" +++ "b/TIL/sample/2026-06-15-\354\272\241\354\212\220-\354\273\254\353\240\211\354\205\230.md" @@ -19,7 +19,7 @@ Set : 순서가 없는 집합 (중복 불가) - 컬렉션은 기본형(int, double, boolean 등)을 취급할 수 없다 -## 기억할 것 +## 기억할 것- - 멤버에 대한 접근 : 필드는 private 메소드는 public 클래스 엑세스 지정은 public로 알괄 지정, package private 지정 멤버나 클래스는 통일 패키지내의 클래스에서만 접근 가능 - 리스트와 배열을 비슷 하지만 서로 차이가 있다. 배열은 처음 선언시 메모리 공간이 고정적이고, 리스트는 가변적으로 지정 가능(데이터가 추가 또는 삭제 될 때 크기를 동적으로 늘리거나 줄어듬) 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..9e9098b --- /dev/null +++ "b/TIL/sample/2026-06-16-\354\203\201\354\206\215.md" @@ -0,0 +1,145 @@ +# 2026-06-08 함수 + +## 오늘 배운 내용 + +- 상속/ + 이전의 만든 클래스와 닮았지만 일부 다른 클래스 + 이전의 만든 클래스에서 함수를 불러옴 +- 기존의 복사 붙여 넣기/ + 추가, 수정에 시간이 걸리고 소스의 파악이나 관리가 어려워 진다. -> 그래서 나온 해결책이 상속 +- 오버라이드/ 부모 클래스의 메서드를 자식 클래스에서 재 작성 할 경우 오버라이드(override)라 부름 + +- 인스턴스/ + 인스턴스는 내부에 부모클래스의 인스턴스를 가지는 다중구조를 가진다. + 보다 외측의 인스턴스에 속하는 메소드가 우선적으로 동작한다. + 외측의 인스턴스에 속하는 메소드는 super 을 사용하여 내측 인스턴스의 멤버에 점근할 수 있다. +- super()/ super는 부모 클래스를 가리키는 키워드. 부모 기능을 유지하면서 추가 기능을 덧 붙일 때 사용. +- 생성자 동작/ 다중구조의 인스턴스가 생성되는데, JVM 는 자동적으로 가장 외측 인스턴스의 생성자를 호출. + 모든 생성자는, “부모 인스턴스의 생성자"를 호출 할 필요가 있다. + 생성자의 선두에 super() 가 없으면, 암묵적인 “super();” 가 추가 됨. + +## 기억할 것 + +```java +public class Hero { + public Hero() { + System.out.println("Hero 생성자"); + } +} + +public class superHero extends Hero { + public superHero() { + System.out.println("superHero 생성자"); + } +} + +public calss Main{ + +public static void main(String[] args) { + SuperHero superHero = new SuperHero(); +} +} +//이런 상황에서 +//Hero 생성자 먼저 출력 후 superHero 생성자 다음 출력 +``` + +- extends로 클래스 상속을 표시 +- super는 반드시 생성자 첫줄에 쓴다 +- is a 원칙 (~은(는) 이다.)/ + 한 클래스와 다른 클래스의 상속 관계를 a는 b에 속해 있다는 것으로 표기하면 이해하기 쉽다. + 개념적으로 관계성이 없는 상속은 잘못된 상속. +- 자식 클래스는 구체화, 부모 클래스는 추상화 (예: 부모 클래스로 엔진/ 자식 클래스로 자동차, 배, 비행기, 로켓) + +## 실습 코드 + +```java +public class Wizard { + private int hp; + private int mp; + //private int mp = 100; + private String name; + private Wand wand; + + public void wizard(int mp) { + //if (this.mp < mp) { + this.mp = mp; + //} + } + + public void heal(Hero hero) { + if (this.mp <= 0) { + System.out.println("마나가 부족합니다."); + } + this.mp -= 10; + hero.setHp(hero.getHp() + 20); + System.out.println("힐을 시전 하였습니다. 대상 HP: " + hero.getHp()); + } + + public void setMp(int mp) { + this.mp = mp; + } + + public int getMp() { + return mp; + } + +} + +public class GreatWizard extends Wizard { + int mp = 150; + + public GreatWizard(int mp) { + super.wizard(mp); + } + + + public void heal(Hero hero) { + super.heal(hero); + super.setMp(getMp() + 5); + hero.setHp(hero.getHp() + 5); + } + + public void superHeal(Hero hero) { + super.setMp(getMp() - 40); + hero.maxHp(); + System.out.println("슈퍼 힐을 시전 했습니다. 대상 HP: " + hero.getHp()); + } +} + +class WandTest { + @Test + @DisplayName("마법사 테스트") + void test() { + //given + Hero hero = new Hero(); + GreatWizard greatWizard = new GreatWizard(150); + //when 1 + for (int i = 0; i < 5; i++) { + greatWizard.heal(hero); + } + //then 1 + assertEquals(225, hero.getHp()); + //when 2 + greatWizard.superHeal(hero); + //then 2 + assertEquals(100, hero.getHp()); + } + +} + + +``` + +## 어려웠던 점 + +- is a 원칙대로 클래스 이름을 정의 하려고 하니 단어가 잘 생각이 안난다. +- 사실상 상속 개념을 처음으로 실습해서 부모 클래스에서 만든 메서드를 지속해서 망각 했다. + +## 해결 방법 + +- AI를 통해 단어들을 찾거나 인터넷에 검색을 하여 클래스 이름을 검색 하였다. +- 교보재 보면서 천천히 코드를 작성 했다. + +## 내일 더 공부할 것 + +- 클래스 상속 활용 방법 \ No newline at end of file diff --git a/game/src/game.puml b/game/src/game.puml new file mode 100644 index 0000000..93d2285 --- /dev/null +++ b/game/src/game.puml @@ -0,0 +1,39 @@ +@startuml + +class Hero { + - name: String + - hp: int + - maxHP: int + -- + + maxHp() + + setHp(hp: int) + + getHp(): int + + setRandomMoney() {static} +} + +class Wizard { + - hp: int + - mp: int + - name: String + - wand: Wand + -- + + wizard(mp: int) + + heal(hero: Hero) + + setMp(mp: int) + + getMp(): int + + getHp(): int + + setHp(hp: int) +} + +class GreatWizard extends Wizard { + - mp: int + -- + + GreatWizard(mp: int) + + heal(hero: Hero) + + superHeal(hero: Hero) +} + +Wizard ..> Hero : heal(hero) +GreatWizard ..> Hero : heal(hero) + +@enduml \ No newline at end of file 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..5558075 --- /dev/null +++ b/game/src/main/java/com/survivalcoding/GreatWizard.java @@ -0,0 +1,22 @@ +package com.survivalcoding; + +public class GreatWizard extends Wizard { + int mp = 150; + + public GreatWizard(int mp) { + super.wizard(mp); + } + + + public void heal(Hero hero) { + super.heal(hero); + super.setMp(getMp() + 5); + hero.setHp(hero.getHp() + 5); + } + + public void superHeal(Hero hero) { + super.setMp(getMp() - 40); + hero.maxHp(); + 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 2c3b2b2..6c763d3 100644 --- a/game/src/main/java/com/survivalcoding/Hero.java +++ b/game/src/main/java/com/survivalcoding/Hero.java @@ -3,8 +3,9 @@ import java.util.Random; public class Hero { - public String name; - public int hp; + private String name; + private int hp = 0; + private int maxHP = 100; //Sword sword; static int money = 100; @@ -15,12 +16,21 @@ static void setRandomMoney() { hero.name = "홍길동"; } + public void maxHp() { + this.hp = maxHP; + } //setter 값을 입력 - void setHp(int hp) { + public void setHp(int hp) { + this.hp = hp; } + // getter 값을 불러오기 + int getHp() { + return hp; + } + void setName(String name) { if (name == null) { throw new IllegalArgumentException("이름이 null 일 수는 없습니다."); @@ -31,11 +41,6 @@ void setName(String name) { this.name = name; } - // getter 값을 불러오기 - int getHp() { - return hp; - } - Hero() { this.name = "홍길동"; @@ -52,4 +57,8 @@ void attack() { hp -= 1; System.out.println("공격했다"); } + + void heroRun() { + System.out.println("RUN"); + } } diff --git a/game/src/main/java/com/survivalcoding/Main.java b/game/src/main/java/com/survivalcoding/Main.java index a02fe5f..01e6bff 100644 --- a/game/src/main/java/com/survivalcoding/Main.java +++ b/game/src/main/java/com/survivalcoding/Main.java @@ -6,11 +6,12 @@ public class Main { public static void main(String[] args) { //용사 생성 (ram 메모리에 용사 데이터 올리기) - Hero hero = new Hero(); - - hero.setName(""); - - //Hero.hp = 10; - +// Hero hero = new Hero(); +// Wizard wizard = new GreatWizard(100); +// +// +// for (int i = 0; i < 20; i++) { +// wizard.heal(hero); +// } } } \ No newline at end of file diff --git a/game/src/main/java/com/survivalcoding/Person.java b/game/src/main/java/com/survivalcoding/Person.java index 19ac447..226f94a 100644 --- a/game/src/main/java/com/survivalcoding/Person.java +++ b/game/src/main/java/com/survivalcoding/Person.java @@ -17,8 +17,8 @@ public static void main(String[] args) { ArrayList names = new ArrayList<>(); - names.add("홍길동"); - names.add("한석봉"); + names.add("HONGGILDONG"); + names.add("HANSUKBONG"); Iterator it = names.iterator(); while (it.hasNext()) { @@ -28,19 +28,19 @@ public static void main(String[] args) { //컬렉션 2 List people = new ArrayList<>(); - people.add(new Person("홍길동", 20)); - people.add(new Person("한석봉", 25)); + people.add(new Person("HONGGILDONG", 20)); + people.add(new Person("HANSUKBONG", 25)); for (Person person : people) { - System.out.println(person.getName() + "의 나이는 " + person.getAge() + "살"); + System.out.println(person.getName() + "'s age is " + person.getAge() + "years old"); } } - private String getName() { + String getName() { return name; } - private int getAge() { + int getAge() { return age; } 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..645d860 --- /dev/null +++ b/game/src/main/java/com/survivalcoding/PoisonSlime.java @@ -0,0 +1,23 @@ +package com.survivalcoding; + +public class PoisonSlime extends Slime { + + private int poisonCount = 5; + + public PoisonSlime(String suffix) { + super(suffix); + } + + public void poisonSlimeAttack(Hero hero) { + super.attack(hero); + + if (poisonCount <= 0) { + System.out.println("독포자를 살포 했다!"); + int poisonDamage = hero.getHp() / 5; + hero.setHp(hero.getHp() - poisonDamage); + System.out.println(poisonDamage + " 포인트 데미지"); + + } + poisonCount--; + } +} diff --git a/game/src/main/java/com/survivalcoding/Quiz.java b/game/src/main/java/com/survivalcoding/Quiz.java index 4aac35c..725ff22 100644 --- a/game/src/main/java/com/survivalcoding/Quiz.java +++ b/game/src/main/java/com/survivalcoding/Quiz.java @@ -2,29 +2,29 @@ public class Quiz { public static void main(String[] args) { - Hero hero1 = new Hero(); - hero1.hp = 100; - Hero hero2 = hero1; - hero2.hp = 200; - System.out.println(hero1.hp); - - Wizard wizard; - int number = 100; - int number2 = number; - number2 = 200; - System.out.println(number); - - System.out.println("=========="); - System.out.println(hero1.hp); - System.out.println(hero1.money); - System.out.println("=========="); - - Hero hero3 = new Hero("서수현"); - - System.out.println(hero3.hp); - System.out.println(hero3.name); - System.out.println(Hero.money); - - Hero.money = 200; +// Hero hero1 = new Hero(); +// hero1.hp = 100; +// Hero hero2 = hero1; +// hero2.hp = 200; +// System.out.println(hero1.hp); +// +// Wizard wizard; +// int number = 100; +// int number2 = number; +// number2 = 200; +// System.out.println(number); +// +// System.out.println("=========="); +// System.out.println(hero1.hp); +// System.out.println(hero1.money); +// System.out.println("=========="); +// +// Hero hero3 = new Hero("서수현"); +// +// System.out.println(hero3.hp); +// System.out.println(hero3.name); +// System.out.println(Hero.money); +// +// Hero.money = 200; } } 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..f3c4c06 --- /dev/null +++ b/game/src/main/java/com/survivalcoding/Slime.java @@ -0,0 +1,16 @@ +package com.survivalcoding; + +public class Slime { + final String suffix; + private int hp; + + public Slime(String suffix) { + this.suffix = suffix; + } + + public void attack(Hero hero) { + System.out.println("슬라임 " + suffix + " 이/가 공격했다."); + System.out.println("-10의 데미지"); + hero.setHp(hero.getHp() - 10); + } +} diff --git a/game/src/main/java/com/survivalcoding/SuperHero.java b/game/src/main/java/com/survivalcoding/SuperHero.java new file mode 100644 index 0000000..345ad68 --- /dev/null +++ b/game/src/main/java/com/survivalcoding/SuperHero.java @@ -0,0 +1,19 @@ +package com.survivalcoding; + +public class SuperHero extends Hero { + private boolean isFlying; + + public static void main(String[] args) { + SuperHero superHero = new SuperHero(); + superHero.heroRun(); + + + } + + public void attack(int age) { + if (isFlying) { + System.out.println("한번더"); + } + super.attack(); + } +} diff --git a/game/src/main/java/com/survivalcoding/Wizard.java b/game/src/main/java/com/survivalcoding/Wizard.java index 6433b47..6d39415 100644 --- a/game/src/main/java/com/survivalcoding/Wizard.java +++ b/game/src/main/java/com/survivalcoding/Wizard.java @@ -3,66 +3,83 @@ public class Wizard { private int hp; private int mp; + //private int mp = 100; private String name; private Wand wand; - //getter - public int getHp() { - return hp; - } - - public int getMp() { - return mp; - } - - public String getName() { - return name; - } - - public Wand getWand() { - return wand; + public void wizard(int mp) { + //if (this.mp < mp) { + this.mp = mp; + //} } - //setter - public void setHp(int hp) { - if (hp < 0) hp = 0; // HP가 음수면 0으로 - if (hp > 999) hp = 999; - this.hp = hp; + public void heal(Hero hero) { + if (this.mp <= 0) { + System.out.println("마나가 부족합니다."); + } + this.mp -= 10; + hero.setHp(hero.getHp() + 20); + System.out.println("힐을 시전 하였습니다. 대상 HP: " + hero.getHp()); } public void setMp(int mp) { - if (mp < 0) mp = 0; // HP가 음수면 0으로 - if (mp > 999) mp = 999; this.mp = mp; } - public void setName(String name) { - if (name == null) { - throw new IllegalArgumentException("이름이 null 일 수는 없습니다."); - } - if (name.length() < 3) { - throw new IllegalArgumentException("이름은 3글자 이상이여야 합니다."); - } - - this.name = name; + public int getMp() { + return mp; } - public void setWand(Wand wand) { - if (wand == null) { - throw new IllegalArgumentException("지팡이가 null일 수는 없습니다."); - } - this.wand = wand; - } - //setter +} + +// public String getName() { +// return name; +// } +// +// public Wand getWand() { +// return wand; +// } + +//setter +// public void setHp(int hp) { +// if (hp < 0) hp = 0; // HP가 음수면 0으로 +// if (hp > 999) hp = 999; +// this.hp = hp; +// } +// +// public void setMp(int mp) { +// if (mp < 0) mp = 0; // HP가 음수면 0으로 +// if (mp > 999) mp = 999; +// this.mp = mp; +// } +// +// public void setName(String name) { +// if (name == null) { +// throw new IllegalArgumentException("이름이 null 일 수는 없습니다."); +// } +// if (name.length() < 3) { +// throw new IllegalArgumentException("이름은 3글자 이상이여야 합니다."); +// } +// +// this.name = name; +// } +// +// public void setWand(Wand wand) { +// if (wand == null) { +// throw new IllegalArgumentException("지팡이가 null일 수는 없습니다."); +// } +// this.wand = wand; +// } +//setter // public void heal(Hero hero) { // int basePoint = 10; // int recovPoint = (int) (basePoint * this.wand.getPower()); // hero.setHp(hero.getHp() + recovPoint); // } - //getter +//getter // public int power() { // // } -} + diff --git a/game/src/test/java/com/survivalcoding/HeroTest.java b/game/src/test/java/com/survivalcoding/HeroTest.java index 15612e4..35cf1cd 100644 --- a/game/src/test/java/com/survivalcoding/HeroTest.java +++ b/game/src/test/java/com/survivalcoding/HeroTest.java @@ -3,8 +3,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; - class HeroTest { @Test @@ -15,16 +13,16 @@ void attack() { Hero hero = new Hero(); Hero hero1 = new Hero("홍길동"); //when 실행 - hero.hp = 10; + //hero.hp = 10; hero.attack(); //9 hero.attack(); //8 // then (검증) - assertEquals(9, hero.hp); // 9 + //assertEquals(9, hero.hp); // 9 hero.attack(); // 8 // then (검증) - assertEquals(8, hero.hp); // 8 + //assertEquals(8, hero.hp); // 8 } } \ No newline at end of file diff --git a/game/src/test/java/com/survivalcoding/PersonTest.java b/game/src/test/java/com/survivalcoding/PersonTest.java new file mode 100644 index 0000000..38616e1 --- /dev/null +++ b/game/src/test/java/com/survivalcoding/PersonTest.java @@ -0,0 +1,20 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class PersonTest { + @Test + void 이름_정상_설정() { + Person p = new Person("홍길동", 20); + assertEquals("홍길동", p.getName()); + } + + @Test + void 나이_정상_설정() { + Person p = new Person("홍길동", 20); + assertEquals(20, p.getAge()); + } + +} \ No newline at end of file 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..bfbabf1 --- /dev/null +++ b/game/src/test/java/com/survivalcoding/PoisonSlimeTest.java @@ -0,0 +1,25 @@ +package com.survivalcoding; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class PoisonSlimeTest { + //public static void main(String[] args) { + + //용사 생성 (ram 메모리에 용사 데이터 올리기) + @Test + @DisplayName("독슬라임 독 공격 테스트") + void test() { + //given + Hero hero = new Hero(); + PoisonSlime slimeA = new PoisonSlime("A"); + //when + for (int i = 0; i < 10; i++) { + slimeA.poisonSlimeAttack(hero); + } + //then + assertTrue(hero.getHp() < 1000 - (10 * 10)); + } +} \ No newline at end of file diff --git a/game/src/test/java/com/survivalcoding/WandTest.java b/game/src/test/java/com/survivalcoding/WandTest.java index 0e3cab2..e7400ad 100644 --- a/game/src/test/java/com/survivalcoding/WandTest.java +++ b/game/src/test/java/com/survivalcoding/WandTest.java @@ -1,5 +1,27 @@ package com.survivalcoding; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + class WandTest { + @Test + @DisplayName("마법사 테스트") + void test() { + //given + Hero hero = new Hero(); + GreatWizard greatWizard = new GreatWizard(150); + //when 1 + for (int i = 0; i < 5; i++) { + greatWizard.heal(hero); + } + //then 1 + assertEquals(225, hero.getHp()); + //when 2 + greatWizard.superHeal(hero); + //then 2 + assertEquals(100, hero.getHp()); + } } \ No newline at end of file