ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게임개발 1일차 (C# 변수, 배열, 조건문, 반복문)
    게임 개발 2025. 5. 23. 16:44

    게임개발을 위해 유튜브 무료 강의를 보고 공부를 시작했다. 조연2 게임 작업실님의 영상을 보며 했다.

    유니티 설치. 비쥬얼스튜디오 2022 설치 후 external script editor를 vs2022로 변경.

     

    double연산자는 크고 느리기 때문에 float연산자 사용. 각 숫자에 f를 붙여야 함. (소수 기본형은 double이라)

     

    str = str2 ?? str3

    str2가 null이면 대신 str3를 넣으라는 뜻

     

    str ??= str2

    str = str ?? str2 즉 본인이 null이면 대신 str2를 넣으라는 뜻

     

    유니티는 C#을 사용하는데 C#에서는 파이썬과 달리 'i' * 3 같은건 안된다.

    Debug.Log(new string('i', 3)) 이런식으로 해야한다고 한다. 아니면 이중반복을 사용하던가.

    c#에서는 대소문자를 구별하고 문자열 string은 " "   문자 str은 ' '을 사용한다.


     

    c#에서 배열을 초기화하지 않으면 기본값이 정해져있다.

    int는 0, boolean은 false, 그 이외에는 null.

     

    배열에는 고정배열과 가변배열이 있다.

    int[,] a = new int[3,4]; 이러면 3x4의 고정 int 배열이 만들어진 것이다.

     

    int[][] a= new int[3][];

    이렇게 하고

    a[0] = new int[2];

    a[1] = new int[3];

    a[2] = new int[4]

    이렇게 하면 가변배열이 만들어진 것이다. 그림으로 보면

    이런 차이가 된다. 참고로 int [2,3][] 처럼 고정배열뒤에 가변배열을 혼합하는 것은 불가능하지만

    int [3][,] 처럼 가변배열뒤에 고정배열이 붙는건 가능하다.

    고정배열이란 것이 선언될 때 아예 딱 자리를 고정해버리는거라 그렇다고 한다.

    int[][] a; #a는 2차원 int 배열 변수
    a = new int[3][]; #행이 3인 2차원 int 배열 생성후 a에 집어넣음 
    a[0] = new int[] { 1, 2, 3 }; #a의 첫 번째 행에 1,2,3 1차원 int배열을 만들어서 넣음
    a[1] = new int[] { 4, 5 };
    a[2] = new int[] { 6, 7, 8, 9 };
    이미 a는 2차원 int 배열 변수로 선언되었기 때문에 int[] a[0]; 이렇게 다시 선언할 필요는 없다.

    위 2줄을 합치면 int[][] a = new int[3][0]; 이 된다.

     

    위 코드를 빠르게 만들면

    int[][] a =
    {
        new int[] { 1, 2, 3 },
        new int[] { 4, 5 },
        new int[] { 6, 7, 8, 9 }
    };

    이렇게 해버릴 수 있다. ( 마치 int[] a = {1,2,3}; 과 비슷한 원리 )

    즉 int[3][]이렇게 초기화를 하거나 아니면 선언과 동시에 요소를 넣어서 간접적으로 [3]임을 알려주거나의 차이

    그러면 왜 int[][] a = {{1,2,3},{4,5},{6,7,8}}은 안되느냐.... 그냥 c#이 그렇다더라 입니다.

     

    참고로 배열은 .Count가 아니라 .Length를 사용해야 한다.

    Debug.Log(string.Join(" ", a)); 이런식으로 1 2 3 처럼 출력되게 할 수 있다.


     

    배열변수가 아닌 컬렉션변수에는 여러가지가 있지만 대표적으로 리스트와 딕셔너리가 있다.

    리스트는 배열과 비슷하지만 유동적이라는게 특징이다. 특정부분에 insert를 하면 알아서 뒤로 쭉 밀린다거나 중간을 빼면 알아서 앞으로 밀린다거나 하는 것.
    List<string> a = new List<string>(); #선언
    a.Add("Hi");  #맨 뒤에 추가: 
    a.Insert(1, "Hello"); #원하는 곳에 삽입:
    a.RemoveAt(0); #원하는 인덱스의 값 제거
    for (int i = 0; i < a.Count; i++)
    {
        Debug.Log(a[i]);
    }

    또는 Debug.Log(string.Join(" ", a));
    이렇게 하면 결과는 Hello my name is SJ가 된다. 참고로 반복문의 범위를 정할 때 a.Count 처럼 동적으로 편하게 정할 수 있다.

     

    a.Contains("SJ") : a리스트가 SJ를 포함하는지 알려준다.

     

    a.IndexOf("SJ") : SJ의 인덱스를 알려준다.

     

    a.Clear() : a 리스트를 밀어버린다.

     

    a.Count : a 요소 개수를 알려준다 (주의 : 괄호 없음)


    Dictionary는 key 기반 자료구조이다. "한국", "서울" 이런식으로 대응된다. key와 value라고 한다.

    그래서 Insert나 RemoveAt이 없다. 순서가 없기 때문이다.

    추가 삭제 등등 모두 key기준으로만 가능하다.

     

    Dictionary<string,string> a = new Dictionary<string,string>(); #선언

    cities.Add("한국","서울"); #추가 또는 수정

    cities["일본"] = "도쿄"; #추가 또는 수정

    Debug.Log(cities["한국"]);  #서울 출력

    cities.ContainsKey("한국"); #한국 키를 가지고 있는지 확인

    cities.ContainsValue("서울"); #서울 값을 가지고 있는지 확인

    cities.Remove("한국"); #키 값 기준으로 제거

    만약 딕셔너리 전체를 보고 싶다면 

    foreach (var item in cities)
    {
        Debug.Log($"{item.Key} : {item.Value}");
    }

    이렇게 적으면 된다.

    foreach는 배열,리스트,딕셔너리 등에서 요소를 하나하나 꺼내주는 함수다.

    var은 KeyValuePair<string, string="">대신 들어감. 자동으로 추론해줘서 넣어줌.</string,>

    $" " 이렇게 하고 변수들을 {}로 감싸면 문자열 하나하나를 " " 로 감싸서 더하는 것보다 훨씬 간단해짐.

    예시 : (a + ":" + b + ":" + c + ":" + d)   vs  ($"{a} : {b} : {c} : {d}")


     

    void Start() 
    {
        List<int> a = new List<int>();
        for (int i = 5; i <= 1000; i+=5)   # 5에서 1000까지 5만큼 증가 (모든 수를 검사할 필요가 없음)
        {
            int j = i;   # j는 i를 복사
            bool valid=true;   # 검사용 변수
            while (j != 0)   # j가 0이 될 때까지
            {
                if (j % 10 != 0 || j % 10 != 5)   # 일의 자리수가 0 또는 5가 아니면
                { 
                    valid = false;   # 이 숫자에는 0이나 5가 아닌 숫자가 있음을 알림
                    break;   # 더 이상의 계산의 무의미 하므로 break
                }
                j /= 10;   # 다음 숫자를 검증하기 위함
            }
            if (valid) a.Add(i);   # valid가 true면 이 숫자에는 불순물이 없으므로 리스트에 넣는다.
        }
        Debug.Log(string.Join(" ", a));
    }


    Dictionary<string, string> a = new Dictionary<string, string>();
    Dictionary<string, string> b = new Dictionary<string, string>();
    a.Add("사과", "apple");
    a.Add("바나나", "banana");
    a.Add("오렌지", "orange");
    string tmp1;
    string tmp2;
    foreach(var item in a)
    {
        tmp1 = item.Key;
        tmp2 = item.Value;
        b.Add(tmp2, tmp1);
    }
    foreach (var item in b)
    {
        Debug.Log($"{item.Key} : {item.Value}");
    }


    int[,] a = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
    int[,] b = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
    int[,] sum = new int[3, 3];
    int[,] mul = new int[3, 3];
    for(int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            sum[i, j] = a[i, j] + b[i, j];
            mul[i, j] = a[i, 0] * b[0, j] + a[i, 1] * b[1, j] + a[i, 2] * b[2, j];   #a는 행을 고정, b는 열을 고정시키고 움직이면서 곱하고 더함
        }
    }
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            Debug.Log($"sum[{i},{j}]= {sum[i, j]}");
        }
    }
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            Debug.Log($"mul[{i},{j}]= {mul[i, j]}");
        }
    }


    for (i=0; i<a.length; i++)보다 foreach(var item in a)를 애용하도록 하자. 7시간 열공 후 마무리!

Designed by Tistory.