2025. 12. 30. 18:07ㆍC#
C#에서 Action을 통해 어떤 객체의 메서드를 실행시키고 싶을 때, 개발자는 Action 타입 인스턴스를 만들어 메서드를 참조한다.
이때, 크게 2가지 방식으로 메서드를 참조하게 되는데, 그 방식은 아래와 같다.
MyClass b = new MyClass();
Action a = () => b.Func(); //첫번째 방식
Action a = b.Func; //두번째 방식
첫 번째 방식은 새로운 익명함수 객체를 생성해 그 안에서 b.Func()를 실행한다고 저장한다.
두 번째 방식은 b를 a의 필드인 Target으로 참조하고 Func를 참조한다.
이 2가지 방식은 아래의 차이점들을 가진다.
객체 생성 여부
첫 번째 방식
런타임에 새로운 익명함수 객체를 계속 만들어줘야 하기 때문에 메모리를 잡아먹고 GC가 자주 호출되며, 속도도 더 느리다.
이를 피하기 위해서는 static으로 Action을 저장할 필요가 있다.
두 번째 방식
기존에 존재하는 함수를 참조하기 때문에 더 빠르게 동작한다.
b의 변화에 대한 반응
b 변수의 값이 중간에 바뀌었을 때, 각 방법에서 실행 결과가 달라질 수 있다.
첫 번째 방식
첫 번째 방식은 b변수가 참조하는 객체가 바뀌면 바뀐 객체에서 Func를 실행한다.
b변수가 정의된 스코프를 벗어나서 b변수가 메모리에서 해제된다면, 그 이후로는 계속 같은 객체를 참조한다.
두 번째 방식
메모리상 객체의 위치를 직접 참조하기 때문에, 중간에 b 변수가 참조하는 객체가 바뀌어도 기존 객체에서 Func를 실행한다.
마치며
결론적으로 할 수 있다면 익명함수를 사용하지 말고 함수를 직접 참조하는게 여러가지 면에서 더 좋다고 느꼈다.
또한 정보를 찾아보면서 변수 변화에 따라 결과가 바뀌는걸 막기 위한 변수 캡쳐라는 개념을 찾았는데, 이것도 정리해보아야겠다.
'C#' 카테고리의 다른 글
| [C#] 튜플(Tuple) 사용하기 (0) | 2023.11.29 |
|---|---|
| [C#] 생성자에서 다른 생성자 호출하기 (0) | 2023.08.10 |
| [C#] params 키워드 (0) | 2023.08.01 |
| [C#] 인덱서의 사용법 (0) | 2023.07.26 |
| [C#] const 키워드와 readonly 키워드 (0) | 2023.07.24 |