팀프로젝트 : 텍스트 게임
내가 맡은 부분은 몬스터를 잡았을 때 경험치를 얻어서 레벨업을 하는 시스템을 만드는 것이 첫번째, 두번째로는 던전을 클리어하고 보상을 받을 때 보상 목록을 추가하는 것이다. 일단 몬스터를 구현 중에 있어서 경험치를 받았을 때 충족하는 경험치량을 획득하면 레벨업하는 기능을 구현해두긴하였다.
public class Player : ICharacter
{
public int Level { get; set; }
public int Exp { get; set; }
public int requiredExp { get; set; }
public void totalExp()
{
if (requiredExp <= Exp)
{
Level++;
Exp = 0;
Strength_Default += 0.5f;
Defence_Default += 1;
}
}
public void GainExperience(int experience)
{
Exp += experience;
if (Level == 1)
{
totalExp();
requiredExp = 10;
}
else if (Level == 2)
{
totalExp();
requiredExp = 35;
}
else if (Level == 3)
{
totalExp();
requiredExp = 65;
}
else if (Level == 4)
{
totalExp();
requiredExp = 100;
}
}
}
우선 player클래스에 exp와 requiredexp 변수를 생성하고 totalexp()메서드를 생성하여 만약 exp가 requiredexp보다 같거나 높아질 경우 레벨업하고 exp를 0으로 만든다. 그리고 저번 개인 프로젝트에서 구현했던 레벨업 했을 경우에 기본 공격력 0.5, 방어력 1증가 하는 기능을 추가해두었다.
거기에 gainexperience() 메서드를 생성해서 매개변수로 experience를 받도록 하고 그 받은 experience를 exp에 더해서 요구경험치를 채울 수 있도록 만들었다. 아래에는 if로 1레벨일때, 2레벨일때, 3레벨, 4레벨까지 요구 경험치량을 만들고 totalexp() 메서드를 넣어서 요구 경험치를 채우면 레벨업을 할 수 있도록 만들었다. 이제 몬스터들을 완성하고 걔네들을 처치했을 경우 experience를 받아오고 받아온 경험치를 요구 경험치에 채우도록 하여 레벨업을 만들었다. 근데 내가 봐도 좀 많이 단순하게 만들었고, 일일히 1레벨,2레벨,3레벨,4레벨로 각각 만들었기에 유지보수가 힘들다는 단점이 있다. 그래도 일단은 요구하는 기능이 5레벨업까지니까 이렇게 두고 다른 기능들을 다 구현하고 시간남으면 조금 더 가독성 좋고 유지보수 쉽게도 만들어보고 싶다.
Class
매일 14시에 하는 특강이 있다. 오늘은 드디어 클래스를 했는데 나는 개인적으로 코딩하면서 클래스부분이 제일 헷갈리고 어렵다고 생각해서 이번 강의를 들을 때는 특히 집중을 더 많이했고 강의 녹화도 해두었다. 나만 어렵다고 생각했으나 모두에게 class는 아직 어려웠던 모양이다.
Apple apple = new Apple()
사과로 예시를 들었다. 일단 이게 기본적인 클래스의 인스턴스를 불러오는 코드이다.
(클래스) (인스턴스이름) = new (클래스)() 이게 기본 형태이다.
클래스를 알기전에 메모리부분을 조금 이해할 필요가 있었다.

이 사진을 보면 스택에는 클래스 인스턴스와 주소값이 들어있고 힙에는 new 클래스가 들어있다. 간략하게 설명하면 우리가 선언한 부분은 스택으로 가고 메모리는 힙으로 간다. 위 사진은 참조형태라고 하는데 만약 int num = 0;이라고 했을 경우에는 스택에 주소값 부분에 0이 같이 들어간다. 하지만 클래스 자체는 값형태가 아니고 참조 형태라 할당해주는 new Apple()부분은 힙의 주소로 들어가고 선언자체는 스택에 들어가서 힙의 주소를 부르는 형태로 사용하게 된다.

다음 이미지를 보면 Apple apple1 = new Apple()로 인스턴스를 생성하고 다음 인스턴스를 생성할 때 첫번째 인스턴스를 할당했다. 그래서 스택 두곳에서 같은 주소를 바라보고 있기 때문에 이런 경우에는 주소(0)에 해당하는 부분을 수정한다면 첫번째, 두번째 인스턴스 둘다 값이 바뀌게 된다. 이런 느낌으로 돌아가는 부분이었다. 저번주에 개인과제 할 때 player 클래스를 각각 다른 메서드에 두번 호출한 적이 있었는데, 분명 골드를 사용해서 골드가 깍여야하는데 상태창을 보면 골드가 깍여있지 않았다. 원인을 알고보니 인스턴스를 두개 생성해서 서로 다른 값을 쓰고있기때문이었다. 아마도 원리가 지금 이미지에서는 2개의 인스턴쓰가 하나를 바라봐서 바꾸면 둘다 바뀌겠지만 나같은 경우는 스택에 두개 들어가고 힙에도 두개 들어가서 서로 다른 주소를 바라봤기 때문에 그랬다고 생각할 수 있게 되었다.
회고
안그래도 클래스가 되게 어려웠다. 정말 이해가 가지 않았고 사실 온라인 강의로 저번 주에 들었을 때는 좀 부실했다고 생각했다. 그랬기 때문에 저번주 개인과제할 때에도 조금 어려움을 겪었던 것 같은데, 이번에 실시간으로 클래스에 대해서 다시, 깊이 배움을 받을 수 있게돼서 너무 좋았다. 녹화해둔 강의 두고두고 보면서 클래스에 대해 이해를 하고 응용도 할 수 있게 될 수 있으면 좋겠다.