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 을 만나면 그 자리에서 값을 들고 돌아가므로, 그 뒤에 적은 코드는 실행되지 않습니다.

부르는 쪽에서 넘긴 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;
}
선택적 매개 변수 (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# 버전별 변경 이력 에서 각 버전이 무엇을 더했는지 볼 수 있습니다.