23.01.16. (월) - ★대리자★ 상당히 중요

김도익·2023년 1월 16일
0

C#

목록 보기
16/29

Enviroment.Exit(숫자);

  • 코드 몇 번째에서 프로그램이 종료되는지 알 수 있는 명령어이다.


// - 코드가 0개면 정상종료를 뜻합니다.

명령형 프로그래밍, 선언형 프로그래밍

  • 명령형 프로그래밍은 무엇을 어떻게 할 것인가에 가깝다.

  • 선언형 프로그래밍은 무엇을 할 것인가에 가깝다.

[콜백 함수]

★중요한 파트. 프로그래밍 할 때 무조건 사용함.★

콜백 함수

  • 호출 순서가 뒤바뀐 함수를 의미합니다.

  • 함수 혹은 프레임워크에 의해 호출되는 함수를 의미합니다.

  • 프레임워크 혹은 라이브러리가 프로그래머의 함수를 호출하는 것입니다.

  • 콜백이 가능하려면 함수를 인수로 넘길 수 있어야합니다.

  • 그래야 프레임워크가 함수를 호출할 수 있을테니 말입니다.

  • 인수로 넘길 수 있다는 말은 함수를 저장할 수 있다는 것이고, 이는 타입이 존재함을 시사합니다.

대리자

  • 함수를 저장하기 위한 타입!!!이 바로 대리자!!!(Delegate)

  • 대리자를 사용하려면 우선 어떤 형태의 함수를 저장할 것인지 정의해야합니다.

  • 대리자 작성 문법

    • < access modifier > delegate < return-type > < identifier > <parameter - list >
  • 우리가 정의 내린 타입과 다른 형태의 함수를 저장하려고 하면 오류가 발생합니다.

    // int형 타입의 Math.Max를 반환하지않는 someDelegate에 넣을려고 하니, 오류 발생하고
    매개변수 없는 someDelegate에 매겨변수가 있는 Math.Max를 넣으니 오류가 발생합니다.

  • Delegate는 내가 원하는 함수를 더해서 추가할 수 있습니다.

  • Delegate는 내가 원하는 함수를 뺄 수도 있습니다.
    디버깅이 어려울 때 사용하는 테크닉입니다.

  • 대리자는 여러 함수를 호출할 때, 여러 함수를 호출하되, 반환 값은 제일 마지막 함수의 반환 값만 호출합니다.
    // 이 원리를 알면 실수가 발생해도 빠르게 원인을 파악할 수 있습니다.

  • 대리자는 참조 타입입니다.

Tip. 대리자는 모듈화의 근간이 됩니다. 정말 중요합니다.

대리자는 많이 사용되다보니 .NET 라이브러리에선 이미 여러 가지 형태의 대리자를 미리 만들어 놓았습니다.
먼저 Action과 Func을 먼저 배워보겠습니다.

Action

  • 반환타입이 없는 대리자입니다.
  • 최대 16개의 매개변수를 받을 수 있습니다.
    • 하지만 교수님 팁으로서 매개변수가 많으면 가독성이 떨어지니 유의해서 사용하시라고 하셨습니다.

Func

  • 반환값이 필요한 경우라면 Func를 이용하면 됩니다.

  • 최대 16개의 매개변수를 받을 수 있습니다.

  • 마지막 타입이 반환 타입입니다.

// 반환 타입을 잘 생각하고 사용해야 오류가 발생하지 않습니다.

정말 중요한 팁. 내가 헷갈려서 2시간 동안 다시 배움 받은 팁. 명심할 것!!
1. 콜백 함수와 대리자는 다른 개념이다. 같다고 생각해서는 안된다.
2. 대리자는 함수를 저장하기 위한 타입이고, 콜백 함수는 프레임워크 혹은 라이브러리가 내가 만든 함수를 호출하는 것입니다.
3. 함수를 대리자에 저장하고, 대리자를 호출하면, 대리자 안에 있는 함수가 콜백 함수가 됩니다.

  • 위 사진에 있는 함수 Foo, Boo, Add, Sub, Message, message, PrintAddvalue, PrintSubValue들은 대리자 안에 저장되어 있습니다.
    그리고 함수가 저장되어 있는 대리자를 호출하면 위 함수들을 콜백 함수라고 할 수 있습니다.

Tip 앞으로는 대리자 타입을 직접 정의하는 대신 Action과 Func를 적극 사용하는 것을 M.S에서는 권장하고 있습니다.

람다 표현식

  • 때로는 콜백을 위해 일일이 함수를 작성하는 것이 귀찮을 수 있습니다.
  • 이름을 짓는 것이 쉽지 않기 때문입니다. 이때 람다 표현식(Lamda Expression)을 사용해
    무명 함수(Annoymous Function)
    를 만들 수 있습니다.
  • 람다는 이름이 없기 때문에 직관성은 떨어집니다. 그래서 정말 필요한 곳에 써야합니다.
    구문이 많으면 보기 불편한 경우가 있습니다.
  • 람다 표현식은 2가지 형태를 갖고 있습니다.

  • 람다 표현식은 범위 밖의 변수(Outer Variable)를 캡쳐해서 사용할 수 있습니다.

  • 캡쳐해서 사용할 수 있다는 말은 주소 값(ref)를 사용한다는 의미입니다.

    // 람다 () =>{}를 action안에 넣어줬습니다.

  • 함수안에 람다를 넣을 수 있습니다.
    소카본 5번 교재를 발췌한 내용을 사진으로 올리겠습니다. 람다를 이해하기 위한 용도입니다.


    // Oncollision에는 대리자 action(); 이 들어가있습니다. 무명 함수를 사용할 수 있는 람다를 사용해 바로 콜백 함수 개념을 작용한 사례입니다.

    <위에서 사용한 Oncollision()과 같은 방법입니다.>
    
    	Action action = () =>
              {
                  PushOut( playerMoveDirection, ref playerX, ref playerY, wallPositionsX[i], wallPositionsY[i] );
              };
              OnCollision( action );
    
    	 Action action = () =>
              {
                  PushOut( playerMoveDirection,
                  ref boxPositionsX[pushedBoxIndex], ref boxPositionsY[pushedBoxIndex],
                  in boxPositionsX[i], in boxPositionsY[i] );
                  PushOut( playerMoveDirection,
                  ref playerX, ref playerY,
                  in boxPositionsX[pushedBoxIndex], in boxPositionsY[pushedBoxIndex] );
              };
              OnCollision( action );

nameof()

  • 변수나 타입 등의 이름을 생성해주는 연산자
profile
고급 개발자가 되고 싶어요!

0개의 댓글