[25.07.03 TIL] 개인 과제

κΉ€μ˜λ―ΌΒ·2025λ…„ 7μ›” 3일

🎯 아침에 코딩을 μ™„λ£Œν•˜κ³ , leetcode와 Git을 μ—°λ™ν•˜μ—¬ 풀이λ₯Ό μ™„λ£Œν•˜μ—¬ μžλ™ μ—…λ‘œλ“œ 될 수 μžˆλ„λ‘ ν•˜μ˜€λ‹€.
그리고, 개인 과제의 도전 μš”μ†Œλ₯Ό μ œμ™Έν•œ ν•„μˆ˜ μš”μ†Œλ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° μ™„λ£Œν•˜μ˜€λ‹€.


⏰ 아침에 μ½”λ”©

βœ… μ• λ„ˆκ·Έλž¨ 비ꡐ

bool isAnagram(String s, String t) {
  // 두 λ¬Έμžμ—΄μ˜ 길이가 λ‹€λ₯΄λ©΄ μ• λ„ˆκ·Έλž¨μ΄ μ•„λ‹˜
  if (s.length != t.length) return false;
    // 각 λ¬Έμžμ—΄μ˜ 문자λ₯Ό μ •λ ¬ν•œ ν›„ 비ꡐ
  List<String> sortedS = s.split('')..sort();
  List<String> sortedT = t.split('')..sort();  
  return sortedS.join() == sortedT.join();
}

βœ… leetcode 연동
πŸ’­ leethubλ₯Ό μ΄μš©ν•΄μ„œ Git에 μ—°λ™ν•˜κ³ , μžλ™μœΌλ‘œ μ»€λ°‹ν•΄μ£ΌλŠ” ν™•μž₯ ν”„λ‘œκ·Έλž¨μ΄ μžˆμ–΄μ„œ μƒˆ leetcode λΌλŠ” μ €μž₯μ†Œλ₯Ό λ§Œλ“€μ—ˆλ‹€.

그리고 계정 μ—°λ™κΉŒμ§€λŠ” μ™„λ£Œν–ˆλŠ”λ°, λ¬Έμ œν’€μ΄ ν›„ λˆ„λ₯΄λ©΄ 연동이 μ•ˆλ˜μ–΄μ„œ λ¬Έμ œκ°€ 뭐일지 μ°Ύλ‹€κ°€ 숨겨져있던.. μƒˆλ‘œμš΄ λ²„μ „μœΌλ‘œ κ΅μ²΄ν•΄μ„œ ν•΄κ²°ν–ˆλ‹€.


πŸ₯½ 개인 과제

πŸ‘©β€πŸ’» μž‘μ—…

πŸ“ main.dart

import 'package:rpg_game/game.dart';
//
void main(List<String> arguments) {
  var game = Game();
  game.startGame();
}

πŸ’¬ ν•΄λ‹Ή κ²Œμž„ ν•¨μˆ˜λ§Œ ν˜ΈμΆœν•˜μ—¬ main의 κΈ°λŠ₯을 μ™„λ£Œν•˜μ˜€λ‹€.


πŸ“ character.dart

void attackMonster(Monster monster) {
    print("$name이(κ°€) ${monster.name}μ—κ²Œ $attack의 데미지λ₯Ό μž…ν˜”μŠ΅λ‹ˆλ‹€.\n");
    monster.hp -= attack;
  }
  // λ°©μ–΄
  void defend(Monster monster) {
    if (monster.attack >= defense) {
      var addHp = monster.attack - defense;
      hp += addHp;
      print("$name이(κ°€) λ°©μ–΄νƒœμ„Έλ₯Ό μ·¨ν•˜μ—¬ $addHp 만큼 체λ ₯을 μ–»μ—ˆμŠ΅λ‹ˆλ‹€.");
    }
  }

πŸ’¬ μΊλ¦­ν„°μ˜ 곡격 λ‘œμ§μ„ κ΅¬ν˜„ν•˜μ—¬ λͺ¬μŠ€ν„°μ˜ ν”Όκ°€ 그만큼 λ§ˆμ΄λ„ˆμŠ€ λ˜λ„λ‘ ν•˜μ˜€λ‹€.

πŸ’¬ λ°©μ–΄ λ‘œμ§λ„ κ΅¬ν˜„μ„ μ™„λ£Œν–ˆλŠ”λ°, ν”Όκ°€ μ°¨λŠ” 둜직이라 λͺ¬μŠ€ν„°μ˜ 곡격λ ₯이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ— void defend(Monster monster) μ΄λŸ°μ‹μœΌλ‘œ λͺ¬μŠ€ν„° 정보λ₯Ό λ°›μ•„μ™”λ‹€.


πŸ“ monster.dart

  void attackCharacter(Character character) {
    print("$name의 ν„΄");
    print("$name이(κ°€) ${character.name}μ—κ²Œ $attack의 데미지λ₯Ό μž…ν˜”μŠ΅λ‹ˆλ‹€.");
    character.hp -= (attack - character.defense);
  }

πŸ’¬ μœ„μ™€ λ™μΌν•˜κ²Œ 곡격 λ‘œμ§μ„ κ΅¬ν˜„ν•˜μ˜€κ³ , μΊλ¦­ν„°μ˜ 정보λ₯Ό λ°›μ•„μ™”λ‹€.


πŸ“ game.dart

// μ •κ·œμ‹: ν•œκΈ€(κ°€-힣), 영문 λŒ€μ†Œλ¬Έμž(A-Za-z)만 ν—ˆμš©
    final regex = RegExp(r'^[κ°€-힣a-zA-Z]+$');
// 쑰건 검사
    if (charName.trim().isEmpty) {
      print("이름은 λΉ„μ–΄ μžˆμ„ 수 μ—†μŠ΅λ‹ˆλ‹€.");
      exit(1);
    }
    if (!regex.hasMatch(charName)) {
      print("μ΄λ¦„μ—λŠ” μˆ«μžλ‚˜ 특수문자λ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.");
      exit(1);
    }

πŸ’¬ ν•œκΈ€, μ˜λŒ€μ†Œλ¬Έμžλ§Œ ν—ˆμš©ν•˜κΈ° μœ„ν•΄ μ •κ·œμ‹μ„ μ‚¬μš©ν•΄μ„œ μˆ«μžλ‚˜ 특수문자λ₯Ό 걸러주고, 곡백이 μ‘΄μž¬ν•  κ²½μš°λ„ κ±ΈλŸ¬μ£Όμ—ˆλ‹€.

 character = Load.loadChar(charName);
 monster = Load.loadMonster(character.defense);
    character.showStatus();
    .
    .
	var isWin = await battle(randomMonster);
      if (!isWin) {
        print("${character.name}이(κ°€) μ“°λŸ¬μ‘ŒμŠ΅λ‹ˆλ‹€.");
        break;
      }
      print("${randomMonster.name}λ₯Ό μ²˜μΉ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€.");
      if (monster.isEmpty) {
        print("μΆ•ν•˜ν•©λ‹ˆλ‹€! λͺ¨λ“  λͺ¬μŠ€ν„°λ₯Ό λ¬Όλ¦¬μ³€μŠ΅λ‹ˆλ‹€.");
        break;
      }    
    print("λ‹€μŒ λͺ¬μŠ€ν„°μ™€ λŒ€κ²°ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? y/n");
     bool isContinue = false;
      while (true) {
        String? next = stdin.readLineSync()!.trim();
        if (next == "Y" || next == "y") {
          isContinue = true;
          break;
        } else if (next == "N" || next == "n") {
          isContinue = false;
          break;
        }
        print("λ‹€μ‹œ μž…λ ₯ν•΄μ£Όμ„Έμš”.");
      }
      if (!isContinue) break;
    }

πŸ’¬ 캐릭터와 λͺ¬μŠ€ν„°μ˜ 데이터λ₯Ό λ‘œλ“œν•΄μ˜€κ³ , 배틀을 μ§„ν–‰ν•œλ‹€. 그리고 배틀이 μ™„λ£Œκ°€ λ˜μ—ˆμ„ λ•Œ, μ΄κ²ΌλŠ”μ§€, μ‘ŒλŠ”μ§€ λ°˜ν™˜ν•˜μ—¬ ν”Œλ ˆμ΄μ–΄κ°€ μ‘Œμ„ 경우 κ²Œμž„ μ˜€λ²„λ‘œ μ €μž₯ν• μ§€ μ„ νƒν•˜κ²Œ ν•œλ‹€.

그게 μ•„λ‹ˆλΌλ©΄ λͺ¬μŠ€ν„°λ₯Ό μ“°λ €νŠΈλ ΈμœΌλ‹ˆ λ‹€μŒ λͺ¬μŠ€ν„°μ™€ μ‹ΈμšΈμ§€ 선택지λ₯Ό μ œκ³΅ν•˜λŠ”λ° μ΄λ•Œ λ‹€λ₯Έ 값을 μž…λ ₯ν•˜λ©΄ λ‹€μ‹œ μž…λ ₯ν•˜κ²Œλ” μ²˜λ¦¬ν•΄μ€€λ‹€.

배틀을 λ°˜λ³΅ν•˜κ³  monster.isEmpty λ₯Ό μ‚¬μš©ν•˜μ—¬ 더이상 λ‚¨μ•„μžˆλŠ” λͺ¬μŠ€ν„°κ°€ μ—†μœΌλ©΄ μ „νˆ¬λ₯Ό μ’…λ£Œν•˜λ„λ‘ ν•œλ‹€.


// κ²Œμž„ κ²°κ³Ό μ €μž₯
    print("κ²°κ³Όλ₯Ό μ €μž₯ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? (y/n)");
    String? saveInput = stdin.readLineSync()!.trim();
    if (saveInput == "Y" || saveInput == "y") {
      var result = "${character.name},${character.hp},${character.hp > 0 ? "승리" : "패배"}";
      Save.saveData(result);
    }

πŸ’¬ κ²Œμž„ κ²°κ³Όλ₯Ό μ €μž₯ν•˜λŠ” λ‘œμ§λ„ κ΅¬ν˜„ν•˜μ—¬ ν•΄λ‹Ή μ „νˆ¬ κ²°κ³Ό 데이터 값을 전달해 ν˜ΈμΆœν•œλ‹€.


Future<bool> battle(Monster monster) async {
	.
	.
	if (action == "1") {
        character.attackMonster(monster);
        await Future.delayed(Duration(seconds: 2));
        monster.attackCharacter(character);
        monster.showStatus();
      } else if (action == "2") {
        character.defend(monster);
      } else {
        print("잘λͺ»λœ μž…λ ₯μž…λ‹ˆλ‹€. λ‹€μ‹œ μž…λ ₯ν•΄μ£Όμ„Έμš”!");
        continue;
      }
      // μ „νˆ¬ μ’…λ£Œ 확인
      if (character.hp <= 0) {
        return false;
      } else if (monster.hp <= 0) {
        Monster monsterList = monster;
        // monsterList.removeAt(index);
        return true;
      }

πŸ’¬ 그리고 λ°°ν‹€ λ‘œμ§μ—μ„œ 행동을 μž…λ ₯λ°›κ³  곡격 및 λ°©μ–΄λ₯Ό ν•˜κ²Œλ” κ΅¬ν˜„ν–ˆλ‹€.
λ‹€λ₯Έ 값을 μž…λ ₯ν•  경우 λ‹€μ‹œ μž…λ ₯ν•˜λ„λ‘ μ²˜λ¦¬ν•˜μ˜€κ³ , μ „νˆ¬ μ’…λ£Œ 쑰건을 μ„€μ •ν•΄ μœ„μ—λŠ” 보이지 μ•Šμ§€λ§Œ λ°˜λ³΅λ¬Έμ„ λΉ μ Έλ‚˜μ˜€λ„λ‘ ν•œλ‹€.


πŸ“ data.dart

// 데이터 ν˜•μ‹ 검증
        if (parts.length != 3) {
          print("λͺ¬μŠ€ν„° 데이터가 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
          exit(1);
        }
        var maxAttack = int.parse(parts[2]);
        var mon = Monster(
          name: parts[0],
          hp: int.parse(parts[1]),
          attack: 1 + defense + Random().nextInt(maxAttack - defense + 1),
          defense: 0,
        );
        // 곡격λ ₯ 검증
        if (mon.attack <= defense) {
          print("λͺ¬μŠ€ν„°μ˜ 곡격λ ₯은 μΊλ¦­ν„°μ˜ λ°©μ–΄λ ₯보닀 λ†’μ•„μ•Όν•©λ‹ˆλ‹€.");
          exit(1);
        }
        monster.add(mon);
      }
      return monster;
    }
  }

πŸ’¬ 데이터 ν˜•μ‹μ„ parts.length 둜 ν™•μΈν•˜κ³ , 곡격λ ₯ 검증도 μ§„ν–‰ν•΄μ€€λ‹€.

μ—¬κΈ°μ„œ defense κ°€ κ°€λŠ₯ν•œ μ΄μœ λŠ” λͺ¬μŠ€ν„° 데이터 λ‘œλ“œ μ‹œ μΊλ¦­ν„°μ˜ λ°©μ–΄λ ₯ 값을 λ°›μ•„μ˜€λ„λ‘ μ„€μ •ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.


static Character loadChar(String name) {
    final file = File("assets/character.txt");
    // 파일 μ—¬λΆ€ 확인
    if (!file.existsSync()) {
      print("캐릭터 파일이 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.");
      exit(1);
    }
    String line = file.readAsLinesSync(encoding: utf8).first;
    List<String> parts = line.split(",");
    // 데이터 ν˜•μ‹ 검증
    if (parts.length != 3) {
      print("캐릭터 데이터가 잘λͺ»λ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
      exit(1);
    }
    int hp = int.parse(parts[0]);
    int attack = int.parse(parts[1]);
    int defense = int.parse(parts[2]);
    return Character(name: name, hp: hp, attack: attack, defense: defense);
  }
}

πŸ’¬ 캐릭터 데이터도 λΆˆλŸ¬μ˜€λŠ”λ°, μ—¬κΈ°μ„œ string name 으둜 μž…λ ₯받은 name 값을 λ°›μ•„μ˜€λ„λ‘ ν•˜μ—¬ λ„£μ–΄μ€€λ‹€.

λ™μΌν•˜κ²Œ 파일 여뢀와 ν˜•μ‹μ„ κ²€μ¦ν•œλ‹€.


// 데이터 μ €μž₯
class Save {
  static saveData(String result) {
    var saveresult = result;
    // 파일 생성
    final file = File('assets/result.txt');
    file.writeAsStringSync(saveresult);
    print("μ €μž₯이 μ™„λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€!");
  }
}

πŸ’¬ νŒŒμΌμ„ μ €μž₯ν•˜λŠ” λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° μ‰½κ²Œ μ „μ—­μœΌλ‘œ λ°”κΏ”μ£Όκ³ , μ§€μ • νŒŒμΌμ— κ²°κ³Ό μ €μž₯λ˜λ„λ‘ κ΅¬ν˜„ν–ˆλ‹€.


❗ 였λ₯˜ 및 μ˜ˆμ™Έ 처리

❗ 호좜 였λ₯˜

var utils = Utils();
var result = utils.add();

πŸ’¬ 호좜이 μ•ˆλ˜μ–΄μ„œ μ°Ύμ•„λ³΄λ‹ˆ import만 λ˜μ–΄μžˆμ–΄μ„œ 클래슀 λͺ…을 μ“°κ³  μ‹Άλ‹€λ©΄ λ¨Όμ € λ³€μˆ˜λ₯Ό λ§Œλ“  ν›„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” κ±Έ λ‹€μ‹œ ν™•μΈν•˜κ²Œ λ˜μ—ˆλ‹€. μ½”λ“œ νλ¦„λŒ€λ‘œ μ“°λ‹€λ³΄λ‹ˆ 이걸 κΉœλΉ‘ν–ˆλ˜ 것

πŸ’¬ 예λ₯Ό λ“€μ–΄ var result = Utils().add() μ΄λŸ°μ‹μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 방법이 μžˆλŠ”λ°, λ³„λ‘œ μ’‹μ§€λͺ»ν•œ 방법이라고 ν•œλ‹€. μœ„μ— μ½”λ“œλ₯Ό μƒλž΅ν•˜μ—¬ μ‚¬μš©ν•œ 것이라고 ν•˜λŠ”λ°...

μ•„λ¬΄νŠΌ μ € λ³€μˆ˜ 선언을 ν•˜κ³  클래슀 λ„£λŠ”κ±Έ κΉŒλ¨Ήμ–΄μ„œ λ‘œλ“œν•  λ•Œ 해결이 μ•ˆλ˜μ—ˆλŠ”λ° static을 μ‚¬μš©ν•˜μ—¬ 해결을 μ™„λ£Œν–ˆλ‹€.


❗ 파일 λ‘œλ“œ

final file = File("../assets/monster.csv"); // κΈ°μ‘΄ μ½”λ“œ
final file = File("assets/monster.txt"); // λ³€κ²½λœ μ½”λ“œ

πŸ’¬ 이게 싀행이 bin/main.dartλΌμ„œ ..으둜 폴더λ₯Ό λ‚˜μ˜€κ³  ν•΄λ‹Ή νŒŒμΌμ„ μ‹€ν–‰ν•΄μ£Όλ € ν–ˆλŠ”λ°, μ• μ΄ˆμ— dart run bin/main.dart μ΄λŸ°μ‹μœΌλ‘œ 돌리기 λ•Œλ¬Έμ— 상관이 μ—†λ‹€κ³  ν•œλ‹€.

κ·Έλž˜μ„œ ../ 을 μ œκ±°ν•˜κ³ , csv 같은 경우 json 처럼 κ·Έ 파일 μ•ˆ ꡬ성 ν˜•νƒœλ₯Ό λœ»ν•˜λŠ” λ§μ΄μ—ˆλ˜ 것이라, .txt ν˜•μ‹μœΌλ‘œ 파일이 있기 λ•Œλ¬Έμ— λ°”κΎΈμ–΄μ£Όμ—ˆλ‹€.


❗ 데이터 κ°’

var maxAttack = int.parse(parts[2]);
var mon = Monster(
	name: parts[0],
	hp: int.parse(parts[1]),
	attack: 1 + defense + Random().nextInt(maxAttack - defense + 1),
          defense: 0,
        ));

πŸ’¬ monster 의 μ΅œλŒ€ 곡격λ ₯κ³Ό μΊλ¦­ν„°μ˜ λ°©μ–΄λ ₯의 사이 값을 랜덀으둜 μ„ μ •ν•˜μ—¬ 곡격λ ₯으둜 μ„ μ •ν•΄μ•Όν–ˆλŠ”λ°, 이 min max 이것을 dart 곡식 ν™ˆνŽ˜μ΄μ§€μ—μ„œ μ‚¬μš©ν•˜λŠ” 법을 μ°Ύμ•˜λ‹€.

❌ attack: defense + Random().nextInt(maxAttack - defense + 1) 이게 κ·Έ 전에 μ½”λ“œμΈλ° 였λ₯˜κ°€ λ°œμƒν–ˆλ‹€.
계속 λŸ°μ„ λŒλ €λ³΄λ‹ˆ λ°œμƒν•  λ•Œλ„ 있고 없을 λ•Œλ„ μžˆμ—ˆλ‹€.

이유 확인을 μœ„ν•΄μ„œ ${mon.attack} ${char.defense} μ΄λ ‡κ²Œ ν•΄λ‹Ή 값을 ν™•μΈν•˜κ³  였λ₯˜ λ°œμƒν•  λ•ŒκΉŒμ§€ λŒλ €λ³΄λ‹ˆ 5, 5 μ΄λŸ°μ‹μœΌλ‘œ 같은 값이 λ‚˜μ™”λ˜ 것이닀.

μ΅œλŒ€κ°’μ—λŠ” +1을 ν•˜μ—¬ μ΅œλŒ€κ°’μ„ 잘 μ„€μ •ν–ˆλŠ”λ° μ΅œμ†Œκ°’μ—λŠ” +1을 ν•΄μ£Όμ§€ μ•Šμ•„μ„œ 같은 값이 λ‚˜μ™€μ„œ 데미지가 0이 λ˜λŠ” 상황이 λ°œμƒν•œ 것이닀.

βœ”οΈ λ‹€ν–‰μŠ€λŸ½κ²Œλ„ 이걸 μ˜ˆμ™Έ 처리λ₯Ό ν•΄λ‘μ–΄μ„œ ν•΄λ‹Ή 뢀뢄을 ν™•μΈν–ˆκ³ , μœ„μ— 처럼 +1 을 μΆ”κ°€ν•˜μ—¬ ν•΄κ²°ν•˜μ˜€λ‹€.


πŸ’‘ κΈ°λŠ₯ μΆ”κ°€

βœ… 좜λ ₯ λ©”μ„Έμ§€κ°€ μ—°λ‹¬μ•„μ„œ λΉ λ₯΄κ²Œ λΆ™μ–΄μ„œ 좜λ ₯되기 λ•Œλ¬Έμ— 가독성이 λ–¨μ–΄μ§€κ³ , ν•œλ²ˆμ— λ§Žμ€ μ •λ³΄λ‘œ μ–΄λ–€ 정보가 좜λ ₯λ˜μ—ˆλŠ”μ§€ νŒŒμ•…μ΄ νž˜λ“€μ—ˆλ‹€.

πŸ’¬ print("$name이(κ°€) ${monster.name}μ—κ²Œ $attack의 데미지λ₯Ό μž…ν˜”μŠ΅λ‹ˆλ‹€.\n"); κ·Έλž˜μ„œ μ΄λŸ°μ‹μœΌλ‘œ ν•œ ν„΄λ§ˆλ‹€ λ¬Έμž₯이 λ‚˜μ˜€λ„λ‘ λŠμ–΄μ£Όμ—ˆλ‹€.


πŸ’¬ 그리고 Future, async, await λ₯Ό ν™œμš©ν•˜μ—¬ await Future.delayed(Duration(seconds: 2)); 좜λ ₯에 2초의 간격을 μ£Όμ—ˆλ‹€.

πŸ‘‰ 이λ₯Ό μœ„ν•΄ Future<bool> battle μ΄λŸ°μ‹μœΌλ‘œ λ³€κ²½ν•΄μ£Όκ³ , λ‹€λ₯Έ κ³³μ—μ„œ ν•΄λ‹Ή battle(); 을 ν˜ΈμΆœν•  λ•Œ λ‹€μŒ μ½”λ“œλ‘œ λ„˜μ–΄κ°€μ§€ μ•Šλ„λ‘ void startGame() async, var isWin = await battle(randomMonster); 이런 μ‹μœΌλ‘œ μˆ˜μ • μ™„λ£Œν•΄μ£Όμ—ˆλ‹€.

❗ 이 λΉ„λ™κΈ°μ˜ λ™κΈ°λŠ” νŠΈλŸ¬λΈ” μŠˆνŒ…μ— μ“ΈκΉŒ κ³ λ―Όν–ˆλŠ”λ°, 생각보닀 금방.. ν•΄κ²°μ΄λž„κΉŒ 문제점 νŒŒμ•…μ΄ μž˜λ˜μ–΄μ„œ 여기에 μž‘μ„±ν–ˆλ‹€.


βš™οΈ Git

πŸ”’ 컀밋 였λ₯˜

πŸ’¬ 문제λ₯Ό μ°Ύμ•˜λŠ”λ° 개인 ν”„λ‘œμ νŠΈ 쀑 μ–΄μ œ λ§₯μ—μ„œ μ»€λ°‹ν•œ 것은 μ•ˆμ³μ€€λ‹€λŠ” 것이닀. 근데 눌러보면 μ»€λ°‹λ˜μ–΄μžˆλŠ” λ‚΄μš©λ“€μ„ λ³Ό μˆ˜κ°€ μžˆλŠ” 것이고, λ‹¨μˆœνžˆ λ‚΄ κΉƒ νŽ˜μ΄μ§€μ—μ„œ 컀밋을 λͺ‡λ²ˆ ν–ˆλŠ”μ§€ μ„Έμ–΄μ£Όμ§€ μ•ŠλŠ”λ‹€λŠ” 것 πŸ’¦

βœ… ν•΄κ²° 방법

git config --global user.name
git config --global user.email

πŸ’¬ 터미널에 μ΄λŸ°μ‹μœΌλ‘œ μœˆλ„μš°μ™€ λ§₯ λ‘˜λ‹€ μ–΄λ–€ 이름과 이메일이 μ—°λ™λ˜μ–΄ μžˆλŠ”μ§€ ν™•μΈν–ˆλ‹€.
κ·Έλž¬λ”λ‹ˆ 이메일이 ꡬ글 메일과 κΉƒ 메일 μ΄λ ‡κ²Œ λ‹¬λžλ˜ 문제λ₯Ό λ°œκ²¬ν–ˆλ‹€.


git config --global user.name "λ‹‰λ„€μž„"
git config --global user.email "λ©”μΌμ£Όμ†Œ"

πŸ’¬ μ΄λ ‡κ²Œ 뒀에 λ³€κ²½ν•  λ‹‰λ„€μž„μ΄λ‚˜ 메일 μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜μ—¬ λ³€κ²½ν•΄μ£Όμ—ˆλ‹€.
κ·Έλž˜μ„œ 이메일을 λ˜‘κ°™μ΄ λ§Œλ“€μ–΄μ€¬κ³ , git config --global user.email λ₯Ό μž…λ ₯ν•˜λ©΄ 바뀐 것을 μ•Œ 수 μžˆλ‹€.


🌼 Git Commit

βœ… κΈ°λŠ₯ κ΅¬ν˜„ μ™„λ£Œ
βœ”οΈ 캐릭터 곡격 및 λ°©μ–΄ 둜직 μ™„λ£Œ
βœ”οΈ λͺ¬μŠ€ν„° 곡격 둜직 μ™„λ£Œ
βœ”οΈ λ°°ν‹€ κΈ°λŠ₯ κ΅¬ν˜„ μ™„λ£Œ
βœ”οΈ μ˜ˆμ™Έ 처리 μ™„λ£Œ
βœ”οΈ 캐릭터 데이터 λ‘œλ“œ κΈ°λŠ₯ κ΅¬ν˜„ μ™„λ£Œ
βœ”οΈ 데이터 μ €μž₯ κΈ°λŠ₯ κ΅¬ν˜„ μ™„λ£Œ
βœ”οΈ 파일 μˆ˜μ • 및 μ‚­μ œ
βœ”οΈ μ½”λ“œ λ¦¬νŽ™ν† λ§ 및 버그 μˆ˜μ • μ™„λ£Œ


🌱 μ•žμ— λ©°μΉ λ™μ•ˆλ„ μž‘μ—…μ„ 많이 ν–ˆλŠ”λ°, 였늘 λ””ν…ŒμΌν•˜κ²Œ λ‘œμ§λ“€μ„ κ΅¬μ„±ν•˜κ³  μˆ˜μ •ν•˜λ‹€ λ³΄λ‹ˆ 더 많이 ν•œ 것 처럼 보인닀.

λ­”κ°€ 였늘 ν•  것도 많고, μˆ˜μ •μ΄λ‚˜ μ˜ˆμ™Έ μ²˜λ¦¬ν•  것도 λ§Žμ•˜λ˜ 것 같은데 λŠ¦μ€ μ‹œκ°„μ΄μ§€λ§Œ μ™„λ£Œλ₯Ό ν•˜κΈ΄ ν–ˆλ‹€.

막상 μž‘μ—…ν•˜λ‹€λ³΄λ‹ˆ 둜직 μ§œλ‘” 것도 많고, 였λ₯˜ μˆ˜μ •λ„ μ’€ 빨리된 녀석도 μžˆμ–΄μ„œ λ‚΄κ°€ μ΄λ ‡κ²Œ 많이 ν•΄λ’€λ‚˜ μ‹Άμ—ˆλ‹€.

근데, 이게 쒋은 μž‘μ—… 방법은 μ•„λ‹ˆλΌκ³  ν•˜λŠ”κ²Œ νλ¦„λŒ€λ‘œλ„ μ•„λ‹ˆκ³  μ˜ˆμ™Έμ²˜λ¦¬λŠ” 거의 λ‹€ ν•΄λ‘μ—ˆλŠ”λ°, ν…ŒμŠ€νŠΈλ„ λ§ˆμ§€λ§‰μ— λΆ€λž΄λΆ€λž΄ μ’€ ν•œ κ²½ν–₯도 μžˆμ–΄μ„œ λ‹΄μ—” λ§‰ν˜”λ‹€κ³  λ‹€λ₯Έκ±° λ¨Όμ € ν•˜κΈ°λ³΄λ‹€ 해결을 λ¨Όμ € ν•΄λ³ΌκΉŒλ„ μ‹Άλ‹€.

이게 λ§‰νžˆλ‹ˆκΉŒ μ‰¬μš΄κ±° λΆ€ν„° ν•˜μžκ°€ λ˜μ—ˆκ³ , μ–΄μ©” λ•ŒλŠ” 이게 λ§žλŠ” λ°©λ²•μ΄κ² μ§€λ§Œ μ§€κΈˆμ€ μ’€ 더 λ‚΄κ°€ μ–΄λ–€ κ±Έ κ΅¬ν˜„ν–ˆκ³ , μž‘λ™ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ”κ²Œ 더 μ€‘μš”ν•˜λ‹ˆκΉŒ.


πŸš€ 내일은 아침에 코딩을 λ“£κ³  μ—¬μœ κ°€ λœλ‹€λ©΄ λ„μ „κ³Όμ œλ₯Ό 쑰금 κ΅¬ν˜„ν•œ 뒀에 과제λ₯Ό μ œμΆœν•  μ˜ˆμ •μ΄λ‹€.

그리고 μ˜€ν›„μ— 과제 풀이λ₯Ό λ“£κ³  λ‚œ 뒀에 λ„μ „κ³Όμ œ 남은 뢀뢄듀이 μžˆλ‹€λ©΄, μžˆμ„κ±° κ°™μ§€λ§Œ κ·ΈλΆ€λΆ„ κ΅¬ν˜„ν•˜κ³ μž ν•œλ‹€.

μ‹œκ°„μ΄ λ‚¨λŠ”λ‹€λ©΄ μΆ”κ°€ ν•™μŠ΅μ„ μ§„ν–‰ν•˜κ±°λ‚˜ 강이 풀이 λ“€μ—ˆλ˜κ±Έ TIL에 μ •λ¦¬ν•˜λŠ” μ‹œκ°„μ„ κ°€μ§€μ§€ μ•Šμ„κΉŒ μ‹Άλ‹€.

profile
πŸ’» [25.05.26~] Flutter 곡뢀쀑⏳

0개의 λŒ“κΈ€