TIL

[멋쟁이사자처럼 부트캠프 TIL회고] 74일차

Cadi 2025. 2. 13. 16:36

 

오늘 배운 것

1. 데이터를 가져와서 퀴즈 할당하기

2. 자투리 공부

 

 

1. 데이터 가져와 퀴즈 할당.

이런 CSV 파일 등을 가져와서 VS Code로 확인해보면

 

이런 식으로 나오게 된다. 

 

* CSV에서는 어떤 타입으로 설정할 것인지 설정 가능하다.

 

 



 

 

데이터를 불러온 모습

 

데이터를 나눈 모습

 

 

 

 

 

 

public static List<QuizData> LoadQuizData()
{
    TextAsset quizDataAsset = Resources.Load("QuizData") as TextAsset;
    var lines = Regex.Split(quizDataAsset.text, LINE_SEPARATOR);
    var colHeader = Regex.Split(lines[0], QUESTION_SEPARATOR);

    var quizDataList = new List<QuizData>();

    for (int i = 1; i < lines.Length; i++)
    {
        var values = Regex.Split(lines[i], QUESTION_SEPARATOR);
        QuizData quizData = new QuizData();
        quizData.question = values[0];
        quizData.description = values[1];
        quizData.type = int.Parse(values[2]);
        quizData.answer = int.Parse(values[3]);

        string[] options = { values[4], values[5], values[6] };
        quizData.options = options;

        quizDataList.Add(quizData);
    }
    return quizDataList;
}

 

모든 데이터를 한 번에 읽는 것은 비효율적임, (( 퀴즈를 한 번에 수백개씩 풀진 않으니)

스테이지 별로 해도 되고.. 방법은 자유 , 매개변수로 스테이지 인덱스를 받든 스테이지 이름을 받든, 파일 이름을 받든 해서 분할해서 데이터를 받을 것, 이 경우는 10개씩 끊어서 !

 

private void ChangeQuizCard()
{
    var temp = _firstQuizCardObject;
    _firstQuizCardObject = _secondQuizCardObject;
    _secondQuizCardObject = ObjectPool.Instance.GetObject();
    SetQuizCardPosition(_firstQuizCardObject, 0);
    
    this._startQuizCardIndex++;
    if (this._startQuizCardIndex == _quizDataList.Count)
    {
       this._startQuizCardIndex = 0;
    }
    _firstQuizCardObject.GetComponent<QuizCardController>().SetQuiz(_quizDataList[this._startQuizCardIndex], OnCompletedQuiz);
  
    SetQuizCardPosition(_secondQuizCardObject, 1);
    
    ObjectPool.Instance.ReturnObject(temp);
}

 

스스로 만들어 본 넘어갈 때 퀴즈 내용이 바뀌게 하는 코드. 

 

 

 

2. 자투리 공부

 

과제를 제출하고 남는 시간에 이해가지 않았던 부분을 찾아봤다. 

1. 정규 표현식 관련

 
static string ROW_SEPARATOR = @"\r\n|\n\r|\n|\r";
static string COL_SEPARATOR = @"\s*,\s*";

여기서 @의 역할과 |은 무엇이고 

var lines = Regex.Split(quizDataAsset.text, ROW_SEPARATOR);

string.Split() 메서드를 쓰지 않고 Regex라는 새로운 것을 쓴 이유는 무엇일까 ?

 

우선, @은 문자열을 있는 그대로 표현하기 위해 사용한다. 원래는 '\'를 치면 정해진 방식대로 문자열을 나가게 된다.

예를 들어, \n을 치면 줄 바꿈이 된다. 그런데 우리는 문자열을 있는 그대로 읽고 처리하고 싶어서 @를 앞에 붙여 주었다.

'|' 은 정규 표현식에서의 OR 연산자이다. 그래서 저 줄을 해석하자면

줄 바꿈 문자 ( 윈도우 : \r\n, 리눅스/macOS : \n, macOS : \r) 가 들어간 것을 마주쳤을 때 Split하라는 뜻이다.

 

string.Split 메서드를쓰지 않은 이유는 위의 string 방식이 정규 표현식으로 만들어졌기 때문이다. 

Regex는 정규 표현식을 사용하여 문자열을 검색, 분할, 대체하는 기능을 제공하는 클래스다. 

만일 quizData.Split() 을 사용한다면 문자열을 특정 구분자로 구분할 수는 있겠지만 split은 한 가지 구분자 (우리가 설정한)

만 처리할 수 있따. 반면 Regex는 정규 표현식을 사용하여 여러 종류의 구분자를 한 번에 처리할 수 있다. 

 

더 공부해야 하는 것

https://learn.microsoft.com/ko-kr/dotnet/standard/base-types/regular-expressions

 

.NET 정규식 - .NET

.NET에서 정규식을 사용하여 특정 문자 패턴을 찾고, 텍스트의 유효성을 검사하고, 텍스트 부분 문자열로 작업하고, 추출된 문자열을 컬렉션에 추가합니다.

learn.microsoft.com

 

2. Unity에서 데이터 불러오기

 

오늘 사용한 Resoureces를 사용하는 방식 말고도 다양한 방식이 있다.

1. AssetBundle

: Addressable 시스템 이전에 많이 쓰였던 방식, 게임 데이터를 개별 파일로 패킹해 필요한 시점에 로드

2. Addressable Asset System 

: 게임이 실행되는 동안 필요한 에셋만 메모리에 로드할 수 있어 성능이 좋아진다.

3. StreamingAssets

: 텍스트 파일 ,영상, 사운드 등 외부 리소스 로드할 때

4. PlayerPrefs

5.JSON,XML 등 파일 파싱

6. 데이터베이스

7. Persistent Data Path(외부 저장소 활용)

: 게임 내에서 유저가 생성한 데이터 저장할 때, 세이브 혹은 설정 파일 저장.

 

다양한 방식이 있다. 나중에 필요할 때 하나씩 적용해보며 공부해야지. 

 

3. 구조체 vs 클래스

public struct QuizData
{
    public string question;
    public string description;
    public int type;
    public int answer;
    public string  firstoptions;
    public string secondoptions;
    public string thirdoptions;
}

 

퀴즈 데이터를 다음과 같이 구조체(Struct)로 만든 이유는 

'데이터'로만 기능할 것이기 때문.

참조 타입이 아니기 때문에 불변성을 강하게 유도한다. 

(내부 값이 참조값인 배열과 같은게 잔뜩 있다면 보장은 X)

 

더하자면, 구조체는 스택에 저장되고, 클래스는 힙에 저장된다. 스택은 할당이 빠르고 GC의 영향을 적게 받는다.

큰 데이터 혹은 공유와 참조가 필요하다면 클래스를, 아니라면 구조체를 이용한다. 

큰 데이터의 예시는 16바이트이다. CPU 캐시의 크기가 16바이트이기 때문이다.

-> GPT에게 물어보니 약간 오해의 소지가 있다. CPU 캐시 라인은 보통 64바이트이므로 64바이트 이하로 맞추는 것이 이상적이다 라고 설명한다.

 

다만 이 예시의 경우 string(참조형) 타입이 있기 때문에 메모리 효율성이 좋지는 않다. 

 

오늘의 목표

1. 코테 3문제 이상 풀기

2. 간단하게 정규 표현식 관련 정리

3. 커맨드 패턴 공부