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/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
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.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/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..7906afd0
--- /dev/null
+++ "b/TIL/topics/java_basic/2025.06.16 JAVA \355\201\264\353\236\230\354\212\244.md"
@@ -0,0 +1,75 @@
+# TIL(Today I Learned)
+
+## 클래스
+가상세계 - 컴퓨터의 메모리 영역
+인스턴스 - heap 영역 안에 확보된 메모리
+
+### 참조
+기본형, 참조형
+
+### 메모리
+
+
+오버로드
+
+null 이 안들어가는것 - 기본형
+String은 참조형이다? 기본형이다? 참조형이다. new도 없고 null도 안들어간다.
+기본형은 모두 소문자로 제공?이 된다.
+필드에 초기값을 자동 생성하도록 생성자를 자동으로 생성하자?
+Sword.Java
+Hero.Java
+Wizard.Java
+
+null과 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/TIL/topics/java_basic/2025.06.17 .md b/TIL/topics/java_basic/2025.06.17 .md
new file mode 100644
index 00000000..0f8119e2
--- /dev/null
+++ b/TIL/topics/java_basic/2025.06.17 .md
@@ -0,0 +1,78 @@
+
+# TIL(Today I Learned)
+
+## Test Code
+ - assertEquals(); / assertNotEquals();
+ 두 값이 같은지/다른지 확인
+ - assertSame(); / assertNotSame();
+ 두 객체의 참조가 같은지/다른지 확인
+ - assertTrue(); / assertFalse();
+ 조건이 true/false 인지 확인
+ - assertNull(); / assertNotNull()
+ 객체가 null이 인지/아닌지 확인
+ - assertArrayEquals();
+ 두 배열이 같은지 확인
+ - assertThrows(Exception.class, () -> { ... });
+ 예외 발생 여부 확인
+
+## commit 메세지
+ - feat: 새로운 기능 추가
+ - fix: 버그 수정
+ - docs: 문서 수정
+ - style: 코드 스타일 수정
+ - design: 사용자 UI 디자인 변경
+ - test: 테스트 코드
+ - refactor: 코드 수정
+ - build: 빌드 파일 수정
+ - ci: CI 설정 파일 수정
+ - perf: 성능 개선
+ - chore: 빌드 업무 수정, 패키지 매니저 수정
+ - rename: 파일 혹은 풀더 명을 수정만 한 경우
+ - remove: 파일을 삭제만 한 경우
+
+
+## 객체 지향의 3대 원칙 (4대의 경우 추상화 포함)
+ - 캡슐화 (encapsulation)
+ - 상속
+ - 다양성
+
+오버 로드
+없앨 수 없다.
+안전한 클래스를 만들어야 하는데!!
+
+필드에 있는 맴버 변수 함수
+
+접근 지정자
+private - 필드
+public - 메소드
+package private (default)
+protected
+
+UML(Unified Modeling Language)
+
+getter와 setter
+getter - 읽기 전용
+setter - 쓰기 전용
+
+보일러 플레이트
+
+## 자료 구조
+동적 배열(Array)
+
+연결 리스트(List)
+ - 단순 연결 리스트
+
+스택(Stack)
+
+큐(Queue)
+
+## 컬렉션
+List -
+Map -
+Set -
+
+Iterator it = names.iterator;
+
+HashSet - 컨테인즈
+HashMap - 빠르다
+
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..aa0ed30a
--- /dev/null
+++ "b/TIL/topics/java_basic/2025.07 1\354\243\274.md"
@@ -0,0 +1,28 @@
+# TIL 25.06.30 (Today I Learned)
+
+## 다형성
+
+어떤 것을 이렇게도 부를 수 있고, 저렇게도 부를 수 있는 것
+
+### 공통 메소드를 통합
+
+- house.draw()
+- dog.draw()
+- car.draw()
+
+## Interface 정의
+
+# TIL 25.07.01 (Today I Learned)
+
+## 제네릭 (Generic)
+
+타입을 나중에 원하는 형태로 정의 할 수 있음
+
+## 열거형 (enum)
+
+정해 둔 값만 넣어둘 수 있는 타입
+
+## 이너클래스 (Inner class)
+
+클래스 안에 정의하는 클래스
+
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..6321c4d3
--- /dev/null
+++ "b/TIL/topics/java_basic/2025.07 2\354\243\274.md"
@@ -0,0 +1,253 @@
+# TIL 25.07.07 (Today I Learned)
+
+## 인스턴스 기본 조작
+
+## Object 클래스
+
+모든 클래스의 최상위(루트) 클래스 - 클래스를 자동으로 상속받는다.
+
+## 대표 메서드
+
+### 1. toString()
+
+객체 안에 내용을 알기 쉽게 보여주는 메서드
+List / Set / Map
+
+### 2. equals()
+
+equals / ==
+
+### 3. hashCode()
+
+### 4. Collections.sort()
+
+### 얕은 복사 / 깊은 복사
+
+clone
+Cloneable
+
+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
+
+# TIL 25.07.08 (Today I Learned)
+
+## Git
+
+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는 위험할 수 있음
+
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..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"
@@ -0,0 +1,56 @@
+# TIL(Today I Learned)
+
+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 - 원격 저장소에서 로컬 저장소로
+
+## 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/myfile.txt b/myfile.txt
new file mode 100644
index 00000000..e69de29b
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..f7e34aa5
--- /dev/null
+++ b/src/main/java/Asset/Asset.puml
@@ -0,0 +1,56 @@
+@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{
+ double weight
+
+ double getWeight()
+ void setWeight(double weight)
+}
+
+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 {
+
+}
+
+
+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/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/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/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/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/Character.java b/src/main/java/com/survivalcoding/Character.java
new file mode 100644
index 00000000..01a87a2b
--- /dev/null
+++ b/src/main/java/com/survivalcoding/Character.java
@@ -0,0 +1,16 @@
+package com.survivalcoding;
+
+public abstract class Character {
+
+ public abstract void attack(Slime slime);
+
+ 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
new file mode 100644
index 00000000..918e2b93
--- /dev/null
+++ b/src/main/java/com/survivalcoding/Cleric.java
@@ -0,0 +1,80 @@
+package com.survivalcoding;
+
+import java.util.Random;
+
+public class Cleric extends Character {
+ static final int maxHp = 50;
+ static final int maxMp = 10;
+
+ String name;
+ int hp;
+ int mp;
+
+ 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 = maxMp;
+ }
+
+ 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;
+ }
+
+ // mp 회복
+ mp += recoveryMp;
+ return recoveryMp;
+ }
+
+ @Override
+ public void attack(Slime slime) {
+ }
+
+}
diff --git a/src/main/java/com/survivalcoding/Hero.java b/src/main/java/com/survivalcoding/Hero.java
new file mode 100644
index 00000000..bacc581a
--- /dev/null
+++ b/src/main/java/com/survivalcoding/Hero.java
@@ -0,0 +1,93 @@
+package com.survivalcoding;
+
+import java.util.Random;
+
+public class Hero {
+ // 공유자원
+ public static int money = 100;
+
+ private String name; // null
+ private int hp; // 0
+ private Sword sword; // null
+
+ public int getHp() {
+ return hp;
+ }
+
+ public void setHp(int hp) {
+ if (hp < 0) {
+ throw new IllegalArgumentException("hp는 음수가 될 수 없음");
+ }
+ this.hp = hp;
+ }
+
+ 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() {
+ System.out.println("run");
+ }
+
+ public 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);
+
+ hero1.setHp(-10);
+
+ 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/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/Kinoko.java b/src/main/java/com/survivalcoding/Kinoko.java
new file mode 100644
index 00000000..8bb0e72c
--- /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..78884bdc 100644
--- a/src/main/java/com/survivalcoding/Main.java
+++ b/src/main/java/com/survivalcoding/Main.java
@@ -1,15 +1,18 @@
package com.survivalcoding;
-//TIP To Run code, press or
-// click the icon in the gutter.
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!");
- 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);
- }
+ Kinoko kinoko = new Kinoko();
+ kinoko.setHP(100);
+
+ System.out.println("hp 100 회복");
}
}
\ No newline at end of file
diff --git a/src/main/java/com/survivalcoding/Person.java b/src/main/java/com/survivalcoding/Person.java
new file mode 100644
index 00000000..2907d469
--- /dev/null
+++ b/src/main/java/com/survivalcoding/Person.java
@@ -0,0 +1,30 @@
+package com.survivalcoding;
+
+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/com/survivalcoding/PoisonSlime.java b/src/main/java/com/survivalcoding/PoisonSlime.java
new file mode 100644
index 00000000..b42dba13
--- /dev/null
+++ b/src/main/java/com/survivalcoding/PoisonSlime.java
@@ -0,0 +1,36 @@
+package com.survivalcoding;
+
+public abstract 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..9cc6991d
--- /dev/null
+++ b/src/main/java/com/survivalcoding/Slime.java
@@ -0,0 +1,61 @@
+package com.survivalcoding;
+
+import Monster.Monster;
+
+public abstract 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 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);
+ }
+
+ @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/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/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/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/Wand.java b/src/main/java/com/survivalcoding/Wand.java
new file mode 100644
index 00000000..f2a5b361
--- /dev/null
+++ b/src/main/java/com/survivalcoding/Wand.java
@@ -0,0 +1,43 @@
+package com.survivalcoding;
+
+public class Wand {
+ private String name; // 지팡이의 이름
+ private double power; // 지팡이의 마력
+
+ public Wand(String name) {
+ this(name, 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) {
+ 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
new file mode 100644
index 00000000..474c7532
--- /dev/null
+++ b/src/main/java/com/survivalcoding/Wizard.java
@@ -0,0 +1,100 @@
+package com.survivalcoding;
+
+public class Wizard extends Character {
+ private String name;
+ private int hp;
+ private int mp;
+ private Wand wand;
+
+ 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 void fireball(Slime slime) {
+
+ }
+
+ 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) {
+ if (name == null) {
+ throw new IllegalArgumentException("이름은 null이 아니어야 함");
+ }
+ if (name.length() < 3) {
+ throw new IllegalArgumentException("이름이 너무 짧음");
+ }
+ this.name = name;
+ }
+
+ public int getHP () {
+
+ return hp;
+ }
+
+ public void setHP (int hp) {
+ if (hp < 0) {
+ this.hp = 0;
+ }
+ else {
+ this.hp = hp;
+ }
+ }
+
+ public int getMP () {
+ return mp;
+ }
+
+ public void setMP (int mp) {
+ if (mp < 0) {
+ throw new IllegalArgumentException("MP는 0이상 이어야 한다.");
+ }
+ this.mp = mp;
+ }
+
+ public Wand getWand () {
+ return wand;
+ }
+
+ public void setWand (Wand wand) {
+ if (wand == null) {
+ throw new IllegalArgumentException("지팡이는 null일 수 없습니다.");
+ }
+ this.wand = wand;
+ }
+
+ @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/assignments_01_instance/exam01/Person.java b/src/main/java/com/survivalcoding/assignments_01_instance/exam01/Person.java
deleted file mode 100644
index 039b0123..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;
-
-public class Person {
- private String name;
- private int age;
-
- public Person(String name, int age) {
- this.name = name;
- this.age = age;
- }
-
- public String getName() {
- return name;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public static void main(String[] args) {
- Person person = new Person("John", 30);
- }
-}
diff --git a/src/main/java/com/survivalcoding/game.puml b/src/main/java/com/survivalcoding/game.puml
new file mode 100644
index 00000000..a65de87d
--- /dev/null
+++ b/src/main/java/com/survivalcoding/game.puml
@@ -0,0 +1,49 @@
+@startuml
+'https://plantuml.com/class-diagram
+
+scale 1.5
+
+class SuperHero extends Hero {
+ + boolean isFlying
+}
+
+interface Attackable {
+ {abstract} void attack(Slime slime)
+}
+
+class SoccerPlayer implements Attackable {
+}
+
+class Hero{
+ + String name
+ - int hp
+}
+
+abstract class Character implements Attackable {
+ String name
+ int hp
+}
+
+class Wizard extends Character {
+ int mp
+ + void heal(Hero hero)
+ + void attack(Slime slime)
+}
+
+class Hero extends Character {
+ + void attack(Slime slime)
+ + 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/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/generic/AuthState.java b/src/main/java/generic/AuthState.java
new file mode 100644
index 00000000..a1ee9b30
--- /dev/null
+++ b/src/main/java/generic/AuthState.java
@@ -0,0 +1,8 @@
+package generic;
+
+public enum AuthState {
+ AUTHENTICATED,
+ UNAUTHENTICATED,
+ UNKNOWN,
+ AUTHENTICATING,
+}
diff --git a/src/main/java/generic/EnumMain.java b/src/main/java/generic/EnumMain.java
new file mode 100644
index 00000000..2d4c6ada
--- /dev/null
+++ b/src/main/java/generic/EnumMain.java
@@ -0,0 +1,23 @@
+package 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");
+ }
+ case 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..e1330ba2
--- /dev/null
+++ b/src/main/java/generic/Pocket.java
@@ -0,0 +1,32 @@
+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/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..e1ba32e7
--- /dev/null
+++ b/src/main/java/inheritance/Hero.java
@@ -0,0 +1,51 @@
+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..1b3e5a87
--- /dev/null
+++ b/src/main/java/inheritance/PoisonSlime.java
@@ -0,0 +1,25 @@
+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..455a68f9
--- /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/main/java/instance/Book.java b/src/main/java/instance/Book.java
new file mode 100644
index 00000000..d2c21fcf
--- /dev/null
+++ b/src/main/java/instance/Book.java
@@ -0,0 +1,71 @@
+package instance;
+
+import java.util.Date;
+import java.util.Objects;
+
+public class Book implements Comparable, Cloneable {
+ 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;
+ }
+
+ 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;
+ }
+
+ @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, book.publishDate);
+ }
+
+ @Override
+ 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));
+ 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
new file mode 100644
index 00000000..31175414
--- /dev/null
+++ b/src/main/java/instance/ListMain.java
@@ -0,0 +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.println(heroesList.size());
+
+ heroesList.remove(h2);
+ System.out.println(heroesList.size());
+ }
+}
diff --git a/src/main/java/instance/SetMain.java b/src/main/java/instance/SetMain.java
new file mode 100644
index 00000000..dd7d5bbc
--- /dev/null
+++ b/src/main/java/instance/SetMain.java
@@ -0,0 +1,20 @@
+package instance;
+
+import com.survivalcoding.Hero;
+
+import java.util.HashSet;
+import java.util.Set;
+
+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.println(heroesSet.size());
+
+ heroesSet.remove(h2);
+ System.out.println(heroesSet.size());
+ }
+}
diff --git a/src/main/java/instance/ToString.java b/src/main/java/instance/ToString.java
new file mode 100644
index 00000000..526dcbe4
--- /dev/null
+++ b/src/main/java/instance/ToString.java
@@ -0,0 +1,15 @@
+package instance;
+
+import com.survivalcoding.Hero;
+
+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
diff --git a/src/test/java/com/survivalcoding/ClericTest.java b/src/test/java/com/survivalcoding/ClericTest.java
new file mode 100644
index 00000000..f1f48519
--- /dev/null
+++ b/src/test/java/com/survivalcoding/ClericTest.java
@@ -0,0 +1,154 @@
+package com.survivalcoding;
+import static org.junit.jupiter.api.Assertions.*;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
+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/HeroTest.java b/src/test/java/com/survivalcoding/HeroTest.java
new file mode 100644
index 00000000..1d75c0f2
--- /dev/null
+++ b/src/test/java/com/survivalcoding/HeroTest.java
@@ -0,0 +1,25 @@
+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
diff --git a/src/test/java/com/survivalcoding/KinokoTest.java b/src/test/java/com/survivalcoding/KinokoTest.java
new file mode 100644
index 00000000..7e38e6fa
--- /dev/null
+++ b/src/test/java/com/survivalcoding/KinokoTest.java
@@ -0,0 +1,20 @@
+package com.survivalcoding;
+
+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
diff --git a/src/test/java/com/survivalcoding/PersonTest.java b/src/test/java/com/survivalcoding/PersonTest.java
new file mode 100644
index 00000000..fa3e9537
--- /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.assertEquals;
+
+class PersonTest {
+
+ @Test
+ @DisplayName("2000년 생은 25살이다")
+ void getAge() {
+ Person person = new Person("홍길동", 2000);
+ assertEquals(25, person.getAge());
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/com/survivalcoding/PoisonSlimeTest.java b/src/test/java/com/survivalcoding/PoisonSlimeTest.java
new file mode 100644
index 00000000..e9433f3e
--- /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);
+ final 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);
+ final 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
diff --git a/src/test/java/com/survivalcoding/WandTest.java b/src/test/java/com/survivalcoding/WandTest.java
new file mode 100644
index 00000000..5f28670b
--- /dev/null
+++ b/src/test/java/com/survivalcoding/WandTest.java
@@ -0,0 +1,46 @@
+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
diff --git a/src/test/java/inheritance/PoisonSlimeTest.java b/src/test/java/inheritance/PoisonSlimeTest.java
new file mode 100644
index 00000000..ecda4c7f
--- /dev/null
+++ b/src/test/java/inheritance/PoisonSlimeTest.java
@@ -0,0 +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 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
diff --git a/src/test/java/instance/BookTest.java b/src/test/java/instance/BookTest.java
new file mode 100644
index 00000000..2c51d35e
--- /dev/null
+++ b/src/test/java/instance/BookTest.java
@@ -0,0 +1,21 @@
+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