STIKA

내일배움캠프 Unity 9일차 TIL - C# 문법 2-2 본문

프로그래밍/Unity + C#

내일배움캠프 Unity 9일차 TIL - C# 문법 2-2

STIKA 2024. 1. 4. 18:23

24.01.04 Thu

 

❤️ TIL

Today I Learned

❤️하루에 1%씩만 나아가도 4개월 동안 쌓이면 꽤 덩치가 커진답니다 :)


📌 오늘의 계획

  • C# 문법 2주차 컬렉션, 메서드, 구조체
  • C# 문법 3주차

 

 

✏️ 작업 내용

[컬렉션 (Collection) ]

자료를 모아 놓은 데이터 구조를 의미

  • 컬렉션은 배열과 비슷한 자료 구조
  • 배열과는 다르게 크기가 가변적
  • 사용하기 위해서는 System.Collections.Generic 네임스페이스를 추가

 

List

  • List는 가변적인 크기를 갖는 배열
  • List를 생성할 때는 List에 담을 자료형을 지정
List<int> numbers = new List<int>();

int형 빈 리스트 생성

numbers.Add(1);
numbers.Add(2);
numbers.Add(3);

numbers.Remove(2);

Add : List에 데이터 추가

→ 넣은 순서대로 가변적으로 생김

Remove : List에서 데이터 제거

→ 2 라는 데이터 제거

foreach(int number in numbers)
{
    Console.WriteLine(number);
}

출력 : 1, 3

 

List 에는 length가 없다

실제로 데이터상 이어져있는게 아니라서 count가 있음

 

 

Dictionary

  • 딕셔너리는 키와 값으로 구성된 데이터를 저장
  • 중복된 키를 가질 수 없으며, 키와 값의 쌍을 이루어 데이터를 저장
Dictionary<string, int> scores = new Dictionary<string, int>();

Dictionary 생성

scores.Add("Alice", 100);
scores.Add("Bob", 80);
scores.Add("Charlie", 90);
scores.Remove("Bob");

Add : 데이터 추가

Remove : 데이터 삭제 

→ 키 값을 삭제 하면서 값도 삭제

foreach(KeyValuePair<string, int> pair in scores)
{
    Console.WriteLine(pair.Key + ": " + pair.Value);
}

출력방법

 

 

Stack

후입선출(LIFO) 구조를 가진 자료 구조

[int형 Stack 선언]
Stack<int> stack1 = new Stack<int>();

[추가]
stack1.Push(1);
stack1.Push(2);
stack1.Push(3);

[가져오기]
int value = stack1.Pop();

value = 3이 나옴

LIFO여서 마지막에 추가된 요소가 나옴

 

 

Queue (큐)

선입선출(FIFO) 구조를 가진 자료 구조

[int형 Queue 선언]
Queue<int> queue1 = new Queue<int>();

[추가]
queue1.Enqueue(1);
queue1.Enqueue(2);
queue1.Enqueue(3);

[가져오기]
int value = queue1.Dequeue();

value = 1이 나옴

FIFO여서 가장 먼저 추가된 요소가 나옴

 

 

HashSet

중복되지 않은 요소들로 이루어진 집합

→ 알고리즘때 더 자세히 설명

[int형 HashSet 선언]
HashSet<int> set1 = new HashSet<int>();

[추가]
set1.Add(1);
set1.Add(2);
set1.Add(3);

[가져오기]
foreach (int element in set1)
{
    Console.WriteLine(element);
}

 

 

[배열과 리스트의 차이]

리스트는 동적으로 크기를 조정할 수 있어서 유연한 데이터 구조를 구현

데이터의 크기와 사용 목적을 고려하여 배열과 리스트 중 적절한 것을 선택

 

리스트의 단점

  • 메모리 사용량 증가 : 리스트는 배열보다 많은 메모리를 사용
    많은 데이터를 다루는 경우 메모리 사용량이 급격히 증가하여 성능 저하를 유발
  • 데이터 접근 시간 증가 : 리스트는 연결 리스트(linked list)로 구현
    리스트에서 특정 인덱스의 데이터를 찾기 위해서는 연결된 노드를 모두 순회해야 하기 때문
  • 코드 복잡도 증가 : 데이터 추가, 삭제 등의 작업이 배열보다 간편
    이러한 유연성은 코드 복잡도를 증가, 코드의 가독성과 유지보수성이 저하
  •  

 

[메서드]

 

함수와 메서드의 차이점

함수는 어디에 속해있지 않고 단독 모듈이라 함수를 그냥 호출하여 사용이 가능

메서드는 함수의 일종이긴 하지만 클래스 안에 속해 있고 클래스의 멤버 변수들을 이용해서 구현된 것

 

공통점, 장점

코드의 재사용성

코드의 가독성과 유지보수성 개선

 

 

메서드 오버로딩 개념과 활용

  • 동일한 이름의 메서드를 다양한 매개변수 목록으로 다중 정의
  • 매개변수의 개수, 타입, 순서가 다른 동일한 이름의 메서드로 정의 가능
  • 호출 시 매개변수의 형태에 따라 적절한 메서드가 호출
  • 버로딩은 메서드의 기능이나 작업은 동일하지만 입력값에 따라 다르게 동작해야 할 때 사용
void PrintMessage(string message)
{
    Console.WriteLine("Message: " + message);
}

void PrintMessage(int number)
{
    Console.WriteLine("Number: " + number);
}

// 메서드 호출
PrintMessage("Hello, World!");  // 문자열 매개변수를 가진 메서드 호출
PrintMessage(10);  // 정수 매개변수를 가진 메서드 호출

 

 

재귀 호출

자칫 잘못하면 무한루프에 빠질수 있는 재귀 호출

  • 자기 자신을 호출하는 것
  • 문제를 작은 부분으로 분할하여 해결하는 방법 중 하나로,
    작은 부분의 해결 방법이 큰 문제의 해결 방법과 동일한 구조를 갖고 있는 경우에 적합
  • 재귀 호출은 호출 스택에 호출된 메서드의 정보를 순차적으로 쌓고,
    메서드가 반환되면서 스택에서 순차적으로 제거되는 방식으로 동작

(벌써 어렵)

void CountDown(int n)
{
    if (n <= 0)
    {
        Console.WriteLine("Done");
    }
    else
    {
        Console.WriteLine(n);
        CountDown(n - 1); [자기 자신을 호출]
    }
}

[첫 호출]
CountDown(5);
  •  

매개변수에 0이 들어가는 순간 반환이 시작되면서 끝이 남

 

재귀 호출의 주의점

  • 재귀 호출은 복잡한 문제를 단순한 방식으로 해결 가능
  • 종료 조건을 명확히 정의해야 하며, 종료 조건을 만족하지 못하면 무한히 재귀 호출이 반복되어
    스택 오버플로우 등의 오류가 발생
  • 재귀 호출은 메모리 사용량이 더 크고 실행 속도 느릴 수 있으니
    필요한 경우에만 적절히 사용할 것

 

[구조체]

사용자 정의 자료형

  • 여러 개의 데이터를 묶어서 하나의 사용자 정의 형식으로 만듬
  • 구조체는 struct 키워드를 사용
  • 구조체의 멤버는 변수도 메서드로도 구성 가능
struct Person
{
    public string Name;
    public int Age;

    public void PrintInfo()
    {
        Console.WriteLine($"Name: {Name}, Age: {Age}");
    }
}


구조체를 사용할 때는 변수를 선언하여 사용
구조체의 멤버에 접근할 때는 . 연산자를 사용

person1.Name = "John";
person1.Age = 25;
person1.PrintInfo();

 


 

✏️ 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기

✏️ TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기

✏️ 꾸준히 기록을 남기는 습관 가지기

 

📕 오늘의 학습 키워드

📕  공부한 내용 본인의 언어로 정리하기

📕  오늘의 회고

📕  12시간 중 얼마나 몰입했는지

📕  더 나은 미래를 위해 내일 어떤 공부를 진행할 것인지