Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions 2회차/4주차/박진우/4회차.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Job System

## Job system이란?

- 유니티 엔진과 연동되는 멀티스레드 코드를 작성하고, 사용할 수 있다.
- 동시에 이루어져야 할 작업과 시간이 오래 걸리는 작업에서 주로 사용된다.
- Job은 워커스레드에서 실행된다.

## Job이란?

- 단일 작업을 수행하는 작은 작업 단위이다.

## 사용방법

- 생성해준 구조체에 IJob을 상속시켜준다.
- IJob은 구조체에 사용되며, Execute라는 메서드를 꼭 만들어 주어야한다.
- Execute 메서드에는 파라미터 값이 없다.
- Execute메서드 안에 실행할 작업 내용을 써넣는다.

---

```csharp
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.Collections;
using Unity.Jobs;
using UnityEngine;
public class Test : MonoBehaviour
{
public GameObject go;
private NativeArray<ulong> result = new NativeArray<ulong>(1, Allocator.TempJob);
private MyJob JobData = new MyJob();
private JobHandle handle;
private ulong r;
private void Start()
{
JobData.result = result;
handle = JobData.Schedule();
handle.Complete();
r = result[0];
}
private void Update()
{
if(r != 20)
{
Debug.Log("wait for seconds");
}
if (r != 0)
{
Debug.Log($"jobData result : {r}");
r = 0;
JobData.result = result;
handle = JobData.Schedule();
handle.Complete();
r = result[0];
}
go.transform.position += Vector3.forward * Time.deltaTime;
}
public struct MyJob : IJob
{
public NativeArray<ulong> result;
public void Execute()
{
result[0] = 1;
for(int i = 0; i < 20; i++)
{
result[0]++;
}
}
}
}
// 실행결과로는 wait for seconds와 jobData result : ?가 번갈아 출력되고, 게임 오브젝트가 움직이는 것을 확인해 볼 수 있다.
```
61 changes: 61 additions & 0 deletions 2회차/5주차/박진우/5회차.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# 타입(Type)

## 타입(Type)이란?

- 값이 메모리에 저장되고, 어떻게 처리하는지 나타내준다.
- 메모리 저장 영역은 크게 4단계이다.
- Code : 기계어 코드가 들어가며, 읽기 전용의 데이터이다. CPU가 명령을 읽고 처리한다.
- Data : 전역, 정적 변수가 들어간다, 프로그램의 시작에 할당되고, 종료 시점에 소멸한다.
- Heap : 프로그래머가 직접 할당, 해제하는 메모리이다, 메모리 위쪽 주소부터 할당된다.
스택 영역을 침범하게 되는 경우를 힙 오버 플로우(Heap over flow)라고 한다.
- Stack : 잠시 동안 사용될 임시 메모리 영역이다, 메모리 아래쪽 주소부터 할당된다.
힙 영역을 침범학게 되는 경우를 스택 오버 플로우라고(Stack over flow) 한다.
- 리터럴 데이터
- 변수에 직접 써주는 값들을 리터럴이라고 한다.
- 예 : int a = 10;//여기서 10은 리터럴이다.
- 접미사는 붙여주지 않을 경우 c#에서 기본적으로 int, bool, string, char, float로 변환해 준다.

### 값 타입(value type)과 참조 타입(reference type)

- 값 타입(value type) : 실제 데이터가 아닌 그 사본을 가리킨다. null값을 가질 수 없다.
- 값 자체가 변수명과 함께 스택에 저장이 된다.
- 예 : int, bool…
- 참조 타입(reference type) : 저장된 실제 데이터를 가리킨다. 두 개 이상의 변수가 하나의 값을 가리킬 수 있다.
- 값을 별도의 힙(Heap)에 저장을 하고, 값을 가리키는 메모리 주소를 변수명과 함께 스택(Stack)에 저장한다.
- 예 : Array, String…

## 값 타입(value type)과 참조 타입(reference type)의 구분

- 값을 직접 가리키고 있는지, 혹은 참조를 통해서 값을 가리키고 있는 지에 따라서 구분된다.
- 변수의 생성과 동시에 메모리가 생기는지, 혹은 변수가 생성되고 new 키워드로 메모리가 생성되는 지에 따라서 구분된다.

## Null과 Nullable Type

- Null : 어떠한 데이터도 가지고 있지 않음을 의미한다.
- Nullable Type : null값을 가질 수 없는 타입에서, null값을 가질 수 있게 해준 타입이다.
- 선언 방식 : int? a;

---

```csharp
int a, b;
a = 10;
b = a;
a++;
Debug.Log(a);
Debug.Log(b);
//a와 b의 결과값이 다르게 나온다.
//a와 b의 값은 같지만, a와 b가 하나의 값을 가리키는 것이 아닌, a = b를 통해서 두 변수 각각 10이라는 값을 가지고 있는 것이다.
```

```csharp
Vector3 a, b;
a = GameObject.Find("Player").transform.position;//Player.transform.position = new Vector3(0, 0, 0);
b = a;
a += new Vector3(0, 1, 2);
Debug.Log(a);
Debug.Log(b);
//a와 b의 결과값이 같게 나온다.
//b = a는 a와 b가 같은 값을 가지게 되는 것이 아니다, a는 값을 저장하는 것이 아닌, 값의 주소로, b = a를 해주는 과정에서 서로 같은 값의 주소를 가리키게 된 것이다. 그렇기에 한쪽의 값이 바뀌면, 같은 주소를 가리키던 변수 모두에 영향이 있다.
//위와 같은 현상을 부수효과라고 한다.
```
117 changes: 117 additions & 0 deletions 2회차/6주차/박진우/6회차.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# 인덱서(Indexer)

- 배열 형식으로 내부 요소에 접근이 가능하다.
- 값을 명시적으로 지정하지 않고도 쉽게 가져올 수 있다.
- 인덱스를 통하여 객체와 인스턴스 변수에 접근할 수 있다.
- 배열처럼 값에 접근할 수 있다.

## 인덱서 정의 방법

- 인덱서의 정의 구문

```csharp
[한정자] (인덱서의 반환 타입) this [인덱스 식별자]
예 :
public Object this [int index]
{
get
{
//데이터 반환
}
set
{
//데이터 저장
}
}
```

- 한정자 : private, protected, public
- 인덱서의 반환 타입 : 위의 예제에서는 여러가지의 자료형을 반환한다는 가정으로 최상위 클래스인 Object를 사용해 주었다.
- this : 현재 인스턴스를 가리키는, 식별자로 사용된다.
- 인덱스 식별자 : int, string형 인덱스
- get또는 set만을 구현하여서, 읽기 또는 쓰기 전용으로 만들 수 있다.

## 인터페이스 인덱서

- 한정자가 없으며, 본문 내용을 선언하지 않는다.
- 읽기/쓰기 전용인지 정해준다.

```csharp
(인덱서의 반환 타입) this [인덱스 식별자]
{
(필요에 따라서 get 또는 set을 구현, 둘 중 하나는 구현해야함)
}
예 :
public interface indexer
{
string this[int index]
{
get;
set;
}
}
public class test : indexer
{
private string[] arr = new string[10];
public string this[int index]
{
get { return arr[index]; }
set { arr[index] = value; }
}
}
```

## 인덱서 foreach

- 인덱서는 배열처럼 불러올 수 있지만, foreach문은 돌릴 수 없다.
- 인덱서를 foreach문으로 돌리기 위해서는, IEnumerable를 상속 받은 객체가 사용이 가능하다.

---

```csharp
public class main : MonoBehaviour
{
Indexer indexer = new();
public void Start()
{
indexer[0] = "a";
indexer[1] = "b";
indexer[2] = "c";
indexer[3] = "d";
indexer[4] = "e";//각 배열에 있을 값을 지정

foreach (string str in indexer) { Debug.Log(str); }
}
}
public class Indexer : IEnumerable, IEnumerator
{
public string[] str = new string[5];
private int pos;
public string this[int index]
{
get { return str[index]; }
set { str[index] = value; }
}
//이하 코드는 IEnumerable과 IEnumerator를 상속시켜 주면서, 선언해 주어야 하는 메서드이다.
public object Current
{
get { return str[pos]; }
}

public void Reset() { pos = -1; }

public bool MoveNext()
{
if (pos == str.Length - 1)
{
Reset();
return false;
}
pos++;
return (pos < str.Length);
}

public IEnumerator GetEnumerator() { return this; }
}
// 실행결과로는 a, b, c, d, e가 차례대로 출력된다.
```