LinkedList
void Start()
{
// c#에서 제공하는 링크드 리스트를 체험해보기 위해 선언과 할당
LinkedList<int> list = new LinkedList<int>();
// list의 tail(꼬리) 뒤에 1 추가
list.AddLast(1);
list.AddLast(2);
list.AddLast(3);
list.AddLast(4);
// list의 head(머리) 앞에 2 추가
list.AddFirst(0);
// * -> 연속적이지 않고, 어딘가 메모리가 존재하는데 그 주소를 담고 있음
// 싱글 링크드 리스트
// []* -> []* -> []*
// 더블 링크드 리스트
// *[]* <-> *[]* <-> *[]*
var enumerator = list.GetEnumerator();
int findIndex = 3;
int currentIndex = 0;
while (enumerator.MoveNext())
{
if (currentIndex == findIndex)
{
Debug.Log(enumerator.Current);
break;
}
currentIndex++;
}
}
구현해보기
// T 혹은 Ty 많이 씀(Type 매개변수라는 뜻)
public class Node<T>
{
public T Data { get; set; }
public Node<T> Next { get; set; }
public Node(T data)
{
Data = data;
Next = null;
}
}
public class LinkedListCustom<T>
{
// 맨 처음에 노드상의 제일 앞부분을 Head라고 선언
public Node<T> Head { get; private set; }
// 뒤에 요소 추가
public void Add(T data)
{
// 새로운 노드 생성
// 노드: 데이터와 next를 담은 구조체
Node<T> newNode = new Node<T>(data);
if (Head == null)
{
Head = newNode;
}
else
{
// current -> Next가 null일때까지
// 반복문을 수행
// [head][next] -> [node][next] -> [node][next}
Node<T> current = Head;
// current를 계속 최신화
while (current.Next != null)
{
current = current.Next;
}
// 맨 마지막의 노드의 next에다가 새로운 노드를 연결
current.Next = newNode;
}
}
public void Traverse()
{
Node<T> current = Head;
while (current != null)
{
Debug.Log(current.Data);
current = current.Next;
}
}
}
AddFirst 구현해보기
public void AddFirst(T data)
{
Node<T> newNode = new Node<T>(data);
Head = newNode;
newNode.Next = Head;
Head = newNode;
}
DoubleLinkedList 구현
앞뒤로 Prev랑 Next가 있음
public class DNode<T>
{
public T data;
public DNode<T> prev;
public DNode<T> next;
public DNode(T inData)
{
data = inData;
prev = null;
next = null;
}
}
public class DLinkedListCustom<T>
{
public DNode<T> head;
public DNode<T> tail;
public void AddLast(T data)
{
DNode<T> newNode = new DNode<T>(data);
if (tail == null)
{
tail = head = newNode;
}
else
{
tail.next = newNode;
newNode.prev = tail;
tail = newNode;
}
}
public void AddFirst(T data)
{
DNode<T> newNode = new DNode<T>(data);
if (head == null)
{
tail = head = newNode;
}
else
{
head.prev = newNode;
newNode.next = head;
head = newNode;
}
}
public void Traverse()
{
DNode<T> current = head;
while (current != null)
{
Debug.Log(current.data);
current = current.next;
}
}
public void RTraverse()
{
DNode<T> current = tail;
while (current != null)
{
Debug.Log(current.data);
current = current.prev;
}
}
}
한 분이 이해를 돕기 위해 정리해서 올려주심
하다가 프로퍼티부터 헷갈려서 우리의 친구 AI에게 물어봄
Property
1. get과 set은 무엇인가요?
프로퍼티(Property)
- get과 set은 **C#의 프로퍼티(Property)**에서 사용됩니다.
- 프로퍼티는 클래스 내부의 데이터를 외부에서 접근하거나 수정할 수 있게 하는 방법이에요.
- 데이터 보호와 직접 접근의 편리함을 모두 제공합니다.
2. 쉽게 이해하기
직접 접근 vs 프로퍼티
1. 필드(Field)를 직접 접근하는 방식
public class Example
{
public int number; // 필드
}
Example example = new Example();
example.number = 10; // 직접 값을 넣음
Debug.Log(example.number); // 값을 직접 가져옴
- 이 방식은 간단하지만, 데이터에 직접 접근해서 수정할 수 있기 때문에 안전하지 않아요.
2. 프로퍼티를 사용하는 방식
public class Example
{
private int _number; // 데이터를 직접 외부에서 못 건드리게 private로 설정
public int Number // 프로퍼티
{
get { return _number; } // 데이터를 가져올 때 사용
set { _number = value; } // 데이터를 설정할 때 사용
}
}
Example example = new Example();
example.Number = 10; // set을 통해 값을 넣음
Debug.Log(example.Number); // get을 통해 값을 가져옴
- get: 값을 가져올 때 실행.
- set: 값을 설정할 때 실행.
- 데이터를 보호하면서도 접근을 가능하게 합니다.
3. 프로퍼티 구조
public class Example
{
private int _value; // private 필드
public int Value // 프로퍼티
{
get { return _value; } // 값을 가져올 때
set { _value = value; } // 값을 설정할 때
}
}
value란?
- set 블록 안에서 사용되는 특별한 키워드로, 외부에서 전달된 값을 뜻해요.
예를 들어:
Example example = new Example(); example.Value = 42; // 여기서 42가 set의 value가 됨
4. 자동 구현 프로퍼티
C#에서는 자동 구현 프로퍼티를 사용하면 더 간단하게 쓸 수 있어요.
public class Example { public int Number { get; set; } // 자동 구현 프로퍼티 }
- 위 코드는 내부적으로 자동으로 private 필드를 생성해줍니다.
- 따로 get과 set을 정의하지 않아도 됩니다.
5. get과 set의 커스터마이징
get과 set에 조건을 추가해서 동작을 제한할 수도 있어요.
예: 읽기 전용 프로퍼티
public class Example
{
private int _number = 10;
public int Number
{
get { return _number; } // 값 가져오기만 가능
}
}
Example example = new Example();
Debug.Log(example.Number); // 출력: 10
example.Number = 20; // 에러: set이 없어서 값을 설정할 수 없음
예: 값 검증
public class Example
{
private int _age;
public int Age
{
get { return _age; }
set
{
if (value < 0) // 나이는 음수가 될 수 없음
{
_age = 0;
}
else
{
_age = value;
}
}
}
}
Example example = new Example();
example.Age = -5; // 음수를 넣으려고 하면
Debug.Log(example.Age); // 출력: 0 (조건에 의해 수정됨)
vue.js의 computed랑 node.js의 get, set이랑 비슷한 느낌이네
디버깅 하는 법
rider에서 Attatch to Unity Editor 클릭
구간 잡아주기
f11(step into)로 함수 실행 단계 깊게 볼 수 있음
사담
자료구조 했었는데 C#으로 보니까 혼란이네ㅋㅋㅋㅋ
그래도 보다보니까 익숙해지는 중...
역시 외국어 배우듯 처음엔 그냥 익숙해져야;;
기초반 목표가 수박게임인데 그냥 원하는 게임 하나 구현해도 된다고 하셔서 고민이다
게임을 하나 간단한걸 뭘 구현해볼 수 있을까 흠
'공부 > [TIL] Game Bootcamp' 카테고리의 다른 글
[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : LINQ (6) | 2024.12.05 |
---|---|
[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : 자료구조(Stack) (2) | 2024.12.04 |
[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : 라이더 설치, 자료구조 (2) | 2024.12.02 |
[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : Flappy Bird 만들기 (2) | 2024.11.29 |
[멋쟁이사자처럼 부트캠프 TIL] 유니티 게임 개발 3기 : Animation, Light, UI - Text 등 (0) | 2024.11.28 |