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 영역 안에 확보된 메모리 + +### 참조 +기본형, 참조형 + +### 메모리 +스크린샷 2025-06-16 오후 2 08 42 + +오버로드 + +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