STIKA
내일배움캠프 Unity 9일차 TIL - C# 문법 2-2 본문
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시간 중 얼마나 몰입했는지
📕 더 나은 미래를 위해 내일 어떤 공부를 진행할 것인지
'프로그래밍 > Unity + C#' 카테고리의 다른 글
Unity 캠프 11일차 TIL < TextGame 2차 > (0) | 2024.01.08 |
---|---|
Unity 캠프 10일차 TIL < TextGame 1차 > (0) | 2024.01.04 |
내일배움캠프 Unity 8일차 TIL - C# 문법 2-1 (0) | 2024.01.03 |
내일배움캠프 Unity 7일차 TIL - C# 문법 1 (1) | 2024.01.02 |
내일배움캠프 Unity 6일차 TIL - C# 문법 시작 (0) | 2023.12.29 |