개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 C#의 리스트에 대해서 알아봅시다.

 

타임라인

0:00 인트로

0:08 리스트란?

0:38 리스트 생성과 데이터 저장

1:55 반복문으로 리스트 안의 데이터 출력하기

3:36 리스트 안의 데이터 찾기

4:20 리스트 안의 데이터 삭제하기

5:35 아웃트로

 

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번에는 C#의 리스트에 대해서 알아보겠습니다.

리스트란?

먼저 간단하게 이야기해서 리스트는 이름 그대로 하나의 목록처럼 배열과 유사한 방식으로 데이터들을 저장하는 컨테이너입니다.

C# 기초 중에 배열에 대해서 배우신 분들이라면 여러 개의 값들을 묶어서 배열로 저장하는 방법을 기억하고 계실 겁니다.

하지만 배열의 단점은 그 크기가 생성 당시의 크기로 제한이 되기 때문에 배열의 크기를 변경하기 위해서는 배열을 새로 만들어야 합니다.

하지만 리스트는 동적으로 크기가 바뀌기 때문에 그럴 필요가 전혀 없고 메모리가 허용하는 만큼 자동으로 늘어납니다.

리스트 생성과 데이터 저장

먼저 리스트를 만드는 방법을 알아보겠습니다.

리스트를 만들기 위해서는 리스트가 포함되어 있는 System.Collections.Generic 네임스페이스를 using 선언해줘야 합니다.

그 다음 List를 선언하고 뾰족괄호 안에 이 리스트가 저장하고자 하는 데이터 타입을 넣어주면 됩니다.

지금은 int로 적겠습니다.

참고로 이렇게 뾰족괄호 안에 원하는 타입을 넣는 방식은 제네릭이라고 하며 원하는 데이터 타입을 넣을 수 있게 해주는 개념입니다.

이런 제네릭 개념이 없으면 넣고자 하는 데이터 타입에 따라서 IntList, FloatList, StringList 등 같은 기능을 제공하지만 안에 담는 데이터가 다른 클래스들이 무수히 많이 생겨나게 됩니다.

물론 이에 대한 자세한 내용은 추후에 제네릭을 다루는 강좌에서 이야기해보도록 하겠습니다.

이렇게 새로 선언한 리스트는 new 키워드를 사용해서 할당하고 사용하면 됩니다.

그리고 이 리스트에 데이터를 저장하는 방법은 아주 간단합니다.

이런 식으로 Add 함수를 호출하고 매개변수에 넣을 데이터를 입력해주면 됩니다.

이렇게 Add 함수로 넣어준 데이터들은 리스트 안에 넣어준 순서대로 저장됩니다.

이 방법 외에도 Insert 함수를 사용하면 데이터를 맨 끝자리가 아니라 원하는 위치에 넣을 수도 있습니다.

이렇게 첫 번째 매개 변수에는 숫자가 들어갈 위치를 넣고, 두 번째 매개 변수에는 들어갈 데이터를 넣어줍니다.

반복문으로 리스트 안의 데이터 출력하기

앞에서는 리스트 안에 데이터를 넣는 방법을 알아보았으니 이번에는 반복문을 이용해서 리스트를 순회하면서 리스트 안에 들어있는 데이터를 출력해보겠습니다.

먼저 리스트를 순회하는 방법은 크게 두 가지가 있습니다.

먼저 for문을 이용하는 방법입니다.

for문을 이용해서 두 번째 i의 비교 대상에 리스트의 Count, 즉 리스트 안에 들어있는 아이템의 갯수를 넣어주면 for 문은 리스트 안에 들어있는 아이템의 갯수만큼 반복하게 됩니다.

그리고 그 안에서 리스트의 각 방에 접근하여 데이터를 출력하면 이렇게 콘솔창에 표시됩니다.

두 번째 방법은 foreach문을 이용하는 방법입니다.

foreach를 사용하면 따로 방 번호에 해당하는 인덱스 값을 사용하지 않고 리스트를 순회할 수 있습니다.

역시 출력하고 나면 for문으로 순회하며 출력했을 때와 같은 결과를 얻을 수 있습니다.

그럼 for문을 사용해서 하는 리스트 순회와 foreach문을 사용해서 하는 리스트 순회는 어떤 차이가 있으며 어떤 방식이 더 나은지 궁금해하시는 분들이 있을 겁니다.

좋은 자세입니다.

그런 작은 궁금증을 가지고 계속해서 공부하는 자세가 여러분들이 더 나은 프로그래밍 실력을 쌓는 데 큰 발판이 될 겁니다.

먼저 이 두 방식은 성능적인 면에서 현재의 컴퓨터에서는 유의미한 차이를 보이지는 않습니다.

다만, 사용 방식에 따라 다르게 사용하면 되는데, 리스트에 접근하는 방 번호가 유의미하지 않으며 모든 리스트 방을 순차적으로 돌아야 한다면 foreach문을 사용하면 되고, 방 번호가 유의미한 계산에 따라 방을 선택해서 작동해야 한다면 for문을 사용하면 됩니다.

그리고 또 한 가지, 순회하는 도중에 리스트에 데이터를 추가하거나 삭제하는 등의 변동이 발생한다면 for문을 사용하는 것이 좋습니다.

데이터 찾기

그 다음에는 리스트에 데이터를 넣어두고 나중에 필요할 때 원하는 데이터를 꺼내쓰거나 원하는 데이터가 리스트의 어느 위치에 있는지 확인할 수 있어야 합니다.

먼저 Contains 함수를 사용하면 원하는 데이터가 리스트 안에 들어있는지 일일이 반복문을 사용하지 않고도 확인할 수 있습니다.

그리고 원하는 데이터가 리스트의 몇 번째 위치에 있는지 찾는 방법은 IndexOf 함수를 사용하면 됩니다.

참고로 IndexOf 함수를 사용할 때 리스트 안에 들어있지 않은 값을 넣으면 -1을 돌려줍니다.

데이터 삭제하기

리스트에 저장한 데이터는 계속해서 저장해두는 것이 아니라 필요에 따라서 더 이상 필요하지 않은 데이터는 리스트에서 삭제해야 합니다.

그러므로 이번에는 리스트에서 데이터를 삭제하는 방법을 알아보겠습니다.

리스트에서 데이터를 삭제하는 방법 역시 간단합니다.

Remove 함수를 호출하고 매개 변수에 지우고자 하는 값을 넣어주면 됩니다.

다만 이 때 같은 값이 여러 개가 들어있다면 리스트에서 가장 앞에 있는 값만 지워집니다.

그러므로 같은 값들이 모두 삭제되기를 원한다면 RemoveAll 함수를 사용해야 합니다.

다만, RemoveAll 함수는 조금 복잡한 매개 변수를 넣어줘야 하니 이 부분은 적당히 알아두시면 됩니다.

이 외에도 RemoveAt 함수로 리스트의 원하는 위치에 있는 값을 지울 수도 있고 RemoveRange 함수를 사용하면 원하는 위치에서부터 특정한 범위 안에 있는 값을 삭제할 수도 있습니다.

마지막으로 Clear 함수를 사용하면 리스트 안에 있는 모든 데이터를 삭제할 수 있습니다.

아웃트로

이번 영상에서는 C#의 리스트에 대해서 알아보았습니다.

이 외에도 리스트에는 훨씬 많은 기능이 있습니다.

상세한 기능들에 대해서는 강좌 요청이 있다면 추후에 만들어보도록 하겠습니다.

이 강좌는 시청자 여러분들의 시청과 후원으로 제작되었습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 유니티 2020에서 추가된 Properties 기능에 대해서 알아봅시다.

 

사용 엔진 버전 : 2020.3

 

타임라인

0:00 인트로

0:08 인스펙터에서 여러 개의 오브젝트를 컨테이너에 담기

0:26 1. 일일이 집어넣기

0:43 2. 인스펙터 잠그기

1:13 3. Properties 이용하기

1:45 아웃트로

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번에는 유니티 에디터의 Properties 기능에 대해서 알아보겠습니다.

인스펙터에서 여러 개의 오브젝트를 컨테이너에 담기

유니티에서는 에디터의 인스펙터에서 오브젝트를 담을 컨테이너를 이렇게 스크립트에서 리스트나 배열로 만들 수 있습니다.

스크립트에서 만든 리스트나 배열은 에디터에서 이렇게 보여지죠.

그리고 이 컨테이너에 씬 안에 있는 오브젝트를 끌어넣을 수 있습니다.

1. 일일이 집어넣기

그런데 한꺼번에 여러 개의 오브젝트를 넣기 위해서 여러 오브젝트를 선택하면 컴포넌트가 붙어있는 오브젝트의 선택이 풀리면서 인스펙터에서 사라집니다.

그래서 인스펙터를 잠그는 방법을 몰랐을 때는 오브젝트를 하나하나 선택해서 일일이 집어넣을 수 밖에 없었죠.

2. 인스펙터 잠그기

하지만 인스펙터 뷰 우측 상단에 있는 자물쇠 모양 버튼을 클릭하면 인스펙터가 잠기면서 지금 선택한 오브젝트로 인스펙터가 고정됩니다.

그러면 다른 오브젝트를 선택해도 인스펙터가 바뀌지 않고 여러 오브젝트를 한꺼번에 컨테이너에 넣을 수 있게 되죠.

하지만 인스펙터 잠금을 푸는 것을 깜빡하면 다른 오브젝트를 변경하기 위해 선택해도 인스펙터가 변경되지 않아서 헤매게 되는 실수가 발생합니다.

그래서 작업이 끝나면 인스펙터 잠금을 일일이 풀어줘야 한다는 단점도 있습니다.

3. Properties

이 모든 단점을 해결하기 위한 기능이 바로 Properties입니다.

이 기능은 2020 버전에 추가된 기능으로 게임 오브젝트에 우클릭하고 제일 아래의 [Properties...] 항목을 선택하면 Properties 창이 열리며 인스펙터에서 보이는 것과 동일한 내용을 볼 수 있게 됩니다.

여기서는 다른 오브젝트를 선택해도 Properties 창의 내용이 바뀌지 않습니다.

그래서 여러 오브젝트를 선택해서 컨테이너로 한 번에 넣어줄 수 있습니다.

그리고 작업이 끝나면 어떤 잠금을 푼다던가 하는 일에 신경쓰지 않고 그냥 Properties 창을 꺼버리면 됩니다.

아웃트로

이번 영상에서는 유니티 에디터의 Properties 기능에 대해서 알아보았습니다.

이 강좌는 시청자 여러분들의 시청과 후원으로 제작되었습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

foreach 

배열과 컬렉션를 위한 반복문

 

기본적인 for문

 

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

for (int i = 0; i < numbers.Length; i++)

{

    Console.Write(numbers[i] + " ");

}

Console.WriteLine("");

 

C# 프로그래밍에서 기본적으로 사용되는 배열 반복문은 위의 코드와 같이 for문을 사용한다.. C#의 배열은 기본적으로 배열 안에 있는 요소의 수를 Length 프로퍼티로 알려주기 때문에 C++처럼 for문을 사용하다가 Index Out Of Range Exception이 발생할 가능성은 적다.

 

List<int> numList = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

for (int i = 0; i < numList.Count; i++)

{

    Console.Write(numbers[i] + " ");

}

Console.WriteLine("");

 

for문을 이용한 리스트의 순회 역시 배열의 순회와 거의 같은 형태를 취하기 때문에 사용에 큰 어려움은 없다고 느낄 수 있다.

 

Dictionary<int, int> numDictionary = new Dictionary<int, int>() { { 0, 0 }, { 1, 1 }, { 2, 2 } };

for(var enumerator = numDictionary.GetEnumerator(); enumerator.MoveNext(); )

{

    Console.Write(enumerator.Current.Key + ":" + enumerator.Current.Value + " ");

}

Console.WriteLine("");

 

하지만 for문을 사용해서 딕셔너리를 순회하려고 하면 위의 코드와 같이 열거자를 활용해서 코드를 작성해야하기 때문에 코드가 길어지고 열거자에 대해서 아직 익숙하지 않은 개발자라면 쉽게 사용하기가 어렵다.

 

 

foreach문을 사용한 컬렉션 순회

 

그렇다면 이제 foreach문을 사용한 예시 코드를 보자.

 

int[] numbers = new int[10] { 01234, 56789 };

foreach(var num in numbers)

{

    Console.Write(num + " ");

}

Console.WriteLine("");

 

List<int> numList = new List<int>() { 0123456789 };

foreach (var num in numList)

{

    Console.Write(num + " ");

}

Console.WriteLine("");

 

Dictionary<intint> numDictionary = new Dictionary<intint>() { { 0}, { 11 }, { 22 } };

foreach (var num in numDictionary)

{

    Console.Write(num.Key + ":" + num.Value + " ");

}

Console.WriteLine("");

 

이번에는 배열, 리스트, 딕셔너리의 예시를 한꺼번에 작성했다. foreach문을 사용해서 딕셔너리를 순회하면 열거자를 사용할 때보다 훨씬 코드가 짧아지고 리스트나 배열에서도 조금 더 작성이 편해지는 것을 알 수 있다.

 

List<int> numList = new List<int>() { 0123456789 };

foreach (var num in numList)

{

    Console.Write(num + " ");

}

Console.WriteLine("");

 

간단하게 리스트를 순회하는 foreach문을 예시로 들어서 설명해보자면 foreach (var 임시변수 in 순회하고자 하는 컬렉션)으로 매 반복마다 순회하고자 하는 컬렉션의 요소를 받아와서 사용하는 방식이다. foreach는 컬렉션의 순회가 끝나면 자동으로 반복을 중지하기 때문에 Index Out Of Range Exception이 발생할 염려가 없다.

 

 

foreach문의 다차원 배열 순회

 

int[,] array = new int[2, 3]

{

    { 0, 1, 2 },

    { 3, 4, 5 },

};

 

for (int i = 0; i < 2; i++)

{

    for (int j = 0; j < 3; j++)

    {

        Console.WriteLine(string.Format("multiLayerArray[{0},{1}] :: {2}", i, j, array[i, j]));

    }

}

 

foreach (var num in array)

{

    Console.WriteLine(num);

}

 

foreach문을 사용하면 다차원 형태의 배열 역시 순회가 손쉽게 가능하다. for문을 이용해서 다차원 배열을 순회하려면 n차원에 대해서 n중 for문을 구현해야하지만 foreach문을 이용하면 단 하나의 for문으로 다차원 배열의 순회가 가능해진다.

 

하지만 이것은 각각의 장단점이 명확하게 갈린다. 다차원 배열의 경우, foreach문으로 순회하면 코드가 간단해지는 장점이 있지만, for문을 통한 다차원 배열의 순회처럼 각각의 인덱스에 대한 처리가 어려워진다.

 

 

foreach를 활용한 enum 순회

 

public enum DayOfWeek { Monday = 1, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }

 

foreach (int dow in Enum.GetValues(typeof(DayOfWeek)))

{

    Console.WriteLine(string.Format("{0}번째 요일", dow));

 

}

 

foreach (string dow in Enum.GetNames(typeof(DayOfWeek)))

{

    Console.WriteLine(dow);

}

 

foreach와 Enum 클래스를 이용해서 enum에 대한 순회역시 가능하다.

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

 

반응형

+ Recent posts