학원

36일차 - 2024-09-10

하타라시 2024. 9. 10. 20:05

 

Character라는 클래스가 있습니다.throw new CharacterObjectNullReferenceException를 통해 고의적으로 예외를 발생시킵니다.

 

Load3는 Code100을 발생시키기 때문에 Point1에서 실행되었습니다.

 

만일 Code값을 50으로 주면 Point2에서 실행됩니다.

즉 catch는 위에서 부터 밑으로 내려가면서 작동하는 것입니다.

추가로 finally는 무슨 일이 있어도 잘 작동합니다.

 

CharacterObjectNullReferenceException는 Exception을 상속 받았기 때문에, virtual이 붙은 Message는 재정의가 가능합니다. 생성자도 재정의 하였습니다.

 

Exception의 생성자를 base로 해당 부분까지 실행하는 모습입니다.

 

 

생성을 하게 되면, 부모 생성자 > 자식 생성자가 실행되게 됩니다. 그러므로 위에 기본 생성자는 base()가 사용이 되었다고 보아도 무방합니다.

https://m.mkexdev.net/entry/C-%EA%B8%B0%EC%B4%88%EA%B0%95%EC%A2%8C-10-C-%EC%83%9D%EC%84%B1%EC%9E%90%EC%99%80-%EC%86%8C%EB%A9%B8%EC%9E%90

 

 

선택정렬은 큰 숫자와 작은 숫자를 검사하고 교체합니다.

버블정렬이 아니라 실수를 하였지만,,, 주말에 고치겠습니다..

 

1회차 5,3,2,1,4

2회차 3,2,1,4,5

3회차 2,1,3,4,5

4회차 1,2,3,4,5

이런 느낌입니다.

 

 

이 때, 내림차순으로도 하고 , 오름차순으로도 하고 싶다면, 우선 관련된 메서드를 만듭니다.

 

Func가 가능한 이유는 public bool Ascending(int,int right,return) 이렇게 Func와 형태가 같기 때문입니다.

 

 

이번엔 람다식으로 오름차순입니다. 식 본문 처럼 한 줄로 표현된 모습입니다.

https://jettstream.tistory.com/132

 

Action, Func ,Predicate와 delegate와의 제일 큰 차이점은 대리자의 유무라고 생각합니다.

delegate의 경우 직접 대리자를 만들어야합니다.

 

Func는 반환 값이 제일 마지막에 들어간다는게 외울 요소라고 생각합니다.

 

 

Pridicate는 true  혹은 false 가 들어간다는 점이라고 생각합니다.

Event나 Action도 중요한게 있었는데, 딱히 기억에 남지않아서 다시 머릿속에 넣을 예정입니다.

 

 

익명 메서드입니다. delegate로 해서 만드는 것인데,, 요즘은 구형이라 잘 안쓴다고 이해했습니다.

 

내부함수입니다.  메서드 안에 메서드를 넣는 기이한 동작이 가능합니다!

 

 

캡처라는 용어가 클로저와 같이 쓰입니다. 캡처는 주변 외부의 context를 참조하는 것입니다.

캡처할 변수는 실행 시점에서 참조하는 변수의 값을 가져오게 되는 것입니다.

https://velog.io/@kimdo2297/%ED%81%B4%EB%A1%9C%EC%A0%B8-%EC%BA%A1%EC%B3%90%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-about-closure-capture

 

밑에 블로거 분이 겪은 문제인데, 

https://doublsb.tistory.com/73

i = 2;

delegate;

i = 4;

이렇게 했는데 결국 i가 4인 상태로 실행 됬다는 이야기입니다.

즉 클로저는 정의된 환경의 변수와 메서드를 참조하고, 호출될 때에 해당 참조를 사용하는 개념입니다.

그러므로 저런 문제가 발생한 것입니다.

 

 

 

우선 5,2를 입력받아서 5+2 = 7의 결과가 나온 모습입니다.

 

람다문입니다. 1줄 이상 사용할 때에 블록을 만들어서 활용하는 방식입니다.

actionTest?.Invoke는 actionTest가 null이 아닐 경우에 실행하라는 의미입니다.

 

람다식은 object 타입이 없으므로 해당 형태는 제한이 됩니다.

그러므로 캐스팅도 제한이 됩니다.

 

람다식은 델리게이트의 형식과 일치해야합니다.

 

람다식은 타입이 없으므로 추론이 불가능합니다.

c# 최근버전은 되나 싶지만은,, 일단 제가 사용하는 유니티 버전에서는 불가능합니다.

 

추가로 out과 ref도 불가능하지만, 예외로 해당 느낌으로 레퍼런스 타입인 배열이 사용가능합니다.

 

 

Action을 List에 넣어서 활용하는 모습입니다. 이런 식으로하면 유니티에서 이벤트 발생한거 처리를 편하게 쓸수 있을 듯합니다.

 

 

 

 

감사합니다.