3주차 C# 개발 공부

2022. 1. 9. 03:13개발일지/일요일마다 C#

지난 주에 이어 계속해서 C# 공부를 해볼까요오~?

조건문과 반복문으로 코드를 짤 수 있다.

반복문 while(true)는 반복문의 기초라고 할 수 있게습니다.

while문을 사용한 반복문 만들기

static void Main(string[] args)
        {
            while (true)
            {
                string inputString = Console.ReadLine();
                Console.WriteLine(inputString);
            }
        }

디버깅 없이 실행을 하게 되면 cmd 실행을 통해 값을 입력할 수 있게 됩니다.

엔터를 눌러 값을 입력하면 똑같은 값을 재출력하게 됩니다.

그리고 do-while 문의 경우 while문과 똑같지만 처음 한번은 무조건 실행하는 것을 의미합니다.

그것이 거짓이라도 말이지요!

 

다음으로 반복문 for을 사용하는 법은 아래와 같습니다.

for을 사용한 반복문 만들기

static void Main(string[] args)
        {
            for(int i = 0; i < 5; i++)
            {
                Console.WriteLine(string.Format("i의 값은 다움과 같습니다. > {0}", i));
            }
        }

i의 초기 값은 0에서 시작하여 5보다 작을 때까지 i를 1씩 증가시키며 출력하는 것을 반복합니다.

{0}으로 적어주게 되면 i의 값을 그곳에 넣는다는 뜻으로 생각하시면 되겠습니다.

 

한편 반복문 중에는 foreach문이 있습니다.

배열을 배우고 난 후 설명 드리겠습니다.

 

조건문은 좀 더 쉽습니다.

다음은 if를 사용한 조건문입니다.

private static int hp;

        static void Main(string[] args)
        {
            for(hp = 30; hp > 0; hp--)
                if(hp == 30)
                {
                    Console.WriteLine("효과는 부족했다.");
                }
                else if(hp >= 20)
                {
                    Console.WriteLine("효과는 조금있다.");
                }
                else if(hp >= 10)
                {
                    Console.WriteLine("효과는 보통이다.");
                }
                else if(hp > 0)
                {
                    Console.WriteLine("효과는 굉장했다.");
                }
                else
                {
                    Console.WriteLine("기절했다.");
                }
        }

이런 식으로 if 조건문을 사용 가능합니다.
처음에 접근 한정자를 사용하여 int hp를 사용했습니다.

이렇게 사용하게 되면 기절했다는 나오지 않겠죠?

 

그리고 switch case문은 조건문이지만 내부적으로 반복문으로 돌아갑니다.

switch에 변수를 넣어주고

case에 특정 값을 대응해주는 방식으로 진행합니다.

static void C(int a)
            {
            switch (a)
            {
                case 5:
                    Console.WriteLine("이게무슨일이야");
                    break;
                case 0:
                    Console.WriteLine("저리가");
                    break;
                default:
                    Console.WriteLine("아..안돼!");
                    break;
            }
            
            }

그럼 이제부터 Array와 collection을 살펴보려 합니다.

collection은 길이가 자유로이 변하는 배열입니다.

배열은 크기가 고정된 메모리 영역에서 동일한 데이터를 다룬다고 배웠습니다.

그래서 중간 요소 삭제가 불가능하고 실시간 요소 추가가 불가능합니다.

하지만 collection은 이게 가능하고 가변적인 크기를 가집니다.

 

여기서 어떤 타입에 의한 collection을 Generic collection이라고 합니다.

Generic은 어떤 타입에 맞춰서 생성됩니다.

class Collection
    {
        List<int> _list= new List<int>();
        Dictionary<string,string> _dict= new Dictionary<string,string>();
        Queue<int> _Queue= new Queue<int>();
        Stack<int> _Stack= new Stack<int>();
        HashSet<int> _HashSet= new HashSet<int>();
	}

Generic collection 중에서 다음과 같은

list, dictionary, queue, stack을 살펴볼 텐데

foreach 문도 같이 사용해보려 합니다.

기본적으로 for과 구조는 비슷합니다.

 

먼저 list collection 입니다.

순서를 가지고 있으며

0번부터 차례로 데이터가 쌓입니다.

method에는 Add, Remove, Clear, Count 가 있습니다.

list[1] 과 같은 방식으로 데이터를 불러옵니다.

public Collection()
        {
            _list.Add(2000);
            _list.Add(2002);
            _list.Add(2022);
            _list.Remove(2002);
            Console.WriteLine(_list.Count);
            foreach(int item in _list)
            {
                Console.WriteLine(item);
            }
        }

 

다음으로 dictionary collection 입니다.

key-value 로 데이터를 보관합니다.

key 값은 중복되선 안됩니다.

시간 복잡도가 가장 빠릅니다.

Method로는 Add, Remove, Clear, ContainsKey, ContainsValue, Count가 있습니다.

(public collection 문 안에 계속 이어집니다.)

 

_dict.Add("사과", "둥근 열매고 색깔은 빨간색");
            _dict.Add("배", "둥근 열매고 색깔은 노란색");
            _dict.Add("사람", "둥근 열매고 색깔은 노란색");
            foreach (KeyValuePair<string,string> item in _dict)
            {
                Console.WriteLine(item);
            }
            Console.WriteLine(_dict["배"]);
            Console.WriteLine("_____________________");

            if (_dict.ContainsKey("배") == true)
            {
                Console.WriteLine(_dict["배"]);
            }

            string result = null;
            if(_dict.TryGetValue("배", out result) == true)
            {
                Console.WriteLine(result);
            }

 

다음으로 queue collection 입니다.

First in First out 구조를 가집니다.

먼저 들어온 순서대로 나가는 것입니다.

Method로는 Enqueue, Dequeue, peek, Count가 있습니다.

Enqueue는 개체를 넣는 것입니다.

peek은 개체를 제거하지 않고 불러올 때 사용하며

dequeue는 개체를 가져올 후 collection에서 제거합니다.

_Queue.Enqueue(0);
            _Queue.Enqueue(1);
            _Queue.Enqueue(2);
            _Queue.Enqueue(3);

            int person = _Queue.Peek();

            while(_Queue.Count > 0)
            {
                person = _Queue.Dequeue();
                Console.WriteLine(person);

            }

마지막으로 stack collection 입니다.

Last in First out 구조입니다.

가장 나중에 들어온 데이터가 가장 먼저 나가게 되는 것입니다.

한 쪽 끝에서만 자료를 넣고 뺄 수 있습니다.

저장은 push 최근 것부터 꺼내는 것은 pop입니다.

method는 push, pop, peek, Count 가 있습니다.

_Stack.Push(0);
            _Stack.Push(1);
            _Stack.Push(2);
            _Stack.Push(3);

            person = _Stack.Peek();
            while (_Stack.Count > 0)
            {
                person = _Stack.Pop();
                Console.WriteLine(person);
            }

 

그 밖에 HashSet이 있습니다.

중첩이 안되는 리스트를 가집니다.

중첩이 안되므로 이후 값은 false 처리 됩니다.

1 하나만 저장된 것을 확인할 수 있습니다.

 

이렇게 foreach 문을 사용하여 collection에 대해서 살펴봤습니다.

아마 조금 어려울 것이라 생각됩니다.

왜 이 상황에서 이런 코드를 쓰는가 하시는 분들이 계실 겁니다.

코드를 쓰는 방법은 하나의 약속이기 때문에

익숙치 않더라도 방식을 따라 연습해보시면

조금씩 익숙해지실 것이라 생각합니다.

(저 역시 아직 미숙합니다.)

 

다음주에는 저번에 말씀드렸던 상속에 대한 내용과 interface, struct을 다루려고 합니다.

클래스의 경우 상속이 가능한데

이를 부모와 자식 관계로 나타냅니다.

 

다음주 정리를 끝으로 C#의 기본 이론과 활용에 대해 마치게 되면

본격적으로 Unity에 대한 내용을 다루겠습니다.

 

그럼 여러분 다음주에 만나요!

아.. 참고로 제가 글을 작성하는 내용은 수업을 듣고 1주 정도 후에 복습하는 차원에서 진행합니다.

그래서 실제로는 내일 Unity에 대한 내용을 배우게 되는 것이지요!

 

그럼 BYE! BYE!

'개발일지 > 일요일마다 C#' 카테고리의 다른 글

2주차 C# 개발 공부  (0) 2022.01.09
1주차 C# 개발 공부  (0) 2021.12.20