C#LAB
C# 1.8 · 1부. 기초

메서드 기초

매개 변수와 반환값, 그리고 같은 이름을 여럿 두는 오버로딩입니다.

예상 학습 시간 14분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 입문
개념 설명

하는 일에 이름 붙이기

같은 계산을 여러 곳에서 해야 한다면 그때마다 코드를 옮겨 적는 대신 이름을 붙여 두고 필요할 때 부르면 됩니다. 이렇게 이름을 붙인 코드 묶음을 메서드라고 합니다.

메서드는 세 가지로 이루어집니다.

  • 이름 — 무엇을 하는지 알 수 있게 짓습니다. C#에서는 첫 글자를 대문자로 적습니다(Add, GetTotal).
  • 매개 변수 — 일을 하려면 밖에서 받아야 하는 값입니다. 없을 수도 있고 여럿일 수도 있습니다.
  • 반환값 — 일을 마치고 돌려주는 값입니다. 돌려줄 것이 없으면 void 라고 적습니다.

이미 우리는 메서드를 계속 사용해 왔습니다. Console.WriteLine() 도, int.TryParse() 도 남이 만들어 둔 메서드입니다. 이제 직접 만들어 봅니다.

최소 예제 · 편집 가능

더하는 메서드 만들기

아래 코드는 브라우저 안에서 실제로 실행됩니다. 고쳐서 눌러 보셔도 됩니다.

Program.cs
int Add(int a, int b) {
    return a + b;
}

Console.WriteLine(Add(2, 3));
Console.WriteLine(Add(10, 20));
출력
5 30

코드는 고쳐서 실행해 볼 수 있습니다. 처음 누를 때만 실행기를 내려받느라 잠시 걸립니다. 적은 코드는 서버로 나가지 않습니다.

맨 앞의 int돌려줄 값의 타입이고, 괄호 안의 int a, int b받을 값입니다. return 을 만나면 그 자리에서 값을 들고 돌아가므로, 그 뒤에 적은 코드는 실행되지 않습니다.

부르는 쪽에서 넘긴 23ab차례대로 담깁니다. 이름이 아니라 순서로 짝지어진다는 점을 기억해두면 좋습니다.

상세 사용법

돌려줄 것이 없으면 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;
}
선택적 매개 변수 (C# 4.0+)
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
2.0
3.0
4.0
6.0
7.0
9.0
12.0
14.0
  • 1.0메서드 · 오버로딩
  • 4.0선택적 매개 변수 · 이름을 적어 넘기기
  • 6.0식 본문 메서드 — => 로 잇기
  • 7.0지역 함수 — 메서드 안에 메서드 두기
C# 1.0+

메서드와 오버로딩은 처음부터 있었습니다. 이 단원의 예제가 클래스 없이 곧바로 적혀 있는 것은 1.2에서 본 최상위 문 덕분이며, 그 자리에 놓인 메서드는 엄밀히 말하면 C# 7.0의 지역 함수입니다. 클래스 안에 두는 보통의 메서드는 2부에서 다룹니다 — 그때 public 이나 static 같은 말이 앞에 붙습니다.

실습 문제

직접 해보기

1. 더 큰 값을 돌려주는 메서드 난이도 하

두 정수를 받아 더 큰 쪽을 돌려주는 Max 메서드를 만들고, Max(7, 12) 의 결과를 출력해보세요.

돌려줄 값이 있으므로 반환 타입은 void 가 아니라 int 입니다. 1.5의 삼항 연산자를 사용하면 한 줄로도 됩니다.
int Max(int a, int b) { if (a > b) return a; return b; } Console.WriteLine(Max(7, 12)); // 화살표로 짧게 적으면 int Max2(int a, int b) => a > b ? a : b;
2. 넓이를 구하는 메서드 두 벌 난이도 중

Area 라는 같은 이름으로, 값을 하나 받으면 정사각형의 넓이를, 둘 받으면 직사각형의 넓이를 돌려주도록 만들어보세요. 그리고 두 경우를 각각 출력해보세요.

받는 값의 수가 다르면 같은 이름을 그대로 사용할 수 있습니다. 한 벌이 다른 한 벌을 불러도 됩니다 — 정사각형은 가로와 세로가 같은 직사각형입니다.
int Area(int side) { return Area(side, side); } int Area(int width, int height) { return width * height; } Console.WriteLine(Area(4)); // 16 Console.WriteLine(Area(4, 5)); // 20
요약
  • 메서드는 이름 · 매개 변수 · 반환값으로 이루어집니다.
  • 넘긴 값은 순서대로 짝지어집니다. 돌려줄 것이 없으면 void 입니다.
  • 같은 이름을 여럿 둘 수 있지만(오버로딩), 반환 타입만 다른 것은 안 됩니다.
  • 기본값이 있는 매개 변수는 뒤쪽에 모읍니다.

C# 버전별 변경 이력 에서 각 버전이 무엇을 더했는지 볼 수 있습니다.