숏컷 코드
// 기본 메서드
int Add(int left, int right)
{
return left + right;
}
// 식 본문 (expression-bodied)
int Square(int x) => x * x;
// 반환값 없음
void Log(string message) => Console.WriteLine(message);
int sum = Add(2, 3); // 5문법
어떤 형태가 있나
C# 메서드 카드는 보통 아래 형태를 같이 보면 빠르게 정리됩니다.
int Add(int left, int right) { return left + right; } // 블록 본문
int Square(int x) => x * x; // 식 본문
void Log(string message) => Console.WriteLine(message); // 반환값 없음즉 메서드는 반환 타입 + 이름 + 매개변수 + 본문이 기본형이고, 여기에 기본값 매개변수, named argument, 오버로딩, 지역 함수가 붙습니다.
메서드의 네 가지 구성 요소
메서드는 반환 타입, 이름, 매개변수 목록, 본문으로 구성됩니다. 이 네 가지가 "무엇을 입력받아 무엇을 돌려주는가"를 명확히 드러냅니다.
// 반환타입 이름 매개변수
int Add( int left, int right )
{
return left + right; // 본문
}void 는 "반환값이 없다"는 명시적 선언입니다. 로그 출력, 상태 변경, 파일 저장처럼 결과를 돌려줄 필요가 없는 작업에 씁니다.
기본값 매개변수와 named argument
매개변수에 기본값을 지정하면 호출 시 생략할 수 있습니다. named argument를 쓰면 순서와 무관하게 원하는 매개변수에만 값을 전달할 수 있습니다.
void CreateUser(string name, int level = 1, bool isAdmin = false)
{
Console.WriteLine($"{name}, level={level}, admin={isAdmin}");
}
CreateUser("Mina"); // level=1, isAdmin=false
CreateUser("Jin", level: 5); // isAdmin=false
CreateUser("Sol", isAdmin: true, level: 3); // named argument로 순서 변경실제 호출은 아래처럼 이어집니다.
int total = Add(10, 20);
int squared = Square(total);
Log($"sum={total}, square={squared}");오버로딩 — 같은 이름, 다른 시그니처
오버로딩은 같은 이름의 메서드를 매개변수 타입이나 개수를 다르게 해서 여러 개 정의하는 것입니다. 반환 타입만 다른 오버로딩은 불가능합니다.
// 매개변수 타입이 다른 오버로딩
int Add(int a, int b) => a + b;
double Add(double a, double b) => a + b;
int Add(int a, int b, int c) => a + b + c;
// 컴파일러가 인수 타입에 맞는 버전을 자동 선택
Add(1, 2); // int 버전
Add(1.5, 2.5); // double 버전
Add(1, 2, 3); // 3개 버전식 본문 메서드 (expression-bodied)
=> 로 단일 식을 반환하는 메서드를 한 줄로 작성합니다. 메서드, 프로퍼티, 생성자에 모두 쓸 수 있습니다.
// 블록 본문
bool IsAdult(int age) { return age >= 18; }
// 식 본문 — 같은 의미
bool IsAdult(int age) => age >= 18;
// void도 가능
void Print(string msg) => Console.WriteLine(msg);지역 함수 — 메서드 안에 메서드
메서드 내부에 지역 함수(local function) 를 정의해 외부에 노출하지 않을 내부 로직을 분리할 수 있습니다.
int Fibonacci(int n)
{
if (n <= 1) return n;
return Calc(n);
// 외부에서 보이지 않는 내부 메서드
int Calc(int x) => Fibonacci(x - 1) + Fibonacci(x - 2);
}체크포인트
| 요소 | 설명 |
|---|---|
| 반환 타입 | 메서드가 돌려주는 값의 타입. 없으면 void |
| 매개변수 | 호출 시 전달받는 입력값 |
return | 호출한 곳으로 값을 반환. void가 아니면 필수 |
| 기본값 매개변수 | 호출 시 생략 가능한 매개변수 |
| named argument | 이름으로 매개변수 지정, 순서 자유 |
| 오버로딩 | 같은 이름 + 다른 매개변수 시그니처 |
식 본문 => | 단일 식을 반환하는 간결한 메서드 |
| 지역 함수 | 메서드 내부에만 존재하는 함수 |
주의할 점
매개변수가 4개 이상 되기 시작하면 "어떤 값을 어떤 순서로 넣는지"가 헷갈립니다. 이 경우 매개변수를 옵션 클래스나 record로 묶거나 named argument를 활용하는 편이 좋습니다.
메서드 하나가 너무 많은 일을 하기 시작하면 작은 역할 단위로 분리하세요. "이 메서드를 한 문장으로 설명할 수 있는가?" 가 좋은 기준입니다.
void 메서드는 값을 돌려주지 않습니다. var result = Log("x");처럼 사용하려고 하면 컴파일되지 않습니다. 값을 계산하는 함수와 부작용만 일으키는 함수를 구분해 두는 편이 디버깅과 테스트에 유리합니다.
참고 링크
2 sources