[ 클래스 ]
클래스 변수 사용
//옳은 예
class Program
{
}
class StartGarme
{
}
//틀린 예
class Program
{
class StartGame
{
}
}
클래스는 클래스를 변수로 사용할 수 있다. 이 말은 하나의 파일에 여러 개의 클래스가 들어갈 수 있다는 것이고, 이중클래스의 의미는 아니다.
메모리 구조
메모리의 구조는 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 있다.
코드 영역은 사용자가 실제로 작성한 코드가 실행되는 곳이다.
데이터 영역은 대표적으로 static을 사용한 코드가 있다. static은 프로젝트 전반에 필요하고 공유되어야 하는 데이터에 사용한다.
int num; 처럼 변수를 선언했을 때에는 스택 영역에 들어간다. 그리고 num 변수에 값 1을 할당하면, 이 데이터는 스택 영역에서 자리를 차지하고 있던 num 변수의 공간에 함께 들어간다. 이처럼 선언, 데이터가 한 공간에 들어가는 것을 값 형식이라고 한다. 따라서 값 형식은 스택 영역만 사용한다.
값 형식은 변수에 데이터를 직접 저장해서, 다른 변수에 할당하거나 전달할 때 값이 복사된다. 따라서 하나의 값형 변수에서 수정이 이루어져도 다른 변수에는 영향을 미치지 않는다. 대표적으로 int, float, bool과 같은 기본 자료형이 있다.
클래스는 변수와 다르게 선언은 스택 영역으로 들어가지만, 실제 데이터는 힙 영역에 들어간다. 스택 영역에 있는 클래스는 힙 영역에 있는 데이터의 주소값을 받아와서 사용한다. 이처럼 주소값을 통해서 스택 영역에서 데이터를 참조하기 때문에 참조 형식이라고 부른다. 참조 형식은 선언은 스택 영역에, 데이터는 힙 영역에 들어있다.
Item item1 = new Item(); 에서 선언 부분인 Item item1은 스택 영역으로 가고, 데이터 부분인 new Item()은 힙 영역으로 간다. 그리고 item1은 new Item()의 주소값을 받아와서 해당 데이터를 참조한다. 마찬가지로 객체를 또다시 새로 생성했을 때, Item item2 = item1;에서 item2은 스택 영역으로 간다. item1의 데이터는 new Item()로, 힙 영역에 있기 때문에 같은 주소값을 사용한다.
이처럼 참조 형식은 데이터의 주소를 저장해서 다른 변수에 할당하거나 전달할 때 데이터 주소가 복사된다. 따라서 하나의 참조형 변수에서 수정이 이루어지면 이를 참조한 다른 변수들도 모두 변화하게 된다. 대표적으로 클래스, 배열, 인터페이스 등이 있다.
선언
Item item = new Item();
다양한 종류의 아이템이 있는 Item 클래스에서 아이템이라는 실체인 item 객체를 만들기 위해서는 위의 코드를 통해서 생성할 수 있다. 이를 객체화, 인스턴스화라고 한다. new 키워드를 사용하면 객체를 생성한다는 의미이다.
class Item
{
public string type = "potion";
public string effect = "Hp";
public int figure = 10;
public Item() //1. 기본값 사용
{
//멤버 변수에 이미 세팅된 기본값을 사용
}
public Item(string itemType, string itemEffect, int itemFigure) //2. 기본값 세팅
{
type = itemType;
effect = itemEffect;
figure = itemFigure;
}
public Item(string itemEffect) //3. 기본값 일부 세팅
{
effect = itemEffect;
}
}
class Program
{
static void Main()
{
Item hpPotion = new Item(); //1번 생성자 사용
Item sword = new Item("weapon", "attack power", 50); //2번 생성자 사용
Item mpPotion = new Item("Mp"); //3번 생성자 사용
}
}
소괄호 안에 기본값을 세팅할 수도 있다. 클래스 필드에 기본값을 설정하고, 생성자에서 매개변수를 통해 새로운 값으로 초기화할 수 있다.
위 코드에서는 hpPotion, sword, mpPotion 총 3개의 변수를 선언해서 스택 영역에 3개가 들어갔고, new 키워드가 3개이므로 힙 영역에도 3개가 들어갔다.
박싱, 언박싱
박싱은 값 형식을 참조 형식으로 변환하는 것이고, 언박싱은 참조 형식을 값 형식으로 변환하는 것이다.
[ 캐릭터 이름 생성 ]
문제점
전반적인 게임이 진행되는 GameManager 클래스에 게임을 시작했을 때 캐릭터의 이름을 설정하는 기능을 추가했다. 직업 선택 기능을 구현하려고 보니, 기능이 모두 GameManager 클래스에 몰리게 되는 상황이 됐다.
시도한 것
Player와 관련된 기능은 Player 클래스에 옮기고 Player 클래스를 참조했는데 오류가 발생했다.
해결 방법
Player 클래스에서 NameInput 메서드에 전역 접근이 가능하도록 static 키워드를 추가했다.
알게 된 것
기능을 구현할 때, 그 기능과 관련있는 클래스에 작성하면 좋다.
다른 클래스에서 참조를 할 때에는 참조하려는 것에 static 키워드가 있어야 한다.
[ 회고 ]
본격적인 팀 프로젝트를 시작했다. 다들 역할을 어떻게 분배해야 할지를 몰라서 쉽게 시작을 못했는데, 튜터님께 질문을 통해서 답을 얻었다. 한 기능을 여러 사람이 맡아서 진행하는 것보다는 한 사람당 한 기능을 맡는 것이 훨씬 효율적이고 일을 하기 편하다는 것이다. 필수 구현 기능에만 너무 매몰되어서 전투 기능을 반드시 먼저 다 구현한 뒤에 선택 구현 기능을 해야 한다는 생각이었는데, 기간이 긴 만큼 선택 구현 기능도 반드시 하게 될 것이니 미리 그 부분까지 포함해서 생각하면 역할을 나누기가 더 쉬웠다. 바로 앞의 목표만을 생각하기보다는 전체적인 그림을 보고 일을 진행하려는 태도가 필요하다고 생각됐다.
혼자서 게임을 만들 때는 모든 기능을 오로지 다 내가 만들어야 하니까 부담이 컸지만, 팀으로 역할을 나눠서 진행을 하니까 부담도 적고 다같이 하나의 프로젝트를 완성해 간다는 느낌이 좋았다. 특히 처음으로 깃 허브를 통해 다른 팀원들과 결과물을 공유하며 머지하는 작업이 은근한 재미가 있었다. 비록 시작까지의 과정은 어려웠지만, 막상 한 걸음을 떼고 나니 그 이후는 꽤나 수월하게 나아갈 수 있었다.
'Coding > C#' 카테고리의 다른 글
[내일배움캠프 15일차 TIL] 로직 설계, 기능별 파일 구분, 폴더 구조 (0) | 2024.05.03 |
---|---|
[내일배움캠프 14일차 TIL] 추상 클래스, 인터페이스 (0) | 2024.05.02 |
[내일배움캠프 12일차 TIL] 인터페이스, enum, 델리게이트, 람다, Func, Action, LINQ, Nullable (0) | 2024.04.30 |
[내일배움캠프 11일차 TIL] 배열과 리스트 비교, 로직 설계 방법 (0) | 2024.04.29 |
[내일배움캠프 10일차 TIL] 멤버, 클래스 상속, 유니티 라이프 사이클 (0) | 2024.04.26 |