Repository: SurvivalCodingCampus/modu-3-dart-study
Pull request #91: 250313_11_이윤서
Author: login: YunFlutter
Created: 2025-03-13T08:59:12Z | Merged: 2025-03-14T03:18:38Z

# 250313_11_이윤서

## 📝 과제 정보

- **교육 주제**:  Dart Class에 대한 개념 정리 및 과제

## ✅ 구현 내용
-------------------------------- 연습문제1-------------------------------
1. Cleric이라는 캐릭터의 클래스를 생성하고 
2. 이름,HP,최대HP,MP,최대MP를 속성으로 추가
3. HP,최대HP는 정수 50, ,MP,최대MP는 정수 10으로 초기치 설정
4. 최대HP,최대MP는 상수 필드로 선언

-------------------------------- 연습문제2-------------------------------
1. 연습문제 1에서 생성한 클래스에 셀프 에이드라는 마법을 사용해 MP를 5 소비하는 걸로 자신의 HP를 최대 HP까지 회복 가능하게 하는 메서드 추가

-------------------------------- 연습문제3-------------------------------
1. 연습문제 1에서 생성한 클래스에 pray 라는 메소드를 추가
2. pray는 기도한 시간에 따라 자신의 MP를 회복한다
3. pray의 기도 시간에 따라 랜덤하게 0~2포인트를 보정한 양이다. 단 최대 HP보다 더 회복하는 것은 불가능하다


## 📋 체크리스트



## 🔍 구현 방법
연습문제 2 =>  hp가 maxHp보다 적을 경우에 mp를 5를 줄이고 hp를 maxHp까지 회복함
연습문제 3 => 랜덤한 보정치를 구현하기 위해 랜덤 메서드를 사용해서 랜덤한 숫자를 불러와서 기도한 시간에 더해서 회복량을 정의 하고, mp에 실제회복량을 더해 구현을 시킴. 회복량보다 회복되는 mp가 적은 경우는 정확히 회복된 량 만큼만을 구해서 회복량에 대입시켜 리턴함


## 📷 실행 결과

![image](https://github.com/user-attachments/assets/20f41fb4-173a-430d-9602-53c621296c84)
![image](https://github.com/user-attachments/assets/e2927940-b43d-4750-b7e5-22ec4d6033d3)
![image](https://github.com/user-attachments/assets/6aa4b866-71ae-46b1-b09a-347c0591cd6c)
![image](https://github.com/user-attachments/assets/380ec40f-8aa4-48ff-926f-acc409e8512a)


## 🚨 어려웠던 점
역시 수학적인 알고리즘을 더 공부 해야 겠다는 생각을 했음

## 💡 배운 점

알고리즘 공부와 함께 개념을 더 정리 해야 겠다

## ❓ 질문 사항

변수와 상수의 차이가 뭔가요?

## 📚 참고 자료

<!-- 과제 수행에 참고한 자료나 문서의 링크를 공유해주세요 -->

## 🔄 자체 평가 & 회고
그래도 하나씩 풀어가니 재밌다

## 📢 Discord 알림

이 PR의 내용을 Discord의 해당 채널에 복사&붙여넣기 합니다

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit


- **Documentation**
  - Dart의 클래스 개념과 객체 활용법에 대한 포괄적인 안내서가 추가되어, 기본 원리를 쉽게 이해할 수 있습니다.
- **New Features**
  - 새로운 Cleric 캐릭터 기능이 도입되어, 체력 회복과 마법 포인트 관리 메커니즘을 제공합니다.
- **Tests**
  - Cleric 기능의 안정성을 검증하는 단위 테스트가 추가되어, 핵심 기능이 신뢰성 있게 작동함을 확인했습니다.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/TIL/daily/2025-03-13/2025-03-13.md b/TIL/daily/2025-03-13/2025-03-13.md
new file mode 100644
index 00000000..a784704e
--- /dev/null
+++ b/TIL/daily/2025-03-13/2025-03-13.md
@@ -0,0 +1,251 @@
+# 250313_11_이윤서
+
+# Dart(Class의 개념과 관련 개념 정리)
+
+## Class
+
+- 클래스(Class)란?
+    - 객체(Object)를 만들기 위한 설계도
+    - 속성의 공통적인 특징과 기능을 하나의 구조로 묶어서 정의한 것이 **Class** 라고 한다
+    - 예시
+        
+        ```dart
+        class Car {
+          String brand;  // 브랜드 (예: BMW, Tesla)
+          String color;  // 색깔 (예: 빨강, 파랑)
+          int speed;     // 현재 속도
+        
+          // 생성자 (객체를 만들 때 사용)
+          Car(this.brand, this.color, this.speed);
+        
+          // 메서드 (클래스 안에 있는 함수)
+          void accelerate() {
+            speed += 10;
+            print('$brand가 속도를 올려서 $speed km/h가 되었습니다.');
+          }
+        
+          void brake() {
+            speed -= 10;
+            print('$brand가 속도를 줄여서 $speed km/h가 되었습니다.');
+          }
+        }
+        
+        ```
+        
+
+- 클래스(Class) 사용하기
+    - 클래스(Class)는 직접 실행되지 않고, 실제로 사용하려면 객체(Object)를 만들어야 한다
+    - 예시
+        
+        ```dart
+        void main() {
+          // 자동차 객체를 생성
+          Car myCar = Car('Tesla', 'Red', 0);
+        
+          // 객체의 속성 사용하기
+          print('내 차는 ${myCar.color} 색깔의 ${myCar.brand} 입니다.');
+        
+          // 객체의 메서드 호출하기
+          myCar.accelerate();
+          myCar.accelerate();
+          myCar.brake();
+        }
+        
+        ```
+        
+
+- 왜 사용할까?
+    - 코드의 재사용이 가능하다.
+    - 코드를 정리할 수 있다
+    - 현실 세계를 그대로 표현 할 수 있다
+
+### Properties(속성)
+
+- 클래스 안에서 정의된 변수로, 객체의 상태(데이터)를 저장함
+    
+    ```dart
+    class Car {
+      String brand;
+      String color;
+      int speed;
+    }
+    ```
+    
+
+### Methods(메서드)
+
+- 클래스 안에서 정의된 함수로, 객체가 수행할 동작(기능)을 정의
+    
+    ```dart
+    class Car {
+      void accelerate() {
+        print("차가 가속 중!");
+      }
+    
+      void brake() {
+        print("차가 멈춤!");
+      }
+    }
+    ```
+    
+
+### Constructor(생성자)
+
+- 객체를 생성할때 자동으로 호출되는 특별한 메서드로 객체의 속성을 초기화하는 역할을 함.
+    
+    ```dart
+    class Car {
+      String brand;
+      String color;
+      int speed;
+    
+      // 생성자
+      Car(this.brand, this.color, this.speed);
+    }
+    
+    void main() {
+      Car myCar = Car("Tesla", "Red", 0);
+      print(myCar.brand); // Tesla
+    }
+    ```
+    
+
+### Object(객체)
+
+- 클래스를 기반으로 만들어진 실제 데이터. 객체를 생성해야 클래스에 정의된 속성과 메서드를 사용할 수 있음
+    
+    ```dart
+    void main() {
+      Car myCar = Car("BMW", "Blue", 120); // 객체 생성
+      print(myCar.color); // Blue
+      myCar.accelerate(); // "차가 가속 중!" 출력
+    }
+    ```
+    
+
+---
+
+## Instance(인스턴스)
+
+### 개념
+
+- 클래스로부터 만들어진 실제 객체(Object)를 뜻함
+- 클래스를 사용하려면 인스턴스를 생성해야됨
+
+### 인스턴스 생성법
+
+1. 기본
+    
+    ```dart
+    class Car {
+      String brand;
+      String color;
+      int speed;
+    
+      // 생성자
+      Car(this.brand, this.color, this.speed);
+    
+      // 메서드
+      void accelerate() {
+        speed += 10;
+        print('$brand가 속도를 올려서 $speed km/h가 되었습니다.');
+      }
+    }
+    
+    void main() {
+      // Car 클래스로부터 인스턴스 생성
+      Car myCar = Car('Tesla', 'Red', 0);
+    
+      print('내 차 브랜드: ${myCar.brand}');  // Tesla
+      print('내 차 색깔: ${myCar.color}');   // Red
+      print('현재 속도: ${myCar.speed} km/h'); // 0
+    
+      // 인스턴스의 메서드 호출
+      myCar.accelerate(); // Tesla가 속도를 올려서 10 km/h가 되었습니다.
+    }
+    
+    ```
+    
+
+1. 여러개의 인스턴스 생성
+    
+    ```dart
+    void main() {
+      // 여러 개의 인스턴스 생성
+      Car car1 = Car('BMW', 'Blue', 0);
+      Car car2 = Car('Audi', 'Black', 10);
+    
+      // 각 인스턴스의 속성 확인
+      print('${car1.brand}의 색깔은 ${car1.color}, 속도는 ${car1.speed} km/h');
+      print('${car2.brand}의 색깔은 ${car2.color}, 속도는 ${car2.speed} km/h');
+    
+      // 각 인스턴스는 독립적으로 동작
+      car1.accelerate(); // BMW가 속도를 올려서 10 km/h가 되었습니다.
+      car2.accelerate(); // Audi가 속도를 올려서 20 km/h가 되었습니다.
+    }
+    
+    ```
+    
+    ⇒ `car1`과 `car2`는 **서로 다른 인스턴스**이므로, 독립적인 속성을 갖고 따로 동작!
+    
+
+## 인스턴스 변수와 메서드
+
+- 인스턴스를 만들면 클래스에 정의된 변수와 메서드를 그대로 사용할 수 있음
+- 즉, 인스턴스를 통해 클래스의 속성과 기능을 조작 가능
+    
+    ```dart
+    void main() {
+      Car myCar = Car('Toyota', 'White', 0);
+    
+      // 인스턴스 변수 사용
+      print(myCar.brand);  // Toyota
+      print(myCar.color);  // White
+    
+      // 인스턴스 메서드 호출
+      myCar.accelerate();  // Toyota가 속도를 올려서 10 km/h가 되었습니다.
+    }
+    
+    ```
+    
+
+## 인스턴스의 독립성
+
+- 각 인스턴스는 서로 영향을 주지 않는다
+- 즉, `car1`의 속도를 바꿔도 `car2`에는 영향을 주지 않음.
+    
+    ```dart
+    void main() {
+      Car car1 = Car('BMW', 'Red', 0);
+      Car car2 = Car('Audi', 'Black', 0);
+    
+      // 서로 다른 인스턴스에 대해 메서드 호출
+      car1.accelerate(); // BMW 속도 증가
+      car2.accelerate(); // Audi 속도 증가
+    
+      print('${car1.brand}의 속도: ${car1.speed} km/h'); // BMW의 속도: 10 km/h
+      print('${car2.brand}의 속도: ${car2.speed} km/h'); // Audi의 속도: 10 km/h
+    }
+    ```
+    
+
+## 인스턴스 없이 클래스 사용 (정적 변수 & 정적 메서드)
+
+- 클래스 자체를 사용하고 싶을 경우 사용
+- `static` 키워드를 사용하면 ****인스턴스를 만들지 않아도 클래스의 속성과 메서드를 사용할 수 있다.
+    
+    ```dart
+    class MathUtils {
+      static double pi = 3.14159;
+    
+      static double circleArea(double radius) {
+        return pi * radius * radius;
+      }
+    }
+    
+    void main() {
+      // 인스턴스 없이 클래스 자체를 사용
+      print(MathUtils.pi); // 3.14159
+      print(MathUtils.circleArea(10)); // 314.159
+    }
+    ```
\ No newline at end of file
diff --git a/assignments/2025-03-13/cleric_file.dart b/assignments/2025-03-13/cleric_file.dart
new file mode 100644
index 00000000..957f22d7
--- /dev/null
+++ b/assignments/2025-03-13/cleric_file.dart
@@ -0,0 +1,61 @@
+import 'dart:math';
+
+class Cleric{
+
+  // 연습문제 1
+  String name;
+  int ? prayTime;
+  int hp = 50;
+  int mp = 10;
+  final int maxHp = 50; //final 붙이면 상수
+  final int maxMp= 10;
+
+
+
+  //연습문제 2
+  void selfAid(){
+    if(maxHp > hp&& mp >= 5) {
+      mp -= 5;
+      hp = maxHp;
+    }else{
+        if(mp < 5) {
+          print("MP가 부족하여 selfAid를 사용할 수 없습니다");
+        } else {
+          print("이미 HP는 전부 회복 되었습니다");
+        }
+    }
+  }
+
+  //연습문제 3
+  int pray (int prayTime){
+
+    Random random = Random();
+
+    int correctionValue = random.nextInt(3); // 보정치
+
+    print("보정치 $correctionValue");
+
+    int recoveryValue = prayTime + correctionValue;
+
+    print("회복량 $recoveryValue");
+
+    //회복 되는 코드 추가하기
+    if(mp < maxMp){
+      if((mp + recoveryValue <= maxMp) ){
+        print("실제 회복량 ${recoveryValue}");
+
+      }else{
+        print("실제 회복량 ${maxMp - mp}");
+        recoveryValue = maxMp - mp;
+      }
+      mp += recoveryValue; // 회복코드
+      return recoveryValue; // 회복량 리턴 코드
+    }
+
+    return 0;
+
+    //중간 중간에 리턴이 있는 것보다 한번에 리턴하는게 좋음 -> 코드의 맥략을 파악하기 어려워서 그럼
+  }
+
+  Cleric(this.name, {this.prayTime});
+}
\ No newline at end of file
diff --git a/lib/2025-03-13/cleric_file.dart b/lib/2025-03-13/cleric_file.dart
new file mode 100644
index 00000000..957f22d7
--- /dev/null
+++ b/lib/2025-03-13/cleric_file.dart
@@ -0,0 +1,61 @@
+import 'dart:math';
+
+class Cleric{
+
+  // 연습문제 1
+  String name;
+  int ? prayTime;
+  int hp = 50;
+  int mp = 10;
+  final int maxHp = 50; //final 붙이면 상수
+  final int maxMp= 10;
+
+
+
+  //연습문제 2
+  void selfAid(){
+    if(maxHp > hp&& mp >= 5) {
+      mp -= 5;
+      hp = maxHp;
+    }else{
+        if(mp < 5) {
+          print("MP가 부족하여 selfAid를 사용할 수 없습니다");
+        } else {
+          print("이미 HP는 전부 회복 되었습니다");
+        }
+    }
+  }
+
+  //연습문제 3
+  int pray (int prayTime){
+
+    Random random = Random();
+
+    int correctionValue = random.nextInt(3); // 보정치
+
+    print("보정치 $correctionValue");
+
+    int recoveryValue = prayTime + correctionValue;
+
+    print("회복량 $recoveryValue");
+
+    //회복 되는 코드 추가하기
+    if(mp < maxMp){
+      if((mp + recoveryValue <= maxMp) ){
+        print("실제 회복량 ${recoveryValue}");
+
+      }else{
+        print("실제 회복량 ${maxMp - mp}");
+        recoveryValue = maxMp - mp;
+      }
+      mp += recoveryValue; // 회복코드
+      return recoveryValue; // 회복량 리턴 코드
+    }
+
+    return 0;
+
+    //중간 중간에 리턴이 있는 것보다 한번에 리턴하는게 좋음 -> 코드의 맥략을 파악하기 어려워서 그럼
+  }
+
+  Cleric(this.name, {this.prayTime});
+}
\ No newline at end of file
diff --git a/test/2025-03-13/cleric_file_test.dart b/test/2025-03-13/cleric_file_test.dart
new file mode 100644
index 00000000..7599fb9a
--- /dev/null
+++ b/test/2025-03-13/cleric_file_test.dart
@@ -0,0 +1,57 @@
+import 'package:modu_3_dart_study/2025-03-13/cleric_file.dart';
+import 'package:test/test.dart';
+
+void main(){
+  test("Cleric Given Test", () {
+
+    //준비,실행
+    final cleric = Cleric("홍길동");
+
+    //검증
+    expect(cleric, equals(isNotNull));
+    expect(cleric.name, equals("홍길동"));
+    expect(cleric.hp, equals(50));
+    expect(cleric.mp, equals(10));
+    expect(cleric.maxHp, equals(50));
+    expect(cleric.maxMp, equals(10));
+  });
+  
+  test("selfAid Test", (){
+    //준비
+    final cleric = Cleric("홍길동");
+
+    cleric.hp = 15;
+
+    //실행
+    cleric.selfAid();
+
+    expect(cleric.hp, equals(cleric.maxHp));
+    expect(cleric.mp, equals(5));
+
+  });
+
+
+  test('MP 회복 테스트 - 정상적인 회복', () {
+    Cleric cleric = Cleric('TestCleric');
+    cleric.mp = 5;
+    int recoveredMp = cleric.pray(3);
+    expect(cleric.mp, lessThanOrEqualTo(cleric.maxMp));
+    expect(recoveredMp, inInclusiveRange(3, 5));
+  });
+
+  test('MP 회복 테스트 - MP가 이미 최대일 경우', () {
+    Cleric cleric = Cleric('TestCleric');
+    cleric.mp = 10;
+    int recoveredMp = cleric.pray(3);
+    expect(recoveredMp, equals(0));
+    expect(cleric.mp, equals(10));
+  });
+
+  test('MP 회복 테스트 - 회복량이 최대 MP를 초과할 경우', () {
+    Cleric cleric = Cleric('TestCleric');
+    cleric.mp = 9;
+    int recoveredMp = cleric.pray(3);
+    expect(recoveredMp, equals(1));
+    expect(cleric.mp, equals(10));
+  });
+}
\ No newline at end of file


Reviews:
user: login: coderabbitai[bot]
body: **Actionable comments posted: 4**

<details>
<summary>🧹 Nitpick comments (5)</summary><blockquote>

<details>
<summary>test/2025-03-13/cleric_file_test.dart (2)</summary><blockquote>

`19-31`: **selfAid 메서드 호출 전 MP 체크 누락**

`selfAid` 메서드를 호출하기 전에 충분한 MP(5 이상)가 있는지 확인하는 테스트 케이스가 필요합니다. 현재 테스트는 MP가 충분한 경우만 검증하고 있습니다.


다음과 같은 테스트 케이스 추가를 고려해 보세요:

```dart
test("selfAid Test - 충분한 MP가 없는 경우", (){
  //준비
  final cleric = Cleric("홍길동");
  cleric.hp = 15;
  cleric.mp = 3; // MP가 5보다 작음

  //실행
  cleric.selfAid();

  //검증
  expect(cleric.hp, equals(15)); // HP가 변하지 않아야 함
  expect(cleric.mp, equals(3)); // MP도 변하지 않아야 함
});
```

---

`34-40`: **MP 회복 테스트 개선 가능**

현재 테스트는 `mp`가 `maxMp` 이하인지와 회복량이 적절한 범위 내에 있는지 확인하고 있지만, 회복 후 정확한 `mp` 값이 예상대로인지 확인하지 않습니다.


다음과 같이 개선할 수 있습니다:

```diff
  test('MP 회복 테스트 - 정상적인 회복', () {
    Cleric cleric = Cleric('TestCleric');
    cleric.mp = 5;
+   int initialMp = cleric.mp;
    int recoveredMp = cleric.pray(3);
    expect(cleric.mp, lessThanOrEqualTo(cleric.maxMp));
    expect(recoveredMp, inInclusiveRange(3, 5));
+   expect(cleric.mp, equals(initialMp + recoveredMp));
  });
```

</blockquote></details>
<details>
<summary>lib/2025-03-13/cleric_file.dart (1)</summary><blockquote>

`38-49`: **조건문 로직 개선 필요**

현재 구현은 `mp + recoveryValue == maxMp`와 `mp + recoveryValue < maxMp`를 따로 체크하고 있지만, 두 경우 모두 동일한 로직을 수행합니다. 이 조건을 합치면 코드가 더 간결해집니다.


다음과 같이 개선할 수 있습니다:

```diff
if(mp < maxMp){
-  if((mp + recoveryValue == maxMp) || (mp + recoveryValue < maxMp)){
+  if(mp + recoveryValue <= maxMp){
    print("실제 회복량 ${recoveryValue}");
  }else{
    print("실제 회복량 ${maxMp - mp}");
    recoveryValue = maxMp - mp;
  }
  mp += recoveryValue; // 회복코드
  return recoveryValue; // 회복량 리턴 코드
}
```

</blockquote></details>
<details>
<summary>TIL/daily/2025-03-13/2025-03-13.md (2)</summary><blockquote>

`7-11`: **마크다운 리스트 들여쓰기 수정 필요**

마크다운 문법상 리스트 들여쓰기는 일반적으로 2칸을 사용합니다. 현재 4칸을 사용하고 있어 일부 마크다운 렌더러에서는 제대로 표시되지 않을 수 있습니다.


다음과 같이 수정하세요:
```diff
- - 클래스(Class)란?
-     - 객체(Object)를 만들기 위한 설계도
-     - 속성의 공통적인 특징과 기능을 하나의 구조로 묶어서 정의한 것이 **Class** 라고 한다
-     - 예시
+ - 클래스(Class)란?
+   - 객체(Object)를 만들기 위한 설계도
+   - 속성의 공통적인 특징과 기능을 하나의 구조로 묶어서 정의한 것이 **Class** 라고 한다
+   - 예시
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

8-8: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

9-9: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

10-10: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

</details>

</details>

---

`57-61`: **마크다운 리스트 들여쓰기 수정 필요**

여기서도 리스트 들여쓰기 문제가 있습니다. 마크다운 문법에 맞게 수정이 필요합니다.


다음과 같이 수정하세요:
```diff
- - 왜 사용할까?
-     - 코드의 재사용이 가능하다.
-     - 코드를 정리할 수 있다
-     - 현실 세계를 그대로 표현 할 수 있다
+ - 왜 사용할까?
+   - 코드의 재사용이 가능하다.
+   - 코드를 정리할 수 있다
+   - 현실 세계를 그대로 표현 할 수 있다
```

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

58-58: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

59-59: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

60-60: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 2347357ac12ed0e62d67e6fcb88e66ad7d57ef41 and 7c51557d07156b8b7cf31eed005d266285b2be7e.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `TIL/daily/2025-03-13/2025-03-13.md` (1 hunks)
* `assignments/2025-03-13/cleric_file.dart` (1 hunks)
* `lib/2025-03-13/cleric_file.dart` (1 hunks)
* `test/2025-03-13/cleric_file_test.dart` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

<details>
<summary>TIL/daily/2025-03-13/2025-03-13.md</summary>

8-8: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

9-9: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

10-10: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

37-37: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

38-38: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

58-58: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

59-59: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

60-60: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (8)</summary><blockquote>

<details>
<summary>test/2025-03-13/cleric_file_test.dart (1)</summary>

`1-3`: <details>
<summary>❓ Verification inconclusive</summary>

**import 경로 확인이 필요합니다.**

테스트 파일이 `package:modu_3_dart_study/2025-03-13/cleric_file.dart`를 가져오고 있는데, 실제 구현이 `assignments/2025-03-13/cleric_file.dart`와 `lib/2025-03-13/cleric_file.dart` 두 곳에 있습니다. 테스트가 올바른 구현을 가리키고 있는지 확인해 주세요.

---

🏁 Script executed:

```shell
#!/bin/bash
# 프로젝트 구조와 import 경로 확인
ls -la lib/2025-03-13/
ls -la assignments/2025-03-13/
cat pubspec.yaml | grep -A 10 dependencies
```

Length of output: 571

---



</details>

**테스트 파일의 import 경로가 올바른 구현 파일을 참조하는지 재확인해 주세요.**

현재 테스트는  
```dart
import 'package:modu_3_dart_study/2025-03-13/cleric_file.dart';
```
를 사용하고 있으며, Dart의 패키지 import 규칙에 따라 이는 기본적으로 **lib/2025-03-13/cleric_file.dart** 파일을 참조합니다.  
그러나 리포지토리 내에 **assignments/2025-03-13/cleric_file.dart** 파일도 존재하는 상황입니다.  
아래 사항을 확인해 주시기 바랍니다:

- **lib/2025-03-13/cleric_file.dart** (1233 bytes) 파일이 의도한 구현 파일인지 확인  
- 만약 **assignments/2025-03-13/cleric_file.dart** 파일을 테스트 대상에 포함해야 한다면, import 경로를 상대 경로 등으로 조정 필요

</details>
<details>
<summary>assignments/2025-03-13/cleric_file.dart (1)</summary>

`54-55`: **생성자와 prayTime 변수의 활용 개선**

`prayTime` 필드는 선언되어 있지만 실제로는 클래스 내 어디에서도 사용되지 않고 있습니다. 또한 생성자에서 선택적 매개변수로 받고 있지만 초기화 이후 활용되지 않습니다.


`prayTime` 필드의 목적을 명확히 하고, 실제로 필요한지 검토해 보세요. 사용하지 않는 필드는 제거하거나, 목적이 있다면 해당 필드를 활용하는 코드를 추가하는 것이 좋습니다.

</details>
<details>
<summary>lib/2025-03-13/cleric_file.dart (2)</summary>

`53-53`: **코드 주석의 좋은 사례**

이 주석은 코드 구조에 대한 매우 좋은 조언을 제공합니다. 여러 곳에서 반환하는 것보다 한 번에 반환하는 것이 코드의 흐름을 파악하기 쉽게 만들어 줍니다.


이 조언을 pray 메서드에 적용하면 더 읽기 쉬운 코드가 될 것입니다. 아래는 이 조언을 적용한 예시입니다:

```dart
int pray(int prayTime) {
  Random random = Random();
  int correctionValue = random.nextInt(3);
  print("보정치 $correctionValue");
  
  int recoveryValue = prayTime + correctionValue;
  print("회복량 $recoveryValue");
  
  int actualRecovery = 0;
  
  if (mp < maxMp) {
    if (mp + recoveryValue <= maxMp) {
      actualRecovery = recoveryValue;
    } else {
      actualRecovery = maxMp - mp;
    }
    mp += actualRecovery;
  }
  
  print("실제 회복량 $actualRecovery");
  return actualRecovery;
}
```

---

`56-57`: **생성자와 prayTime 변수의 활용 개선**

`prayTime` 필드는 선언되어 있지만 실제로는 클래스 내 어디에서도 사용되지 않고 있습니다. 또한 생성자에서 선택적 매개변수로 받고 있지만 초기화 이후 활용되지 않습니다.


`prayTime` 필드의 목적을 명확히 하고, 실제로 필요한지 검토해 보세요. 사용하지 않는 필드는 제거하거나, 목적이 있다면 해당 필드를 활용하는 코드를 추가하는 것이 좋습니다.

</details>
<details>
<summary>TIL/daily/2025-03-13/2025-03-13.md (4)</summary>

`1-4`: **문서 제목과 구조**

문서의 제목과 초기 구조가 잘 설정되어 있습니다. Dart 클래스의 개념과 관련 개념을 정리하겠다는 목표가 명확히 드러납니다.

---

`12-35`: **코드 예제의 명확성**

`Car` 클래스 예제가 클래스의 구성 요소를 이해하는 데 매우 유용합니다. 속성, 생성자, 메서드를 모두 포함하고 있어 초보자도 쉽게 이해할 수 있습니다.

---

`40-54`: **코드 예제와 설명의 연계성**

클래스를 사용하는 예제와 설명이 자연스럽게 이어지고 있습니다. 객체 생성 방법과 속성 및 메서드 호출 방법이 명확히 제시되어 있습니다.

---

`232-251`: **정적 변수와 메서드에 대한 명확한 설명**

정적 변수와 메서드에 대한 설명과 예제가 매우 명확합니다. `static` 키워드의 사용과 인스턴스 없이 클래스 자체를 사용하는 방법을 잘 설명했습니다.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: CHANGES_REQUESTED
author_association: NONE
submitted_at: 2025-03-13T09:04:26Z
user: login: coderabbitai[bot]
state: APPROVED
author_association: NONE
submitted_at: 2025-03-13T11:22:09Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>assignments/2025-03-13/cleric_file.dart (1)</summary><blockquote>

`1-12`: **기본 구조와 속성 선언이 잘 되어 있습니다**

클래스 속성들이 요구사항에 맞게 잘 정의되었습니다. final 키워드를 사용하여 maxHp와 maxMp를 상수로 적절히 선언하셨습니다. 하지만 몇 가지 개선 사항이 있습니다:

1. `prayTime` 속성이 클래스 레벨에 정의되어 있는데, 이 속성이 정확히 어떤 목적으로 사용되는지 명확하지 않습니다. 주석을 추가하거나 이름을 더 명확하게 변경하는 것이 좋을 것 같습니다.

2. 속성들에 대한 간단한 주석을 추가하여 코드 가독성을 높이는 것이 좋습니다.

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Lite**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between a73bd1e96a81547046eab85a0f0b37d091bbb59f and 13a32eeeb3c3b0acfc527a69fc8d9e3ec26b74aa.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `assignments/2025-03-13/cleric_file.dart` (1 hunks)

</details>

<details>
<summary>🔇 Additional comments (3)</summary><blockquote>

<details>
<summary>assignments/2025-03-13/cleric_file.dart (3)</summary>

`16-27`: **selfAid 메서드가 이전 리뷰 의견을 반영하여 개선되었습니다**

MP가 충분한지 확인하는 로직이 추가되어 좋습니다. 조건문 분기가 잘 처리되어 있습니다.

---

`30-58`: **pray 메서드의 조건문을 간소화할 수 있습니다**

현재 pray 메서드의 조건문 구조가 다소 복잡합니다. 특히 44번 라인의 조건문을 간소화할 수 있습니다. 또한, 57번 라인의 주석에서 언급된 것처럼 여러 개의 return 문보다는 하나의 return 문을 사용하는 것이 코드 가독성에 도움이 됩니다.

다음과 같이 개선할 수 있습니다:


```diff
int pray (int prayTime){
  Random random = Random();
  int correctionValue = random.nextInt(3); // 보정치
  print("보정치 $correctionValue");
  int recoveryValue = prayTime + correctionValue;
  print("회복량 $recoveryValue");

+  // 리턴할 실제 회복량
+  int actualRecovery = 0;

  if(mp < maxMp){
-    if((mp + recoveryValue == maxMp) || (mp + recoveryValue < maxMp)){
-      print("실제 회복량 ${recoveryValue}");
-
-    }else{
+    if(mp + recoveryValue > maxMp){
      print("실제 회복량 ${maxMp - mp}");
-      recoveryValue = maxMp - mp;
+      actualRecovery = maxMp - mp;
+    } else {
+      print("실제 회복량 ${recoveryValue}");
+      actualRecovery = recoveryValue;
    }
    mp += recoveryValue; // 회복코드
-    return recoveryValue; // 회복량 리턴 코드
+    mp = mp > maxMp ? maxMp : mp; // MP가 최대값을 초과하지 않도록 확인
+    actualRecovery = recoveryValue;
  }

-  return 0;
+  return actualRecovery;

  //중간 중간에 리턴이 있는 것보다 한번에 리턴하는게 좋음 -> 코드의 맥략을 파악하기 어려워서 그럼
}
```

또한, `pray` 메서드의 매개변수 이름 `prayTime`이 클래스 속성 `prayTime`과 동일하여 혼란을 줄 수 있습니다. 다른 이름(예: `duration`)을 사용하는 것이 좋습니다.

---

`60-61`: **생성자가 간결하게 정의되어 있습니다**

생성자가 간결하게 정의되어 있으며 필요한 파라미터를 받고 있습니다. 하지만 기본값이나 초기화 로직을 추가하는 것을 고려해 볼 수 있습니다.


```diff
-  Cleric(this.name, {this.prayTime});
+  Cleric(this.name, {this.prayTime}) {
+    // 필요한 경우 추가 초기화 로직을 여기에 추가
+  }
```

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-13T11:33:32Z
user: login: intelliM
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-13T23:42:56Z
user: login: YunFlutter
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-13T23:46:26Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 0**

<details>
<summary>🧹 Nitpick comments (2)</summary><blockquote>

<details>
<summary>assignments/2025-03-13/cleric_file.dart (1)</summary><blockquote>

`30-58`: **pray 메서드에 조건식을 개선할 수 있습니다.**

pray 메서드의 조건식을 간소화하여 가독성을 높일 수 있습니다.


다음과 같이 코드를 수정하세요:

```diff
-      if((mp + recoveryValue == maxMp) || (mp + recoveryValue < maxMp)){
+      if(mp + recoveryValue <= maxMp){
```

또한, 주석에서 언급한 것처럼 여러 return 문보다 하나의 return 문을 사용하는 방식을 고려해보세요. 코드의 맥락을 파악하기 쉬워집니다.

</blockquote></details>
<details>
<summary>TIL/daily/2025-03-13/2025-03-13.md (1)</summary><blockquote>

`1-251`: **클래스 개념에 대한 문서가 잘 작성되었습니다.**

Dart 언어의 클래스 개념과 관련 구성 요소들에 대한 설명이 체계적이고 명확합니다. 클래스, 속성, 메서드, 생성자, 객체, 인스턴스 등의 개념을 구체적인 코드 예제와 함께 설명하여 이해하기 쉽습니다.


마크다운 형식에서 몇 가지 사소한 들여쓰기 문제가 있습니다. 정적 분석 도구에서 지적한 대로 순서 없는 목록(unordered list)의 들여쓰기가 4 스페이스로 되어 있는데, 표준은 2 스페이스입니다. 필요에 따라 수정하실 수 있습니다.

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

8-8: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

9-9: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

10-10: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

37-37: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

38-38: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

58-58: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

59-59: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

60-60: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

</details>

</details>

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 2347357ac12ed0e62d67e6fcb88e66ad7d57ef41 and 6e233edca522b0c3d5ca3b5ea7372b4b897b2981.

</details>

<details>
<summary>📒 Files selected for processing (4)</summary>

* `TIL/daily/2025-03-13/2025-03-13.md` (1 hunks)
* `assignments/2025-03-13/cleric_file.dart` (1 hunks)
* `lib/2025-03-13/cleric_file.dart` (1 hunks)
* `test/2025-03-13/cleric_file_test.dart` (1 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.17.2)</summary>

<details>
<summary>TIL/daily/2025-03-13/2025-03-13.md</summary>

8-8: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

9-9: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

10-10: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

37-37: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

38-38: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

58-58: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

59-59: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

---

60-60: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)

</details>

</details>

</details>

<details>
<summary>🔇 Additional comments (13)</summary><blockquote>

<details>
<summary>test/2025-03-13/cleric_file_test.dart (6)</summary>

`1-3`: **import 구문이 올바르게 작성되었습니다.**

필요한 패키지와 클래스를 정확하게 가져오고 있습니다.

---

`4-17`: **Cleric 클래스 초기화 테스트가 잘 구현되었습니다.**

"Cleric Given Test"에서는 Cleric 인스턴스의 생성과 기본 속성들(name, hp, mp, maxHp, maxMp)이 올바르게 초기화되는지 검증하고 있습니다. 테스트 구조와 검증 방식이 명확합니다.

---

`19-31`: **selfAid 메서드 테스트가 잘 구현되었습니다.**

selfAid 메서드 호출 후 HP가 최대값으로 회복되고 MP가 5 감소했는지 정확하게 검증하고 있습니다.

---

`34-40`: **MP 회복 정상 테스트 케이스가 적절합니다.**

MP가 5일 때 pray(3)을 호출하면, 회복량이 3에서 5 사이가 되는지, 그리고 최종 MP가 최대값을 초과하지 않는지 검증하고 있습니다. MP 회복 로직을 정확하게 테스트하고 있습니다.

---

`42-48`: **MP가 이미 최대일 경우의 테스트 케이스가 정확합니다.**

MP가 이미 최대값(10)일 때 pray(3)을 호출하면 회복량이 0이 되는지, 그리고 MP가 여전히 10인지 검증하고 있습니다. 경계 조건을 적절하게 테스트하고 있습니다.

---

`50-56`: **MP 회복량이 최대 MP를 초과할 경우의 테스트가 개선되었습니다.**

이전 리뷰에서 지적된 문제(recoveredMp가 1 이하인지가 아니라 정확히 1과 같은지 확인해야 함)가 수정되었습니다. 이제 MP가 9일 때 pray(3)을 호출하면 회복량이 정확히 1이 되는지 검증하고 있어 정확합니다.

</details>
<details>
<summary>assignments/2025-03-13/cleric_file.dart (3)</summary>

`1-12`: **클래스 속성 선언이 적절합니다.**

Cleric 클래스의 속성들(name, prayTime, hp, mp, maxHp, maxMp)이 요구사항에 맞게 잘 선언되어 있습니다. maxHp와 maxMp는 final로 선언되어 상수로 적절하게 처리되었습니다.

---

`16-27`: **selfAid 메서드가 개선되었습니다.**

이전 리뷰에서 지적된 MP 체크 로직이 추가되어 MP가 부족한 경우를 적절하게 처리하고 있습니다. 현재 구현은 HP 회복이 필요한지와 MP가 충분한지를 모두 확인하여 안정적으로 동작합니다.

---

`60-60`: **생성자가 적절하게 구현되었습니다.**

name을 필수 매개변수로, prayTime을 선택적 매개변수로 받는 생성자가 잘 구현되어 있습니다.

</details>
<details>
<summary>lib/2025-03-13/cleric_file.dart (4)</summary>

`1-12`: **클래스 속성 선언이 적절합니다.**

Cleric 클래스의 속성들(name, prayTime, hp, mp, maxHp, maxMp)이 요구사항에 맞게 잘 선언되어 있습니다. maxHp와 maxMp는 final로 선언되어 상수로 적절하게 처리되었습니다.

---

`16-27`: **selfAid 메서드가 개선되었습니다.**

이전 리뷰에서 지적된 MP 체크 로직이 추가되어 MP가 부족한 경우를 적절하게 처리하고 있습니다. 현재 구현은 HP 회복이 필요한지와 MP가 충분한지를 모두 확인하여 안정적으로 동작합니다.

---

`30-58`: **pray 메서드가 개선되었습니다.**

이전 리뷰에서 제안된 대로 조건식이 `mp + recoveryValue <= maxMp`로 간소화되어 가독성이 향상되었습니다. 또한, 회복량에 대한 계산과 반환 로직이 명확합니다.


코드 마지막에 언급된 것처럼, 중간중간에 return보다 한 번에 return하는 것이 코드의 맥락을 파악하기 쉽게 만듭니다. 이 점을 고려하여 코드를 리팩토링할 수 있습니다.

---

`60-60`: **생성자가 적절하게 구현되었습니다.**

name을 필수 매개변수로, prayTime을 선택적 매개변수로 받는 생성자가 잘 구현되어 있습니다.

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-13T23:49:32Z

Review comments:
diff_hunk: @@ -0,0 +1,57 @@
+import 'package:modu_3_dart_study/2025-03-13/cleric_file.dart';
+import 'package:test/test.dart';
+
+void main(){
+  test("Cleric Given Test", () {
+
+    //준비,실행
+    final cleric = Cleric("홍길동");
+
+    //검증
+    expect(cleric, equals(isNotNull));
+    expect(cleric.name, equals("홍길동"));
+    expect(cleric.hp, equals(50));
+    expect(cleric.mp, equals(10));
+    expect(cleric.maxHp, equals(50));
+    expect(cleric.maxMp, equals(10));
+  });
+  
+  test("selfAid Test", (){
+    //준비
+    final cleric = Cleric("홍길동");
+
+    cleric.hp = 15;
+
+    //실행
+    cleric.selfAid();
+
+    expect(cleric.hp, equals(cleric.maxHp));
+    expect(cleric.mp, equals(5));
+
+  });
+
+
+  test('MP 회복 테스트 - 정상적인 회복', () {
+    Cleric cleric = Cleric('TestCleric');
+    cleric.mp = 5;
+    int recoveredMp = cleric.pray(3);
+    expect(cleric.mp, lessThanOrEqualTo(cleric.maxMp));
+    expect(recoveredMp, inInclusiveRange(3, 5));
+  });
+
+  test('MP 회복 테스트 - MP가 이미 최대일 경우', () {
+    Cleric cleric = Cleric('TestCleric');
+    cleric.mp = 10;
+    int recoveredMp = cleric.pray(3);
+    expect(recoveredMp, equals(0));
+    expect(cleric.mp, equals(10));
+  });
+
+  test('MP 회복 테스트 - 회복량이 최대 MP를 초과할 경우', () {
+    Cleric cleric = Cleric('TestCleric');
+    cleric.mp = 9;
+    int recoveredMp = cleric.pray(3);
+    expect(recoveredMp, lessThanOrEqualTo(1));
+    expect(cleric.mp, equals(10));
+  });
path: test/2025-03-13/cleric_file_test.dart
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**회복량 테스트의 기댓값 범위가 올바르지 않습니다.**

현재 테스트는 `recoveredMp`가 1 이하(`lessThanOrEqualTo(1)`)인지 확인하고 있지만, 실제로는 최대 MP(10)에서 현재 MP(9)를 뺀 값인 1만 가능합니다.


다음과 같이 수정하세요:

```diff
  test('MP 회복 테스트 - 회복량이 최대 MP를 초과할 경우', () {
    Cleric cleric = Cleric('TestCleric');
    cleric.mp = 9;
    int recoveredMp = cleric.pray(3);
-   expect(recoveredMp, lessThanOrEqualTo(1));
+   expect(recoveredMp, equals(1));
    expect(cleric.mp, equals(10));
  });
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
  test('MP 회복 테스트 - 회복량이 최대 MP를 초과할 경우', () {
    Cleric cleric = Cleric('TestCleric');
    cleric.mp = 9;
    int recoveredMp = cleric.pray(3);
    expect(recoveredMp, equals(1));
    expect(cleric.mp, equals(10));
  });
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-13T09:04:25Z
author_association: NONE
diff_hunk: @@ -0,0 +1,55 @@
+import 'dart:math';
+
+class Cleric{
+
+  // 연습문제 1
+  String name;
+  int ? prayTime;
+  int hp = 50;
+  int mp = 10;
+  final int maxHp = 50; //final 붙이면 상수
+  final int maxMp= 10;
+
+
+
+  //연습문제 2
+  void selfAid(){
+    if(maxHp > hp) {
+      mp -= 5;
+      hp = maxHp;
+    }else{
+      print("이미 HP는 전부 회복 되었습니다");
+    }
+  }
path: assignments/2025-03-13/cleric_file.dart
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**selfAid 메서드에 MP 체크 로직 추가 필요**

현재 구현된 `selfAid` 메서드는 MP가 충분한지(5 이상인지) 확인하지 않고 HP 회복을 시도합니다. MP가 부족한 경우에 대한 처리가 필요합니다.


다음과 같이 개선할 수 있습니다:

```diff
void selfAid(){
-  if(maxHp > hp) {
+  if(maxHp > hp && mp >= 5) {
    mp -= 5;
    hp = maxHp;
  }else{
-    print("이미 HP는 전부 회복 되었습니다");
+    if(mp < 5) {
+      print("MP가 부족하여 selfAid를 사용할 수 없습니다");
+    } else {
+      print("이미 HP는 전부 회복 되었습니다");
+    }
  }
}
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
  void selfAid(){
    if(maxHp > hp && mp >= 5) {
      mp -= 5;
      hp = maxHp;
    } else {
      if(mp < 5) {
        print("MP가 부족하여 selfAid를 사용할 수 없습니다");
      } else {
        print("이미 HP는 전부 회복 되었습니다");
      }
    }
  }
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-13T09:04:25Z
author_association: NONE
diff_hunk: @@ -0,0 +1,55 @@
+import 'dart:math';
+
+class Cleric{
+
+  // 연습문제 1
+  String name;
+  int ? prayTime;
+  int hp = 50;
+  int mp = 10;
+  final int maxHp = 50; //final 붙이면 상수
+  final int maxMp= 10;
+
+
+
+  //연습문제 2
+  void selfAid(){
+    if(maxHp > hp) {
+      mp -= 5;
+      hp = maxHp;
+    }else{
+      print("이미 HP는 전부 회복 되었습니다");
+    }
+  }
+
+  //연습문제 3
+  int pray (int prayTime){
+
+    Random random = Random();
+
+    int correctionValue = random.nextInt(3); // 보정치
+
+    print("보정치 $correctionValue");
+
+    int recoveryValue = prayTime + correctionValue;
+
+    print("회복량 $recoveryValue");
+
+    if(mp < maxMp){
+      if(mp + recoveryValue == maxMp){
+        print("실제 회복량 ${recoveryValue}");
+        return recoveryValue;
+      }else if(mp + recoveryValue < maxMp){
+        print("실제 회복량 ${recoveryValue}");
+        return recoveryValue;
+      }else{
+        print("실제 회복량 ${maxMp - mp}");
+        return maxMp - mp;
+
+      }
+    }
+    return 0;
+  }
path: assignments/2025-03-13/cleric_file.dart
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**pray 메서드의 중복 조건문 간소화 필요**

현재 구현된 `pray` 메서드에는 중복되는 조건문과 반환문이 있어 코드가 복잡해 보입니다. 특히 `mp + recoveryValue == maxMp`와 `mp + recoveryValue < maxMp`의 경우 동일한 로직을 수행합니다.


다음과 같이 코드를 간소화할 수 있습니다:

```diff
int pray (int prayTime){
  Random random = Random();
  int correctionValue = random.nextInt(3); // 보정치
  print("보정치 $correctionValue");
  int recoveryValue = prayTime + correctionValue;
  print("회복량 $recoveryValue");

  if(mp < maxMp){
-    if(mp + recoveryValue == maxMp){
-      print("실제 회복량 ${recoveryValue}");
-      return recoveryValue;
-    }else if(mp + recoveryValue < maxMp){
-      print("실제 회복량 ${recoveryValue}");
-      return recoveryValue;
-    }else{
+    if(mp + recoveryValue > maxMp){
      print("실제 회복량 ${maxMp - mp}");
      return maxMp - mp;
+    } else {
+      print("실제 회복량 ${recoveryValue}");
+      mp += recoveryValue; // MP 회복 코드 추가
+      return recoveryValue;
    }
  }
  return 0;
}
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
  int pray (int prayTime){

    Random random = Random();

    int correctionValue = random.nextInt(3); // 보정치

    print("보정치 $correctionValue");

    int recoveryValue = prayTime + correctionValue;

    print("회복량 $recoveryValue");

    if(mp < maxMp){
      if(mp + recoveryValue > maxMp){
        print("실제 회복량 ${maxMp - mp}");
        return maxMp - mp;
      } else {
        print("실제 회복량 ${recoveryValue}");
        mp += recoveryValue; // MP 회복 코드 추가
        return recoveryValue;
      }
    }
    return 0;
  }
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-03-13T09:04:25Z
author_association: NONE
diff_hunk: @@ -0,0 +1,57 @@
+import 'dart:math';
+
+class Cleric{
+
+  // 연습문제 1
+  String name;
+  int ? prayTime;
+  int hp = 50;
+  int mp = 10;
+  final int maxHp = 50; //final 붙이면 상수
+  final int maxMp= 10;
+
+
+
+  //연습문제 2
+  void selfAid(){
+    if(maxHp > hp) {
+      mp -= 5;
+      hp = maxHp;
+    }else{
+      print("이미 HP는 전부 회복 되었습니다");
+    }
+  }
path: lib/2025-03-13/cleric_file.dart
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**selfAid 메서드에 MP 체크 로직 추가 필요**

현재 구현된 `selfAid` 메서드는 MP가 충분한지(5 이상인지) 확인하지 않고 HP 회복을 시도합니다. MP가 부족한 경우에 대한 처리가 필요합니다.


다음과 같이 개선할 수 있습니다:

```diff
void selfAid(){
-  if(maxHp > hp) {
+  if(maxHp > hp && mp >= 5) {
    mp -= 5;
    hp = maxHp;
  }else{
-    print("이미 HP는 전부 회복 되었습니다");
+    if(mp < 5) {
+      print("MP가 부족하여 selfAid를 사용할 수 없습니다");
+    } else {
+      print("이미 HP는 전부 회복 되었습니다");
+    }
  }
}
```


<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

`````suggestion
  void selfAid(){
    if(maxHp > hp && mp >= 5) {
      mp -= 5;
      hp = maxHp;
    }else{
      if(mp < 5) {
        print("MP가 부족하여 selfAid를 사용할 수 없습니다");
      } else {
        print("이미 HP는 전부 회복 되었습니다");
      }
    }
  }
`````

</details>

<!-- suggestion_end -->

<!-- This is an auto-generated comment by CodeRabbit -->

✅ Fixed in commit a73bd1e
created_at: 2025-03-13T09:04:25Z
author_association: NONE
diff_hunk: @@ -0,0 +1,61 @@
+import 'dart:math';
+
+class Cleric{
+
+  // 연습문제 1
+  String name;
+  int ? prayTime;
+  int hp = 50;
+  int mp = 10;
+  final int maxHp = 50; //final 붙이면 상수
+  final int maxMp= 10;
+
+
+
+  //연습문제 2
+  void selfAid(){
+    if(maxHp > hp&& mp >= 5) {
+      mp -= 5;
+      hp = maxHp;
+    }else{
+        if(mp < 5) {
+          print("MP가 부족하여 selfAid를 사용할 수 없습니다");
+        } else {
+          print("이미 HP는 전부 회복 되었습니다");
+        }
+    }
+  }
+
+  //연습문제 3
+  int pray (int prayTime){
+
+    Random random = Random();
+
+    int correctionValue = random.nextInt(3); // 보정치
+
+    print("보정치 $correctionValue");
+
+    int recoveryValue = prayTime + correctionValue;
+
+    print("회복량 $recoveryValue");
+
+    //회복 되는 코드 추가하기
+    if(mp < maxMp){
+      if((mp + recoveryValue == maxMp) || (mp + recoveryValue < maxMp)){
path: assignments/2025-03-13/cleric_file.dart
user: login: intelliM
body: if (mp + recoveryValue <= maxMp)  는 어떤가요?
created_at: 2025-03-13T23:42:56Z
author_association: NONE
diff_hunk: @@ -0,0 +1,61 @@
+import 'dart:math';
+
+class Cleric{
+
+  // 연습문제 1
+  String name;
+  int ? prayTime;
+  int hp = 50;
+  int mp = 10;
+  final int maxHp = 50; //final 붙이면 상수
+  final int maxMp= 10;
+
+
+
+  //연습문제 2
+  void selfAid(){
+    if(maxHp > hp&& mp >= 5) {
+      mp -= 5;
+      hp = maxHp;
+    }else{
+        if(mp < 5) {
+          print("MP가 부족하여 selfAid를 사용할 수 없습니다");
+        } else {
+          print("이미 HP는 전부 회복 되었습니다");
+        }
+    }
+  }
+
+  //연습문제 3
+  int pray (int prayTime){
+
+    Random random = Random();
+
+    int correctionValue = random.nextInt(3); // 보정치
+
+    print("보정치 $correctionValue");
+
+    int recoveryValue = prayTime + correctionValue;
+
+    print("회복량 $recoveryValue");
+
+    //회복 되는 코드 추가하기
+    if(mp < maxMp){
+      if((mp + recoveryValue == maxMp) || (mp + recoveryValue < maxMp)){
path: assignments/2025-03-13/cleric_file.dart
user: login: YunFlutter
body: 코드가 더 간결해질거 같네요! 조언 감사합니다! 수정했습니다
created_at: 2025-03-13T23:46:26Z
author_association: NONE

PR comments:
user: login: coderabbitai[bot]
created_at: 2025-03-13T09:04:22Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough
이 PR은 Dart 프로그래밍 언어의 클래스 개념을 설명하는 문서와 Cleric 클래스를 구현하는 두 개의 Dart 파일, 그리고 해당 클래스의 기능을 검증하는 단위 테스트 파일을 추가합니다. 문서 파일은 클래스의 정의, 속성, 메서드, 생성자 등의 기본 개념과 예제를 다루며, Cleric 클래스 파일들은 이름, hp, mp 등의 속성과 selfAid, pray 메서드를 구현합니다. 테스트 파일은 Cleric 클래스 인스턴스 생성 및 기능 동작을 확인하는 단위 테스트를 포함합니다.

## Changes

| 파일 경로 | 변경 내용 |
| --- | --- |
| `TIL/daily/.../2025-03-13.md` | Dart 클래스 개념에 대한 가이드 문서 추가. 클래스의 정의, 속성, 메서드, 생성자 및 객체 사용 예제 기술. |
| `assignments/2025-03-13/cleric_file.dart`<br>`lib/2025-03-13/cleric_file.dart` | Cleric 클래스 구현 파일 추가. 이름, prayTime, hp, mp, maxHp, maxMp 등의 속성 및 selfAid, pray 메서드와 생성자 구현. |
| `test/2025-03-13/cleric_file_test.dart` | Cleric 클래스의 인스턴스 생성, selfAid 및 pray 메서드 기능을 검증하는 단위 테스트 추가. |

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Lite**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 6e233edca522b0c3d5ca3b5ea7372b4b897b2981 and 9c19d69319ed77261bc080a303fd39087ef1ac0f.

</details>

<details>
<summary>📒 Files selected for processing (1)</summary>

* `assignments/2025-03-13/cleric_file.dart` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (1)</summary>

* assignments/2025-03-13/cleric_file.dart

</details>

</details>
<!-- internal state start -->


<!-- DwQgtGAEAqAWCWBnSTIEMB26CuAXA9mAOYCmGJATmriQCaQDG+Ats2bgFyQAOFk+AIwBWJBrngA3EsgEBPRvlqU0AgfFwA6NPEgQAfACgjoCEYDEZyAAUASpADK2VmgqyjcEj2wAbb5AokAI7Y0riQ4rjedJAARABMAKwADADMAIwpAPppaZmALuOAJOOAOIMxkADuaMiI2ALM6jT0cuGwntiIlJAAmtgYAGLeeDR8mPSo8EoY4gBm8NGVkBhOAh0AnGn8WADi6gASNRowLdZ2U/gMbdIb6JAAIi5hDN6VyM/wRBhsk/4kTw3h+M1PEwMAwSNwwvgpownoh2sh4Fg7hQwrx8EQqKwEUQNO4jvBmNwop9cNR4PgsMDEEhcMhIc0Ap4SAAPSgMJDSDhGNIHABUPIAoiyKGz2pA0nyUBgJPhvFJkAwAqSMERro9ngs0Gx6AADADCUQo8AY2vK6lgPAo+G4lHEl1OfAwmpIABpIDsrJAABQtNDeXDm7j4BE0gCUruYaCZ+KcbqsroAsh7PRGiEaeEHJogw+gMPQI1HmDHEwcPJL1PBfZAJL6Qi8ApB2mECJBkpB7bGc3nI9HmLHXSMxUk2/g+InO5B8z3IMXDp5J4Xe+7x/Oix6XJ4lGqAvR5pSSV8Zj9aIgcQY4ryBUKRZ44hK0LRj9c2P7FP9AZA9QajSa1bDmtR0F8fAymQf0gVgFw0DEDpmwua5EGtXxGF9KJ6BiewfihABBcZnVKMoEAYc1KScS4EmnD1mwCRACHrJdm3UZAV17asBhdC18AkcZon9ACwMYbAKACL4l1QKI/14rB+OY2NTxSC9BVZdlIBSCVg0tWhsFBF4JxIF96AYFDom1Xg0FkbVXQIo1zWo2jLjHARKmicl300qhxBculTNkSgSyOTV8B6MJbJHaJUCUIY6nIRp5DQfwRhYdBaCENpcGJfgoSHZs4nTYNEFdMhqkNZV/ybI4CBJPxaHwS4MHwMJmVBHijhk91T1LfFCRIYlSRciLtG8eEQQGJRIDaLFrioXNEufWBX2bJQZnId8AiYKRXHQZhAq+AdCsEibeLKzxVs4yh5Gq2r6sgRqSGauduwXSBvHxRi/M8WxAMQAEEUebAlHhFNLiULaMBo9yDqOZlRDwMksGonwaQy99OqJdhoimEhqEE6R2v8vA5r4AIpiiMRaSko4iKM5U7Sg6I3IhzxXneYkCqZXhpCpEq4v++B6wYglLSkQFebG3NKBokYJrpCMwJlo1K19IgRzNZgXlzBQQTBGk3tiwaAUDUU4uCUJYe+IgXFoBnIEtqYMeE0FIGWXAylurBq0NFRxPHPdMG18xLF1FhiWQRxnFcXEgSD9gyffD6fpGxnvi4kgyjbS1e34i4+G6PoBlwIZx0wHACBl6JqMDUHPCmdP30DpQbBUNQwgEeqDhz/pBg6AJjZouY2x8PwAmT1O6X42xLMI80KheBgAGs6rKVDSBi98W80COk9mVPUS4pQV/4tfIAQIhYGek/EfadbKwN8shcqa1SaR/jP0ob9oXVFHuvYXqMFdeO/qxJyAwUAsLlB+N4MAYMtK4GxgZGEyAebvFNP6aEmMKDeHOiQJa0RUTWmRLMNWeY9JzWPDiKAHVhrjU8lCNA3BcEexoOEUIyE4RvlYuMagnh3ZkjaA2UEjpDT4BPMAyA/JbaiHEELOCo8jjaiWr6E0s8SCyDKCOeg7ZFoIgmj7TMZDICbHwK+GGz0ABeP8n6yIbtNZgP54HDj4KQcg4MSpTWqixGsOMjA7GAiQdarp+JDy3p9fWGZEaBTCJfZQfh1zzHbJ1QWX9JhAO5JAPkABJAkqNJjmJuPAcR9tpB8i4B4esqBuZIAVGCTADB5BOxdmQd82pnoCBNAObUTMPjRxNOtKk5JaRQmfu0bwUwcK0BNLNRQb0PzNO6eLU2RFRCz3hFCMcqBqi2yNLML4yx7SMhZOccQJVpLEMUBPeAURGkdODrMigvSsAXWQHVXAZyiIKB8PQKI943zkHNpIzwY5WK1lPOeVJPIMLDMgKM6cJzaBFNnJvFODZsBEFIDRF4D4JpFzHAsueb5BmYVGeMmFb52ZSC+AidZMw2TsAomnRKhlxolUoJaW5BxQG4KEdEJgo1EAYHgHQvSKBkA724vQBivhUruU8Pxcg2lEAuHkJTamwiDDyVBVYKg8h4wwrhaWQJiKTqsDII+KkmS8myCtiZTVRL9Jvniadb494VDnPULU+Q24tJW0WMwZYfA6QBBgRQLAEsaDB29k8Q0UwLVHKON4NEaZ2yGW8OcX4E0TrrXkICzxBgAAsF4ABqLgKwCAuQAOU1FiOFaSwhrORaiv4h1GneWgPiEg3Si2e08I6NgbzvAGTQHBYEUwqHBp+p4dQQqxrtEaPVc08w4q/mFZaPBuBYrqzihM+g3BILPl8pC62eS7Y0u7VXEc75F0cRXfIVAhrPh71PAkC8gcjWTErTyYpRx9WpzIEwQSaBUVJUtiVJgL7EbNk3YQyASj5BxtTAwBsEjYagQBGQCCmsFCjUVLQZ1z1V2ngAPJX18P4z9viglQXnsBJelx+JfWeqMTJiSSQeSwDIoEdirIXJFUBlUe4KDQMkFXW6tBHK4ubKh6p46L4kjULhtd9AsM4ddVMgdL4+DVAEO0Y2kwMGAeotO981QUWhDCgLU6wdXTwz9BNBET5Qr+EEKlFAjGeosdPPoYw4AoDGqRqpwgjjlB/BA8SLgvB+DCEQ3KR2irFDKFUOoLQOgPMmHIQgeEati7+bIIFrlUcknxVTtUMObqMNxabol3QYBDCedMAYaAaSAAyAB6bD5zZBNbiEkRIYBUhgAyB1rrCQespD6/JZgtBOQxCmwYCwkK0nEGy1K+gRWIwbTpEq1FG9yCpxmFxwW3EdIgfZi0UGgn+DrWHhYyOmtwRI0XZcWzSIUSWnRJqKK2JIDVutlghElwF12PnY7NivBgz2MYIqQ5KpBAiFJgVEEtDqipuA0HFy1BcCGgEHgP76th0ghY76csONIVYGZJqLqvmPy6hcLYj+S7pBo1oK6fqLqSqMUvTaAhSLXnzG1AIVxFkPxMDjRQAXbSELCdF3GkqZQzS6X0sgZ6SiPxQVBAaThrT1a86oEo7UUzqrnHSt1bgEEqQmJoxBB48C/v1ieddfZWP6CW1WpEWQABuSUvd7x/1BvubSE4nPLHB5jBtAJjHwDN8LPguCOfY6IfLv+EqwacLFbAS0yK50fgjAiE0uOxCm1J4x08ABpZRGtQTgmQAEX4PEAT3brIyJ4Lclve9+jx9n+DpDhhhflDWUCxAjh7wOaHEiTzWGXTH+v33sE7mQNwztyAZf+ls/99UjaaL2do8xzwdIi7D7EGci5EH0D1lzyx0CFup+/dXiQCCXEz079YxFsQUzLQXPW309H0CB+SjLOIAnJipYn8wg0cMcsd0sj43hT5ICGhLJZcC8uoEFuoP9nEVQKVfcgQIdTYBxN1JRpRDI3MN59dSIdo9ZJR0dFAtJzdrty8IQoQ0DJMe9mRCRtA+UY0+IWhYp6woIYFKw99EZKlk86VewV9YQDgvtLZEBzhYRLg5pU5CxrNyd6DNZ5Qi5A8BC/gEQlBrQxYdNZACooJzQs9sktFWcwkyhg0t8plNCwRjUf1t86CfcGDJ0jcTdw86BvdLZ8CIYAINsaMARyRx1HD0NqoFgro0BxExB+AwJWUjAsIMV8dfA9D3xdtI4el3xpEoQQ00w58S1Y85cSEe8rJXlDIsBA8VcOZohF85o8Ag8lQVQi4lCHY2N35YRXRGUVRn54xqBYAABVcQQaGnP8edEnJkMnKIA4QjKJbwEjKuc5TwdoCgKLYY66TSLw8kSsaiQKYUU9PgHoJQW5fcNvRdMARyAzVEV7TEVnREe4V0NaV+JlaQ19SsYEGgyDUyPPJNZzLqVzJDU8f2SFP0QLJDPFI4TcCNH+fpO3QMZEZyKPGoZ6eDdgQnRAIwKAUtAEX0IYCEkEjcUQcEs/JGJgkcP4M9bgeEtMJE20BfSge6JQHEKbGIVE2rK5aOAbbrXrfrR4V+BgTIFIjQbDZESbabWbLCebALJbJFYrO7NDTbAwUBbbW4e4NsOYo+eYZYBpdSCg0EFPACTRcgHSF+Q0Y0Fo0fOAVAC9f+f6dvKksHfiLko0gAckeSdFdCtASItDMhglbVdAQBRFCWQG9G4GzGwP/TTEDDyi9AJGzCqN733ERnbBklgG4GXG4CmW1CGRGXGE9BDBtRIW+HX2onPS/AYCdKPmTIYkRhkjyRQBrUeTCO8Cw3kGHSQgHGrOiMZnrEpU2RpRTDDP9K9AAk+RohbBDDEIGRalDPg3DMzGP0CK7OpUmD/mewjI3Q5n/UCM8LqNKgQ2GShRKNt0DwuFoDHLLMnV9EbPQDCGYiXItBXN0lhHXIbGY28LCDqm+DuI2lQHIDoDoDTO8k9FB2bVbRzPyNfCTRTU4R0nTTOirA8UdicnoBcn4m4xwU1S9J7QHDilcXpRHGd1NizTEIeBaDnnPyBEEmEivOTP/RYOHOkgehjAHAikoCiioPQDEGwA2NEFOg2gCiCldBB1fRcR+F8V9nvPlQA39DTxPnCXfFRDlSmRwIDUElBhWi4ozVgrYjhyKhfKLO5NLIJGthqjrIaiZCalGErPouYCmT4y/z4HbGfn1G5MGKGnLH/1YpPXHDdNhmvjQr4HEDYFPBFMBPBj6RxO+y3GxLpCJJhMQrhJLQpNfSpNRMgH1HVHvD3i4G1AvUcqNJNFs3aVhDeE6UzDZKGw5JSCa3tKNF5LmP5PuG1BEW1VtXSroEyulHGB3MzNoGzLyopDsUNLfnypZJKs63ZJG05OLJqvGIFNwAaqgCarzJaomw/EAs1QAq+CArYBAtswvQGuNKGsKuZlZNGrKvGoqqqp5L5JmrmpSuQNssA1asp2LM9CXxPBPVdAAG9XqNBNqSAABfbavq9UPa3q5XQ64qmkUq4bUbSqyaq6+qgwBkpksAIwZpKG8q2G7kqakgOqwUxG4UywUUhbJxQQlbBVaUzAWU+UxFJ7ZUi5PUzFJ6pyk01UmQV2MgjSSg48+FC0yhK06PDvRATKk9E0T0OKbUewdHLEbUbMK1MyFtNgUW3fcEbyvwbUYMGW10bUJMpWrAdWyYXq1y0xGvFsJIWWgkXWlag23/CsY2sVAENIM2rW/MHYbgJW2M0S/W2ahDJsAEZIYMzXfMeMN2gcj2r4L2k0RsN8R20cjeC9DGLGQs1c21dMglLMkCxtEKQsu04s0sn0P0AMfsz0bWt2kMMKmSYul20ulAKEEuvKhXDmf8PWqujXHUC2s8sIIcsIBIA/XE1YyHFsIQ98Xsqcou7UC20cz7WunWs8hszGWgWKK8yym8nFJZGuzPEOsSRuySQegcASxGVch80gSUTcgeilbADZBcpeuDXKGcs9RtN86Cz8x5YTX82Ip5FoPgTdLW/81a+W4CgXcUyCyaBKXsJgISRDFyLNR2PSepLAIcAcOIF5c0MpB8E25+X6k0ZscCnwThd8CqTij8zNDxBS4lVe5ZDe+up6betDTPSMYO1u77SKX7UitingweNSmC3i7ZBCq4O08imlcekOgcO030CCv4J+4htiQisabgbDGgZAIR1pBgcBnjXTAcJSoNVhyRzabaTQKeyh2ei8gCa84e4lTRlSpIXGdjdUGy/vPgLRP/Y21h7UEWzylW9YxIptTVBWttQKwm4K7E5sfiMEyCAkqKtmYk2ErweKxExKghZK1KoYtB5arKuxHKwavWtGk66GiarG+G5EG6ha18JatqoMZbNO7qwGlmkGn/JpeAAQdGs6zGo07G3G2axq4lUpq257Myda3p2QXx6p3ajJ/arJhpppmGi6tp66kRQOH3fjexh61J0Zl6tLDQd6yAL69Z36gG0GkZ4s0G+pxpnJjG6ZgpjppG4BWrBR3ASZvJ1plIzIW59poUxkkUsUxbUmpwVbeQdbGU6QWIhYRFW5umzwNJ/JuY550Idpk0E3GBjUyYTm7U5BjWEkCleCV+S4OkHoCdW55Aey2RUZ5yqZfF2cp8xZwNSos0ZfOh7PfuPHLA9WMPCPZ+W5nPDEFOEcWeIe/iWm7UdlngCjdcqZGYA4phGiV0GIUZ/RQTLAaAUIPCKsV+Q8VhpQv/FjCnWpvg5Bc0GVJ0WIQAWTXAAOOsAE3mpVvaYqDoi/fiHVr8q6RYFs9WRtNnAWm01xp0AXOu52t252yMV20XQO+h4R0pPlJxtwgyXCiRDBaxhDYEMVRV2IDMqFBVyV0och7cgiBpHOvSxRmetZQVZsNIHu3A/AWeCaVO3c8YE0LOy4Ouu1CygsGMaBjRugSgxR9ulXNRLEGNyFeI1WiVxGESgYPBjB61UC+gPYjobhQKKofhItIRLgAIwdjWMV1WUIigCMDhoh8oE7Qx1AZYONOQ5enMWdadlVznB+gEHRs4c4W5XdhpJRox+exeicE9zC5Ux0PwUFy183ACHRh5UIkysy4eyyyhg4fkAwldy0v7aQ/BUK5sdheRvZB+EkvAEDbNSYqgYjZIlUlC5AZkGgU7IWD8x85o2pxdUs0/VW11V0U4KQqWLAfOlBEMm+6cpex0UgYkfxgErEgk4J0EvEsJ4EiJ6EkkuKhE66eJwFkRdEwCPj4EgT3EiK8JqEaK8TmJyTykznF2esCMUaWzV6g9W2ek6ba56rFLKTxCmhPALLEmoLPLTgArSU356LUrKgeLTQbQSrQwSz4LdQTIcYRATIL9OgTICWZEHzmrKAAAdgYASGLYSBi9oCSBi+LYADYBAAAOAQOLqYdIYTJIJIBIWgOIdL9LuILLhIAQOIZYGLzwZLLzFSWgFYBgHNdLnINIdLpIKYHNLL/LgQBgFIEgYbnNarnNKYFQFIWgDIHrlINAJILLmLqLyztAGLlIAQGbkgFYdLtALL4tnNGLpIdrzGbLhIBbqYJIAQFIZLpINYVQAQBIFYKERriAMUeblIOIW6Ega7obgQJIKCKYeLuIGLtAdL57hgLLlrkb0QMr3LnNNAOKV7qAdLkgOIFIYb2gQyBIOIWrpIIb2gBIQyDbhITGdbmL2rnNbLlYGLmrlYfblbpr1rtIFYWgcH9IFYOgGLinjrwbxbgHlIVIKYWgFIFYRb+rqYNIKCHrqLgwPzoOALoLkLsjFOMLnzfQIAA= -->

<!-- internal state end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=SurvivalCodingCampus/modu-3-dart-study&utm_content=91):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: NONE
user: login: YunFlutter
created_at: 2025-03-13T11:29:18Z
body: @coderabbitai full review a73bd1e96a81547046eab85a0f0b37d091bbb59f
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-03-13T11:30:16Z
body: <!-- This is an auto-generated reply by CodeRabbit -->
<details>
<summary>🧩 Analysis chain</summary>

🏁 Script executed:
```
#!/bin/bash
# Retrieve the main implementation files
echo "=== lib/2025-03-13/cleric_file.dart ==="
cat lib/2025-03-13/cleric_file.dart
echo ""
echo "=== assignments/2025-03-13/cleric_file.dart ==="
cat assignments/2025-03-13/cleric_file.dart
echo ""
echo "=== test/2025-03-13/cleric_file_test.dart ==="
cat test/2025-03-13/cleric_file_test.dart
echo ""
echo "=== TIL/daily/2025-03-13/2025-03-13.md ==="
cat TIL/daily/2025-03-13/2025-03-13.md
```

Length of output: 8970

---



</details>

@YunFlutter: 안녕하세요! PR #91에 대한 전체 리뷰를 진행하겠습니다.

## 코드 리뷰: Cleric 클래스 구현

### 좋은 점 👍
- 클래스 구조가 잘 설계되어 있으며 필요한 속성과 메서드를 명확하게 정의했습니다.
- 적절한 테스트 케이스를 작성하여 다양한 상황을 검증했습니다.
- final 키워드를 적절히 사용하여 상수를 정의했습니다.
- Random 클래스를 잘 활용하여 무작위 값을 생성했습니다.

### 개선 사항 🔍

1. **lib와 assignments 폴더의 구현 차이**:
   - lib 버전에서는 selfAid 메서드에서 `mp >= 5` 체크를 하지만, assignments 버전에서는 체크하지 않습니다. 체크하지 않으면 MP가 음수가 될 수 있습니다.

2. **selfAid 메서드**: 
   - assignments 버전에서 MP 체크를 추가해야 합니다:
   ```dart
   void selfAid() {
     if(maxHp > hp && mp >= 5) {
       mp -= 5;
       hp = maxHp;
     } else {
       if(mp < 5) {
         print("MP가 부족하여 selfAid를 사용할 수 없습니다");
       } else {
         print("이미 HP는 전부 회복 되었습니다");
       }
     }
   }
   ```

3. **pray 메서드**:
   - 코드 주석에 언급된 것처럼 여러 return 문보다 하나의 return을 사용하는 것이 가독성에 좋습니다.
   - 아래와 같이 로직을 단순화할 수 있습니다:
   ```dart
   int pray(int prayTime) {
     Random random = Random();
     int correctionValue = random.nextInt(3); // 0-2 사이 보정치
     int recoveryValue = prayTime + correctionValue;
     
     print("보정치 $correctionValue");
     print("회복량 $recoveryValue");
     
     int actualRecovery = 0;
     if(mp < maxMp) {
       actualRecovery = (mp + recoveryValue > maxMp) ? maxMp - mp : recoveryValue;
       print("실제 회복량 $actualRecovery");
       mp += actualRecovery;
     }
     
     return actualRecovery;
   }
   ```

4. **변수명 개선**:
   - prayTime 변수가 클래스 속성과 메서드 매개변수로 동시에 사용되어 혼란을 줄 수 있습니다. 클래스 속성은 다른 이름(예: lastPrayerDuration)으로 변경하면 좋을 것 같습니다.

5. **주석 활용**:
   - 메서드와 주요 로직에 대한 주석을 추가하면 코드의 가독성이 더 좋아질 것입니다.

전반적으로 잘 구현된 클래스이며, 위 개선사항을 적용하면 더 안정적이고 가독성 있는 코드가 될 것 같습니다.

<details>
<summary>:white_check_mark: Actions performed</summary>

Review triggered.

> Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

</details>
author_association: NONE
user: login: YunFlutter
created_at: 2025-03-13T11:33:04Z
body: @coderabbitai full review 13a32eeeb3c3b0acfc527a69fc8d9e3ec26b74aa
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-03-13T11:33:55Z
body: <!-- This is an auto-generated reply by CodeRabbit -->
<details>
<summary>🧩 Analysis chain</summary>

🏁 Script executed:
```
#!/bin/bash
# Get the files associated with the commit
echo "=== lib/2025-03-13/cleric_file.dart ==="
cat lib/2025-03-13/cleric_file.dart
echo ""
echo "=== assignments/2025-03-13/cleric_file.dart ==="
cat assignments/2025-03-13/cleric_file.dart
echo ""
echo "=== test/2025-03-13/cleric_file_test.dart ==="
cat test/2025-03-13/cleric_file_test.dart
echo ""

# Checking what changes were made
echo "=== Changes between the two commits ==="
git diff a73bd1e96a81547046eab85a0f0b37d091bbb59f 13a32eeeb3c3b0acfc527a69fc8d9e3ec26b74aa
```

Length of output: 5569

---



</details>

@YunFlutter: PR의 변경사항을 검토했습니다. 이전 리뷰에서 제안한 개선사항들을 모두 잘 반영해주셨네요! 👍

### 개선된 점:

1. **selfAid 메서드**:
   - MP 체크 로직 (`mp >= 5`)을 추가하여 MP가 음수가 되는 문제를 방지했습니다.
   - MP가 부족한 경우와 HP가 이미 최대인 경우에 대한 명확한 에러 메시지를 추가했습니다.

2. **pray 메서드**:
   - 여러 return문을 줄이고 로직을 단순화했습니다.
   - 실제 MP 회복 코드 (`mp += recoveryValue`)를 추가했습니다.
   - 조건문을 더 효율적으로 정리했습니다.
   - 코드 맥락을 설명하는 유용한 주석을 추가했습니다.

코드가 이전보다 훨씬 안정적이고 읽기 쉬워졌습니다. 이제 두 파일(lib와 assignments)의 구현이 동일하게 잘 정렬되어 있으며, 테스트 케이스도 잘 작성되어 있습니다.

훌륭한 개선 작업이었습니다! 👏



(づ ◕‿◕ )づ

<details>
<summary>:white_check_mark: Actions performed</summary>

Review triggered.

> Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

</details>
author_association: NONE
user: login: YunFlutter
created_at: 2025-03-13T23:46:54Z
body: @coderabbitai full review
author_association: NONE
user: login: YunFlutter
created_at: 2025-03-13T23:57:00Z
body: @coderabbitai full review 6e233edca522b0c3d5ca3b5ea7372b4b897b2981
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-03-13T23:57:39Z
body: <!-- This is an auto-generated reply by CodeRabbit -->
<details>
<summary>🧩 Analysis chain</summary>

🏁 Script executed:
```
#!/bin/bash
# Get the files from the specified commit
echo "=== lib/2025-03-13/cleric_file.dart ==="
git show 6e233edca522b0c3d5ca3b5ea7372b4b897b2981:lib/2025-03-13/cleric_file.dart

echo ""
echo "=== assignments/2025-03-13/cleric_file.dart ==="
git show 6e233edca522b0c3d5ca3b5ea7372b4b897b2981:assignments/2025-03-13/cleric_file.dart

echo ""
echo "=== test/2025-03-13/cleric_file_test.dart ==="
git show 6e233edca522b0c3d5ca3b5ea7372b4b897b2981:test/2025-03-13/cleric_file_test.dart

# Check changes compared to the last reviewed commit
echo ""
echo "=== Changes since last review ==="
git diff 13a32eeeb3c3b0acfc527a69fc8d9e3ec26b74aa 6e233edca522b0c3d5ca3b5ea7372b4b897b2981
```

Length of output: 4760

---



</details>

@YunFlutter: PR 6e233edca522b0c3d5ca3b5ea7372b4b897b2981의 검토를 완료했습니다.

## 코드 리뷰 결과

### 개선된 점 👍
- lib/2025-03-13/cleric_file.dart 파일에서 `pray` 메서드의 조건문을 더 효율적으로 변경했습니다:
  - 변경 전: `if((mp + recoveryValue == maxMp) || (mp + recoveryValue < maxMp))`
  - 변경 후: `if((mp + recoveryValue <= maxMp))`
  
이 변경은 두 개의 비교 조건을 하나의 간결한 조건으로 단순화했습니다. `a == b || a < b`는 `a <= b`와 논리적으로 동일하므로 코드가 더 읽기 쉽고 유지보수하기 좋아졌습니다.

### 제안 사항 🔍
- assignments/2025-03-13/cleric_file.dart 파일에서는 여전히 원래 조건문을 사용하고 있습니다. 일관성을 위해 이 파일도 업데이트하면 좋을 것 같습니다.

### 종합 평가
전체적으로 코드는 잘 구성되어 있으며, 테스트 케이스도 다양한 시나리오를 포함하고 있습니다. 이전 리뷰에서 지적된 사항들이 대부분 개선되었으며, 최근 변경 사항도 코드 가독성을 향상시켰습니다.

훌륭한 작업이에요! 👏



(ﾉ◕ヮ◕)ﾉ*:･ﾟ✧

<details>
<summary>:white_check_mark: Actions performed</summary>

Review triggered.

> Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

</details>
author_association: NONE