C# Action과 람다식: 반환값 없는 콜백을 작성하는 방법
C# Action 델리게이트와 람다식을 연결하는 방법을 설명합니다. 오래된 예제의 의미는 살리되 현재 기준에서 잘못 적용하기 쉬운 부분을 함께 고쳤어요. 아래 순서대로 확인하면 단순한 화면 복사보다 실제 판단에 도움이 됩니다.

Action은 void 반환 콜백을 표현한다
Action은 실행할 코드를 값처럼 전달하되 반환값이 필요하지 않을 때 사용합니다. 인수가 없으면 Action, 인수가 있으면 Action<T>처럼 형식을 지정해요.
Action<string, int> repeat = (text, count) =>
{
for (int i = 0; i < count; i++)
Console.WriteLine(text);
};
repeat("안녕하세요", 2);람다식의 매개변수 개수와 형식은 Action 선언과 맞아야 합니다. 값을 반환하려면 Action이 아니라 Func를 선택해야 해요.
한 식과 여러 문장 람다를 구분한다
한 문장으로 끝나는 경우 message => Console.WriteLine(message)처럼 중괄호를 생략할 수 있습니다. 조건문이나 반복문처럼 여러 문장이 필요하면 블록 람다를 사용해요. 코드를 줄이는 것보다 호출 목적이 한눈에 보이는지가 더 중요합니다.
같은 람다가 여러 곳에서 반복되거나 테스트가 필요하면 이름 있는 메서드로 옮기세요. Action 변수에는 그 메서드 그룹을 그대로 대입할 수 있어 간결함을 잃지 않습니다.
async void 형태의 Action은 신중하게 쓴다
Action은 반환 형식이 void이므로 async 람다를 대입하면 async void가 될 수 있습니다. 호출자가 완료를 기다리거나 예외를 정상적으로 받을 수 없어 이벤트 처리기가 아닌 일반 비동기 작업에서는 위험해요. 비동기 콜백은 가능하면 Func<Task> 또는 Func<T, Task>로 설계합니다.
콜백 안의 예외가 어디로 전달되는지 확인한다
Action을 동기적으로 호출하면 람다 안의 예외가 호출자에게 전달됩니다. 호출자가 처리해야 하는 오류인지, 콜백 자체에서 복구할 수 있는 오류인지 경계를 정하세요. 예외를 무조건 삼키면 작업이 끝난 것처럼 보이지만 데이터는 일부만 처리될 수 있습니다.
여러 Action을 결합하면 등록된 순서대로 실행되지만 앞의 작업에서 예외가 나면 뒤 호출이 실행되지 않을 수 있어요. 각 작업을 반드시 시도해야 한다면 호출 목록을 순회하며 개별 결과를 기록하는 별도 로직이 필요합니다. 단순 결합과 오류 격리를 같은 것으로 보면 안 됩니다.
예제를 직접 확인하는 순서
코드를 그대로 읽는 데서 끝내지 말고 작은 콘솔 프로젝트에 옮겨 정상 입력과 잘못된 입력을 각각 실행해 보세요. 컴파일 오류와 실행 중 예외는 원인이 다릅니다. 경고가 표시되면 무시하지 말고 사용 중인 .NET과 C# 언어 버전도 확인합니다.
예제의 이름과 출력 문장은 바꿔도 핵심 형식과 호출 구조는 유지해야 해요. 한 줄씩 수정하면서 결과가 왜 달라지는지 기록하면 문법을 외우는 것보다 오래 남습니다. 운영 코드에 적용하기 전에는 null, 빈 값, 예상 범위를 벗어난 값도 별도 테스트로 확인하세요.
자주 묻는 질문
기존 글의 게시일과 URL은 바뀌나요?
아니요. 이 글은 기존 게시물을 보완한 것이며 원래 공개 URL을 유지합니다.
화면이 글과 다르면 어떻게 하나요?
서비스 화면과 메뉴는 바뀔 수 있으므로 글의 원리와 공식 문서를 먼저 확인하고 현재 화면에서 같은 기능명을 찾으세요.
한 번 설정하면 다시 확인하지 않아도 되나요?
버전·정책·환경이 바뀔 수 있습니다. 업데이트나 스킨 변경 뒤에는 핵심 동작을 다시 점검하는 편이 안전합니다.
공식 자료
이 글은 기존 게시물의 URL과 기록 가치를 유지하면서 현재 독자가 실행할 수 있도록 내용을 다시 확인해 보완했습니다.
댓글
댓글 쓰기