[ 배열 VS 리스트 ]
배열(Array)은 크기가 1로 고정되지 않고, 확장성을 가지고 있어 크기를 그 이상으로 설정할 수 있다. 하지만 한 번 크기를 설정하고 난 이후에는 크기를 바꿀 수 없는 정적 배열이다. 만약 크기를 바꾸고 싶다면 새로운 배열을 선언해야 한다. 게임에서는 스킬들을 배치하는 스킬 단축키에서 쓰일 수 있다.
메모리에 데이터가 연속적으로 저장되어 있고, 메모리 내에 데이터들이 정리가 되어 있기 때문에 새로운 데이터를 추가할 수가 없다. 따라서 원래 배열에서 새로운 데이터를 추가하고 싶다면, 기존의 배열을 바탕으로 새로 생성해서 자리를 만들어야 한다. 하지만 자리가 고정되어 있기 때문에 접근하는 것이 용이하다. 선언한 크기를 모두 사용하면 리스트보다 메모리를 효율적으로 사용할 수 있지만, 다 사용하지 않는다면 비효율적이다.
리스트(List)는 크기가 계속해서 변하기 때문에 크기를 지정하지 않는 동적 배열이다. 예를 들어 공간을 확장할 수 있는 인벤토리에서 쓰일 수 있다. 리스트는 정해진 크기가 없기 때문에 요소 추가, 제거가 용이하다. 하지만 데이터가 비연속적으로 저장되어 있어서, 고정된 자리가 없기 때문에 주변 데이터의 주소를 참조하여 순차적으로 접근해야 한다.
리스트가 확장되는 원리는 다음과 같다. 리스트에는 Capacity라는 내부적으로 할당된 메모리 공간의 크기가 있다. 이는 리스트가 저장할 수 있는 요소의 최대 개수를 의미한다. Count는 리스트에 현재 저장된 요소의 개수를 뜻한다. 만약 Count가 Capacity를 초과하면, 리스트는 현재 크기의 2배로 배열을 복사 후 새로 생성하여 내부 배열의 크기를 자동으로 늘린다. 이러한 과정을 배열 재할당이라고 하며, 배열 재할당이 이루어질 때마다 성능에 좋지 않다. 따라서 리스트에 요소를 많이 담을 예정이라면, 처음부터 Capacity를 크게 설정하는 것이 좋다.
[로직 설계 방법]
맨 처음으로 전체적인 구조를 간단하게 와이어 프레임으로 도식화해서 화면 구성을 정리해야 한다. 전문적인 기능을 제공하는 웹 사이트를 이용해도 되고, 프레젠테이션으로 간단히 만들어도 된다.
나는 하나의 파일에 모든 코드를 담았다. 모든 기능이 하나에 담겨 있으니까 분류가 제대로 되지 않아서 필요한 코드를 바로 찾는 것이 어려웠다. 스파르타던전 텍스트 게임에서는 크게 4가지 cs 파일로 나눌 수 있다.
1. GameManager: 전체적인 게임 흐름 관리
2. Item: 아이템 정보
3. Player: 캐릭터 정보
4. ConsoleUtility: 콘솔 서브 기능
이렇게 클래스 단위로 cs 파일을 나눠서 코드를 작성해야 한다. Item, Player처럼 각각의 아이템이나 캐릭터 정보들을 리스트로 묶어서 저장하면 관리하기 편하다. 처음에 했던 것처럼 1개의 클래스에서 진행했을 때의 문제점은 Program 클래스에서 Main 메서드에서 static으로 정의 되어있으면, static이 아닌 변수나 메서드는 접근이 불가능해서 구조상 다른 것들도 다 static이 붙게 된다는 것이다. 위처럼 기능별로 나누고 나면 Program 클래스에 GameManager를 생성하고, GameManager가 로직을 수행하도록 한다.
[ 알짜 지식 ]
static
클래스 단위에서 저장되는 변수이다. 인스턴스마다 갖고 있지 않고 클래스에 하나만 존재한다.
생성자
일종의 객체를 만드는 틀로, 클래스와 이름이 같은 함수이다.
프로퍼티
클래스나 구조체의 필드(멤버 변수)에 접근하기 위한 방법으로, 필드의 값을 읽는 get 접근자와 설정하는 set 접근자를 통해 필드의 값을 캡슐화할 수 있다. 변수에 직접 접근하는 것보다 데이터를 안전하게 보호할 수 있고, 필드에 접근하지 않고도 복잡한 로직을 구현할 수 있다.
Ctrl + .
VS에서 Ctrl + . 키를 누르면 해당 이름을 가진 클래스, 메서드 등을 생성할 수 있다.
[ 회고 ]
클래스를 나눌 때는 기능별로 나누는 것이 효율적이라는 것을 알게 됐다. 하나의 파일에 모든 로직을 구현하면, 코드 상의 문제와 관리 상의 문제 등이 존재한다. 따라서 프로젝트를 시작하기 전에는 내가 구현할 기능이 어떤 것이 있고, 각 기능별로 어떤 구조를 가지고 있는지 도식화를 통해 간단하게라도 파악하는 것이 우선이라는 것을 배웠다. 이전의 문제점은 구현해야 할 기능들을 머릿속으로만 대충 생각하면서 순서대로 만들었는데, 그랬더니 어떤 것을 먼저 해야 할지 감이 잘 잡히지 않았고, 우왕좌왕하면서 시간을 낭비하곤 했다. 앞으로는 머릿속에 있던 것을 정리하는 작업을 통해 초기 단계를 확실히 잡고 가야겠다.
'Coding > C#' 카테고리의 다른 글
[내일배움캠프 13일차 TIL] 클래스 메모리 구조, 기본값 세팅, 박싱/언박싱 (0) | 2024.05.01 |
---|---|
[내일배움캠프 12일차 TIL] 인터페이스, enum, 델리게이트, 람다, Func, Action, LINQ, Nullable (0) | 2024.04.30 |
[내일배움캠프 10일차 TIL] 멤버, 클래스 상속, 유니티 라이프 사이클 (0) | 2024.04.26 |
[내일배움캠프 9일차 TIL] Txt 게임 만들기 (1) | 2024.04.25 |
[내일배움캠프 8일차 TIL] 비트 연산자, 시프트 연산, 단축 평가, 비트 플래그, 2진법 (0) | 2024.04.24 |