스토리지

[3.23] 익명 함수, 람다 식, LINQ 본문

Unity/수업내용(C#)

[3.23] 익명 함수, 람다 식, LINQ

ljw4104 2021. 3. 23. 11:43

대리자 형식이 예상되는 곳에서 항상 사용할 수 있는 인라인 문 또는 식.

- 인라인 : 대개 함수에서 다른 함수를 호출하면 다른 함수로 갔다가 돌아오지만 인라인이 선언된 함수는 함수 본문이 복사가 된다. 그래서 빠르다. 대신 메모리 사용량이 높다.

ko.wikipedia.org/wiki/%EC%9D%B8%EB%9D%BC%EC%9D%B8_%ED%95%A8%EC%88%98

 

인라인 함수 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 인라인 함수(inline function)는 여러 버전의 C와 C++ 프로그래밍 언어에서 컴파일러가 인라인 확장 수행을 요청 받는 함수이다. 다시 말해, 프로그래머는 함수를 호

ko.wikipedia.org

 

익명함수 구현법

  • 무명함수
  • ★람다식
일반적 형태 TestDelegate testDelA = new TestDelegate(M);
무명함수 사용 TestDelegate testDelB = delegate(string s) { Console.WriteLine(s); };
람다식 사용 TestDelegate testDelC = (x) => { Console.WriteLine(x); };

 

람다 식

- 익명함수를 만드는 식.  => : 람다 선언 연산자

 

식이 본문으로 포함된 식 람다.

(input-parameters) => expression

 

문 블록이 본문으로 포함된 문 람다.

(input-parameters) => { <sequence-of-statements> }

예제)

  • 인자가 없는 문
using System;

namespace Study09
{
    public class App
    {
        public App()
        {
            //람다식 사용
            Action sayhello = () => console.writeline("hello world!");
            sayhello();

            //일반적인 대리자
            Action sayHello = this.SayHello;
            sayHello();
        }

        private void SayHello()
        {
            Console.WriteLine("Hello World!");
        }

        /*
         * RESULT
         * HELLO WORLD!
         */
    }
}

 

  • 2. 인자가 있는 문
using System;

namespace Study09
{
    public class App
    {
        public App()
        {
            //일반적인 대리자
            Action<string> sendMessageDel = this.SendMessage;
            sendMessageDel("Hello World from delegate!");

            //람다식 사용
            Action<string> sendMessageLambda = (message) =>
            {
                Console.WriteLine(message);
            };
            sendMessageLambda("Hello World from Lambda!");
        }

        private void SendMessage(string message)
        {
            Console.WriteLine(message);
        }
    }
}

 

반환값이 있을때는 Func<T,TResult>를 사용하면 된다.

  • 예제 1
using System;

namespace Study09
{
    public class App
    {
        public App()
        {
            //대리자 초기화
            Func<int, int> multiply = this.Multiply;

            //대리자 호출
            int result = multiply(5);

            //출력
            Console.WriteLine(result);

            ///////////////////////////////////////////////////

            //식 람다
            Func<int, int> multiply = (x) => x * x;
            //문 람다
            Func<int, int> multiply = (x) =>
            {
                return x * x;
            };

            //대리자 호출
            int result = multiply(5);

            //출력
            Console.WriteLine(result);
        }

        private int Multiply(int x)
        {
            return x * x;
        }
    }
}

 

  • 예제 2
using System;

namespace Study09
{
    public class App
    {
        public App()
        {
            //람다식으로 대리자 초기화
            Func<string, int, bool> checkStringLength = (msg, len) =>
            {
                return msg.Length > len;
            };

            //대리자 호출
            bool result = checkStringLength("Hello World!", 5);
            Console.WriteLine(result);
        }
    }
}

 

LINQ (Language Integrated Query)

- SQL처럼 언어를 확장하여 배열, 열거식, 클래스 등에서 데이터 소스로부터 데이터를 편리하게 추출하고 가공하기 위해서 사용된다. 컬렉션이랑 유사하다.

ko.wikipedia.org/wiki/LINQ

 

LINQ - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. LINQ('링크'로 발음, Language Integrated Query)는 네이티브 데이터 질의 기능을 닷넷 언어에 추가하는 마이크로소프트 닷넷 프레임워크 구성 요소이며 2007년 닷넷 프레

ko.wikipedia.org

람다 식을 사용한 LINQ

int[] numbers = { 2, 3, 4, 5 };
var squaredNumbers = numbers.Select(x => x * x);
Console.WriteLine(string.Join(" ", squaredNumbers));

예제

using System;
using System.Collections.Generic;
using System.Linq;

namespace Study09
{
    class Item
    {
        public string name;
        public Item(string name)
        {
            this.name = name;
        }
    }

    public class App
    {
        public App()
        {
            //컬렉션 생성(Item)
            List<Item> items = new List<Item>();

            //Item객체 생성 및 컬렉션 추가
            items.Add(new Item("장검"));
            items.Add(new Item("장검"));
            items.Add(new Item("단검"));
            items.Add(new Item("창"));
            items.Add(new Item("활"));
            items.Add(new Item("창"));

            //컬렉션에서 item객체의 이름이 xxx인 것을 찾으시오.
            //Linq: Find + 람다 사용
            string name = "활";
            Item foundItem = items.Find(x => x.name == name);
            if(foundItem != null)
            {
                Console.WriteLine("찾은 아이템('활') : {0}", foundItem.name);
            }
            else
            {
                Console.WriteLine("아이템을 찾을 수 없습니다.");
            }

            //만약에 같은 이름의 요소가 있다면 모두 찾아서 출력
            //Linq: where + 람다 사용
            IEnumerable<Item> found = items.Where(x=>x.name == "활");
            foreach(var i in found)
            {
                Console.WriteLine(i.name);
            }
        }
    }
}
Comments