[C#] Action을 통해 함수를 참조하는 방법 2가지의 차이점

2025. 12. 30. 18:07C#

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