메서드 기초
매개 변수와 반환값, 그리고 같은 이름을 여럿 두는 오버로딩입니다.
하는 일에 이름 붙이기
같은 계산을 여러 곳에서 해야 한다면 그때마다 코드를 옮겨 적는 대신 이름을 붙여 두고 필요할 때 부르면 됩니다. 이렇게 이름을 붙인 코드 묶음을 메서드라고 합니다.
메서드는 세 가지로 이루어집니다.
-
이름 — 무엇을 하는지 알 수 있게 짓습니다. C#에서는 첫 글자를
대문자로 적습니다(
Add,GetTotal). - 매개 변수 — 일을 하려면 밖에서 받아야 하는 값입니다. 없을 수도 있고 여럿일 수도 있습니다.
-
반환값 — 일을 마치고 돌려주는 값입니다. 돌려줄 것이 없으면
void라고 적습니다.
이미 우리는 메서드를 계속 사용해 왔습니다.
Console.WriteLine() 도,
int.TryParse() 도 남이 만들어 둔 메서드입니다. 이제
직접 만들어 봅니다.
더하는 메서드 만들기
아래 코드는 브라우저 안에서 실제로 실행됩니다. 고쳐서 눌러 보셔도 됩니다.
int Add(int a, int b) { return a + b; } Console.WriteLine(Add(2, 3)); Console.WriteLine(Add(10, 20));
코드는 고쳐서 실행해 볼 수 있습니다. 처음 누를 때만 실행기를 내려받느라 잠시 걸립니다. 적은 코드는 서버로 나가지 않습니다.
맨 앞의 int 는 돌려줄 값의 타입이고,
괄호 안의 int a, int b 는 받을 값입니다.
return 을 만나면 그 자리에서 값을 들고 돌아가므로,
그 뒤에 적은 코드는 실행되지 않습니다.
부르는 쪽에서 넘긴 2 와 3 이
a 와 b 에 차례대로
담깁니다. 이름이 아니라 순서로 짝지어진다는 점을 기억해두면 좋습니다.
돌려줄 것이 없으면 void
화면에 찍기만 하고 돌려줄 값이 없는 메서드도 많습니다. 그때는 반환 타입 자리에
void 를 적고 return 은
생략합니다. 중간에 그만두고 싶으면 값 없이
return; 이라고만 적습니다.
void Greet(string name) { if (string.IsNullOrEmpty(name)) return; // 여기서 그만둡니다 Console.WriteLine($"{name}님, 안녕하세요."); }
구현이 한 줄뿐이라면 중괄호와 return 을
빼고 화살표로 이을 수 있습니다(C# 6.0+). 짧은 계산에 자주 사용됩니다.
int Add(int a, int b) => a + b; double Half(double n) => n / 2;
같은 이름을 여럿 두기
하는 일이 같은데 받는 값만 다를 때, 이름을 Add2·
Add3 으로 나누지 않고 같은 이름을 그대로
사용할 수 있습니다. 이것을 오버로딩이라고 하며, 컴파일러가 넘긴 값을
보고 알맞은 것을 찾아 부릅니다.
받는 값의 수나 타입이 다르기만 하면 됩니다. 다만 돌려주는 타입만 다른 것은 오버로딩이 되지 않습니다 — 부르는 쪽만 보아서는 어느 것을 뜻하는지 가릴 수 없기 때문입니다.
int Add(int a, int b) { return a + b; } int Add(int a, int b, int c) { return a + b + c; }
int Add(int a, int b, int c = 0) { return a + b + c; } // Add(1, 2) → 3 // Add(1, 2, 3) → 6
기본값이 있는 매개 변수는 뒤쪽에 모아야 합니다. 앞에 두면 값을 하나만 넘겼을 때 그것이 어느 자리인지 가릴 수 없습니다. 자리를 건너뛰고 싶다면 이름을 적어 넘기면 됩니다(C# 4.0+).
void Draw(string text, int width = 10, bool border = false) { } Draw("제목"); // width 10, border false Draw("제목", border: true); // width 는 그대로 두고 border 만
값을 넘길 때 무엇이 건너가나
메서드에 값을 넘기면 그 값이 복사되어 건너갑니다. 그래서 안에서 매개 변수를 바꾸어도 부른 쪽의 변수는 그대로입니다. 1.3에서 본 값 형식과 참조 형식의 차이가 여기서 다시 나타나며, 자세한 것은 2부에서 다룹니다.
void Double(int n) { n = n * 2; // 여기서만 바뀝니다 } int value = 5; Double(value); Console.WriteLine(value); // 10 이 아니라 5
이 문법, 몇 버전부터 사용할 수 있나요
- 1.0메서드 · 오버로딩
- 4.0선택적 매개 변수 · 이름을 적어 넘기기
- 6.0식 본문 메서드 — => 로 잇기
- 7.0지역 함수 — 메서드 안에 메서드 두기
메서드와 오버로딩은 처음부터 있었습니다. 이 단원의 예제가 클래스 없이
곧바로 적혀 있는 것은 1.2에서 본 최상위 문 덕분이며, 그 자리에 놓인 메서드는
엄밀히 말하면 C# 7.0의 지역 함수입니다. 클래스 안에 두는
보통의 메서드는 2부에서 다룹니다 — 그때 public 이나
static 같은 말이 앞에 붙습니다.
직접 해보기
두 정수를 받아 더 큰 쪽을 돌려주는 Max 메서드를 만들고,
Max(7, 12) 의 결과를 출력해보세요.
Area 라는 같은 이름으로, 값을 하나 받으면 정사각형의
넓이를, 둘 받으면 직사각형의 넓이를 돌려주도록 만들어보세요. 그리고 두 경우를
각각 출력해보세요.
- 메서드는 이름 · 매개 변수 · 반환값으로 이루어집니다.
- 넘긴 값은 순서대로 짝지어집니다. 돌려줄 것이 없으면
void입니다. - 같은 이름을 여럿 둘 수 있지만(오버로딩), 반환 타입만 다른 것은 안 됩니다.
- 기본값이 있는 매개 변수는 뒤쪽에 모읍니다.
C# 버전별 변경 이력 에서 각 버전이 무엇을 더했는지 볼 수 있습니다.