From f2c29fb3cba35e23c06b630bde0fef6204988ff5 Mon Sep 17 00:00:00 2001 From: fore4022 Date: Thu, 14 Mar 2024 22:22:21 +0900 Subject: [PATCH 1/5] =?UTF-8?q?4=EC=A3=BC=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4\355\232\214\354\260\250.md" | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 "2\355\232\214\354\260\250/4\354\243\274\354\260\250/4\355\232\214\354\260\250.md" diff --git "a/2\355\232\214\354\260\250/4\354\243\274\354\260\250/4\355\232\214\354\260\250.md" "b/2\355\232\214\354\260\250/4\354\243\274\354\260\250/4\355\232\214\354\260\250.md" new file mode 100644 index 0000000..9228e32 --- /dev/null +++ "b/2\355\232\214\354\260\250/4\354\243\274\354\260\250/4\355\232\214\354\260\250.md" @@ -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 result = new NativeArray(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 result; + public void Execute() + { + result[0] = 1; + for(int i = 0; i < 20; i++) + { + result[0]++; + } + } + } +} +// 실행결과로는 wait for seconds와 jobData result : ?가 번갈아 출력되고, 게임 오브젝트가 움직이는 것을 확인해 볼 수 있다. +``` \ No newline at end of file From 0ccf497a40b4a4a738dd67dba8e71993c987de48 Mon Sep 17 00:00:00 2001 From: fore4022 Date: Thu, 21 Mar 2024 09:59:20 +0900 Subject: [PATCH 2/5] =?UTF-8?q?5=EC=A3=BC=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../4\355\232\214\354\260\250.md" | 0 .../5\355\232\214\354\260\250.md" | 60 +++++++++++++++++++ 2 files changed, 60 insertions(+) rename "2\355\232\214\354\260\250/4\354\243\274\354\260\250/4\355\232\214\354\260\250.md" => "2\355\232\214\354\260\250/4\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/4\355\232\214\354\260\250.md" (100%) create mode 100644 "2\355\232\214\354\260\250/5\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/5\355\232\214\354\260\250.md" diff --git "a/2\355\232\214\354\260\250/4\354\243\274\354\260\250/4\355\232\214\354\260\250.md" "b/2\355\232\214\354\260\250/4\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/4\355\232\214\354\260\250.md" similarity index 100% rename from "2\355\232\214\354\260\250/4\354\243\274\354\260\250/4\355\232\214\354\260\250.md" rename to "2\355\232\214\354\260\250/4\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/4\355\232\214\354\260\250.md" diff --git "a/2\355\232\214\354\260\250/5\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/5\355\232\214\354\260\250.md" "b/2\355\232\214\354\260\250/5\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/5\355\232\214\354\260\250.md" new file mode 100644 index 0000000..1a4695c --- /dev/null +++ "b/2\355\232\214\354\260\250/5\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/5\355\232\214\354\260\250.md" @@ -0,0 +1,60 @@ +# 타입(Type) + +## 타입(Type)이란? + +- 값이 메모리에 저장되고, 어떻게 처리하는지 나타내준다. +- 메모리 저장 영역은 크게 4단계이다. + - Code : 기계어 코드가 들어가며, 읽기 전용의 데이터이다. CPU가 명령을 읽고 처리한다. + - Data : 전역, 정적 변수가 들어간다, 프로그램의 시작에 할당되고, 종료 시점에 소멸한다. + - Heap : 프로그래머가 직접 할당, 해제하는 메모리이다, 메모리 위쪽 주소부터 할당된다. + 스택 영역을 침범하게 되는 경우를 힙 오버 플로우(Heap over flow)라고 한다. + - Stack : 잠시 동안 사용될 임시 메모리 영역이다, 메모리 아래쪽 주소부터 할당된다. + 힙 영역을 침범학게 되는 경우를 스택 오버 플로우라고(Stack over flow) 한다. +- 리터럴 데이터 + - 변수에 직접 써주는 값들을 리터럴이라고 한다. + - 예 : ) int a = 10;//여기서 10은 리터럴이다. + +### 값 타입(value type)과 참조 타입(reference type) + +- 값 타입(value type) : 실제 데이터가 아닌 그 사본을 가리킨다. null값을 가질 수 없다. + - 값 자체가 변수명과 함께 스택에 저장이 된다. + - 예 : ) int, float, bool… +- 참조 타입(reference type) : 저장된 실제 데이터를 가리킨다. 두 개 이상의 변수가 하나의 값을 가리킬 수 있다. + - 값을 별도의 힙(Heap)에 저장을 하고, 값을 가리키는 메모리 주소를 변수명과 함께 스택(Stack)에 저장한다. + - 예 : ) Vector3, 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를 해주는 과정에서 서로 같은 값의 주소를 가리키게 된 것이다. 그렇기에 한쪽의 값이 바뀌면, 같은 주소를 가리키던 변수 모두에 영향이 있다. +//위와 같은 현상을 부수효과라고 한다. +``` \ No newline at end of file From 9416cac33384d3317a4ccbc6c3250a4a1b87be40 Mon Sep 17 00:00:00 2001 From: fore4022 Date: Thu, 21 Mar 2024 22:09:38 +0900 Subject: [PATCH 3/5] =?UTF-8?q?5=EC=A3=BC=EC=B0=A8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../5\355\232\214\354\260\250.md" | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git "a/2\355\232\214\354\260\250/5\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/5\355\232\214\354\260\250.md" "b/2\355\232\214\354\260\250/5\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/5\355\232\214\354\260\250.md" index 1a4695c..1b761d1 100644 --- "a/2\355\232\214\354\260\250/5\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/5\355\232\214\354\260\250.md" +++ "b/2\355\232\214\354\260\250/5\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/5\355\232\214\354\260\250.md" @@ -12,16 +12,17 @@ 힙 영역을 침범학게 되는 경우를 스택 오버 플로우라고(Stack over flow) 한다. - 리터럴 데이터 - 변수에 직접 써주는 값들을 리터럴이라고 한다. - - 예 : ) int a = 10;//여기서 10은 리터럴이다. + - 예 : int a = 10;//여기서 10은 리터럴이다. + - 접미사는 붙여주지 않을 경우 c#에서 기본적으로 int, bool, string, char, float로 변환해 준다. ### 값 타입(value type)과 참조 타입(reference type) - 값 타입(value type) : 실제 데이터가 아닌 그 사본을 가리킨다. null값을 가질 수 없다. - 값 자체가 변수명과 함께 스택에 저장이 된다. - - 예 : ) int, float, bool… + - 예 : int, bool… - 참조 타입(reference type) : 저장된 실제 데이터를 가리킨다. 두 개 이상의 변수가 하나의 값을 가리킬 수 있다. - 값을 별도의 힙(Heap)에 저장을 하고, 값을 가리키는 메모리 주소를 변수명과 함께 스택(Stack)에 저장한다. - - 예 : ) Vector3, Array, String… + - 예 : Array, String… ## 값 타입(value type)과 참조 타입(reference type)의 구분 @@ -32,7 +33,7 @@ - Null : 어떠한 데이터도 가지고 있지 않음을 의미한다. - Nullable Type : null값을 가질 수 없는 타입에서, null값을 가질 수 있게 해준 타입이다. - - 선언 방식 : ) int? a; + - 선언 방식 : int? a; --- From cb77832995ee811050a9c9670e9d68fb2f4cd7e3 Mon Sep 17 00:00:00 2001 From: fore4022 Date: Thu, 18 Apr 2024 04:23:23 +0900 Subject: [PATCH 4/5] =?UTF-8?q?6=EC=A3=BC=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../6\355\232\214\354\260\250.md" | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 "2\355\232\214\354\260\250/6\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/6\355\232\214\354\260\250.md" diff --git "a/2\355\232\214\354\260\250/6\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/6\355\232\214\354\260\250.md" "b/2\355\232\214\354\260\250/6\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/6\355\232\214\354\260\250.md" new file mode 100644 index 0000000..68c3a2f --- /dev/null +++ "b/2\355\232\214\354\260\250/6\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/6\355\232\214\354\260\250.md" @@ -0,0 +1,34 @@ +# 인덱서(Indexer), 반복기(Iterator) + +- 인덱스를 통하여 객체와 인스턴스 변수에 접근할 수 있다. + - 배열처럼 값에 접근할 수 있다. + +## 인덱서 정의 방법 + +- 인덱서의 정의 구문 + + ```csharp + [한정자] (인덱서의 반환 타입) this (인덱스 식별자) + 예 : + public Object this [int index] + { + get + { + //데이터 반환 + } + set + { + //데이터 저장 + } + } + ``` + + - 한정자 : private, protected, public + - 인덱서의 반환 타입 : 위의 예제에서는 여러가지의 자료형을 반환한다는 가정으로 최상위 클래스인 Object를 사용해 주었다. + - this : 현재 인스턴스를 가리키는, 식별자로 사용된다. + - 인덱스 식별자 : int, string형 인덱스 +- get또는 set만을 구현하여서, 읽기 또는 쓰기 전용으로 만들 수 있다. + +## 반복기 + +- 컬렉션을 단계적으로 실행할 수 있는 기능이다. \ No newline at end of file From 1a312b9ee21f885a9179ffaea5d2b088aa49c283 Mon Sep 17 00:00:00 2001 From: fore4022 Date: Thu, 18 Apr 2024 22:16:19 +0900 Subject: [PATCH 5/5] =?UTF-8?q?6=EC=A3=BC=EC=B0=A8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../6\355\232\214\354\260\250.md" | 91 ++++++++++++++++++- 1 file changed, 87 insertions(+), 4 deletions(-) diff --git "a/2\355\232\214\354\260\250/6\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/6\355\232\214\354\260\250.md" "b/2\355\232\214\354\260\250/6\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/6\355\232\214\354\260\250.md" index 68c3a2f..c573803 100644 --- "a/2\355\232\214\354\260\250/6\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/6\355\232\214\354\260\250.md" +++ "b/2\355\232\214\354\260\250/6\354\243\274\354\260\250/\353\260\225\354\247\204\354\232\260/6\355\232\214\354\260\250.md" @@ -1,5 +1,7 @@ -# 인덱서(Indexer), 반복기(Iterator) +# 인덱서(Indexer) +- 배열 형식으로 내부 요소에 접근이 가능하다. +- 값을 명시적으로 지정하지 않고도 쉽게 가져올 수 있다. - 인덱스를 통하여 객체와 인스턴스 변수에 접근할 수 있다. - 배열처럼 값에 접근할 수 있다. @@ -8,7 +10,7 @@ - 인덱서의 정의 구문 ```csharp - [한정자] (인덱서의 반환 타입) this (인덱스 식별자) + [한정자] (인덱서의 반환 타입) this [인덱스 식별자] 예 : public Object this [int index] { @@ -29,6 +31,87 @@ - 인덱스 식별자 : int, string형 인덱스 - get또는 set만을 구현하여서, 읽기 또는 쓰기 전용으로 만들 수 있다. -## 반복기 +## 인터페이스 인덱서 -- 컬렉션을 단계적으로 실행할 수 있는 기능이다. \ No newline at end of file +- 한정자가 없으며, 본문 내용을 선언하지 않는다. +- 읽기/쓰기 전용인지 정해준다. + +```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가 차례대로 출력된다. +``` \ No newline at end of file