람다는 다른 말로 무명 메서드로 이름이 없는 메서드이다. 이는 주로 Action과 Func로 람다식을 쓸 수 있다. 람다는 식 본문 정의와 같이 리턴 받을 값이 있으면 리턴해준다.
람다는 대리자를 통해서만 정의가 가능하다. 람다식 자체는 형식이 없으므로 Object에 어떤 멤버에도 접근할 수 없다. 형식이 없으므로 캐스팅도 불가능하다. 람다식은 호환 가능한 대리자 형식으로만 가능하다. 람다식은 형식이 없으므로 로컬 변수에서 형식 추론이 불가능하다. 람다 식은 파라미터에 out 키워드 사용이 불가능하다. outer 지역 변수에 대한 초기화 인식 불가, ref 키워드는 불가능하나 레퍼런스 타입은 가능하다.
익명 메서드는 지금은 잘 사용하지 않는 구형 버전으로 Action을 이용하여 구현할 수 있다.
Action<int> anonymous = delegate (int va1) { print($"anonymous : {va1}"); }; anonymous(10);
Tuple은 값 형식으로 여러 개의 자료형을 가진 변수로 만들 수 있다. 원하는 형 안에 변수를 따로 지정해 주면 해당 이름으로 변수를 호출할 수 있고 변수를 따로 지정해 주지 않는다면 순서에 따라 item의 몇 번째로 호출할 수 있다. 변수를 따로 정해주지 않고 var을 이용하여 값을 넣어줄 수도 있다. 또 Func를 이용하여 대입할 형태와 리턴해줄 형태를 지정해 줄 수 있다.
private void Start() { (float, int) t1 = (3.14f, 5); print($"float : {t1.Item1}, int : {t1.Item2}"); (float Pi, int Sum, int Test) t2 = (3.14159268f, 100, 999); print($"Pi : {t2.Pi}, Sum : {t2.Sum}, Test : {t2.Test}"); var t6 = (3.14f, 10, "Unity", 'c', 23); print($"{t6.Item3}"); Func<(int, int, int), (int, float, string)> them = param => { return (param.Item1 * 2, param.Item2 * 3.5f, param.Item3.ToString() + "Values"); }; }
Anonymous Type은 익명 타입으로 읽기 전용 모드이다. 해당 타입은 get만 지원하고 set은 사용할 수 없다. 해당 변수를 할당할 때는 var을 사용하고 new를 이용하여 값을 할당해 준다.
private void Start() { var t1 = new { Name = "세종대왕", Year = 1700, Age = 50 }; //상수화, 읽기 전용, 쓰기 불가 var t2 = new { Name = "박문수", Year = 1980, Age = 43 }; var t3 = new { t1.Name, Year = t2.Year, Age = 30 }; }
IEnumerator은 IEnumerable을 상속받고 이는 current와 MoveNext와 Reset을 가지고 있다. IEnumerator은 Invoke를 이용하여 호출하는 것으로 이때의 yield는 MoveNext, return new WaitForSecond(time)은 current를 나타낸다. MoveNext는 현재와 다음을 나타낸다. IEnumerator은 LinkedList와 매우 유사한 구조를 가지고 있는데 LinkedList에서 데이터가 current 주소가 MoveNext를 의미한다.
private INumerator Delay(float time) { yield return new WaitForSecond(time); }
GetEnumerator은 IEnumerator을 반복하는 것으로 해당 형을 리턴해준다.
Where은 조건문으로 해당 조건에 성립하면 조건에 맞는 대로 호출을 해준다.
private void Start() { Patent[] patents = Datas.Patents; IEnumerable<Patent> patents2 = Datas.Patents; Func<Patent, bool> func = (patent) => patent.YearOfPublication.StartsWith("18"); //해당 문자열로 시작하면 true, 아니면 false IEnumerable<Patent> patents3 = patents.Where(func); }
Select는 해당 부분을 추출하여 리턴해주는 것이다.
{ Patent[] patents = Datas.Patents; IEnumerable<Patent> patents2 = Datas.Patents; IEnumerable<string> patent4 = patents.Select(patents => patents.Title); }
Select + Where은 Select와 Where을 섞은 것으로 Where 조건에 성립하는 부분을 Select에서 원하는 부분만을 추출하여 리턴해주는 것이다.
{ Patent[] patents = Datas.Patents; IEnumerable<Patent> patents2 = Datas.Patents; IEnumerable<string> patent5 = patents.Select(patent => patent.Title). Where(title => title.StartsWith("B")); }