1. C#의 함수/메서드
너 이미 C#에서 많은 명령어를 배웠으니까, 이제 꽤 복잡한 프로그램도 쓸 수 있을 거야. 10, 20, 30줄 정도의 코드는 사실 그렇게 큰 프로그램은 아니지?
근데 100+줄짜리 프로그램은 이미 크고, 코드 읽기가 꽤 힘들어져. 코드가 많아질수록 작성이나 읽기가 더 쉬워질 방법이 없을까?
있지! 바로 메서드(함수)가 도와줄 거야.
그럼 메서드가 뭘까? 아주 쉽게 말하면, 메서드는 고유한 이름을 가진 명령어 묶음이야. 즉, 여러 명령어를 한 그룹으로 묶고, 그 그룹에 이름을 붙이는 거지. 그럼 끝! 메서드 완성.
예를 들어, 고양이 그리는 코드가 있다고 해보자:
Console.WriteLine(" |\\__/,| (`\\");
Console.WriteLine(" |o_o |__ _) )");
Console.WriteLine(" (____/ (_/ ");
이 코드를 실행하면 이렇게 나와:
|\__/,| (`\
|o_o |__ _) )
(____/ (_/
이 코드를 별도의 메서드로 옮기면, 원하는 만큼 고양이를 그릴 수 있어:
void WriteCat()
{
Console.WriteLine(" |\\__/,| (`\\");
Console.WriteLine(" |o_o |__ _) )");
Console.WriteLine(" (____/ (_/ ");
}
//고양이 세 마리 그리기
WriteCat();
WriteCat();
WriteCat();
프로그램이 실행될 때마다 WriteCat()을 호출하면, 메서드 WriteCat() 안에 있는 모든 명령어가 실행돼. 여러 명령어를 한 그룹으로 묶어서 새로운 명령어(메서드)를 만든 거지.
함수의 의미:
- 프로그램을 여러 부분으로 나눠서, 각 부분이 자기 역할만 하게 해.
- 재사용이 쉬워져: 한 번만 써놓고, 필요할 때마다 계속 쓸 수 있어.
- 버그 날 확률이 줄어들어: 함수 안에서 버그가 생기면, 그 함수만 고치면 돼.
- 복잡한 동작에 이름을 붙여주니까, 코드 읽기가 훨씬 쉬워져.
용어: 함수, 메서드, 프로시저
C#에서는 함수랑 메서드가 거의 같은 뜻이지만, 약간의 차이가 있어.
- 메서드 — 클래스나 객체에 속한 함수야 (C#에선 거의 다 메서드임).
- 프로시저 — 값을 반환하지 않는 함수(void 메서드).
- 함수 — 넓은 의미로, 호출할 수 있는 이름 붙은 코드 조각 전부.
공식적으로 C#에선 이걸 다 메서드라고 부르지만, 혹시 뒤에 "함수"라는 말이 나와도 당황하지 마!
2. 메서드 선언 문법: 하나씩 뜯어보기
가장 간단한 함수, 고전적인 "Hello, World!"를 예로 들어서, 출력 부분만 메서드로 빼볼게:
using System;
class Program
{
static void Main()
{
PrintHello();
}
static void PrintHello() // "Hello, World!" 출력
{
Console.WriteLine("Hello, World!");
}
}
문법 뜯어보기:
| 부분 | 예시 | 설명 |
|---|---|---|
| 한정자 | |
이 메서드가 클래스에 속한다는 뜻 (자세한 건 나중에) |
| 반환 타입 | |
이 메서드는 아무것도 반환하지 않는다는 뜻 |
| 메서드 이름 | |
이름으로 메서드를 호출해 |
| 파라미터 | |
인자 (비어 있으면 인자 없음) |
| 메서드 본문 | |
메서드가 호출될 때 실행되는 코드 |
비유:
메서드는 커피 자판기랑 비슷해: 돈(인자)을 넣고, 버튼(메서드 호출)을 누르면, 자판기가 커피를 만들고(메서드 본문), 결과(반환값)를 내놔 — void 메서드는 결과 없이 그냥 끝나기도 하고!
3. 메서드 호출하는 방법
메서드 호출은 그냥 이름 쓰고 괄호만 붙이면 끝이야:
PrintHello(); // 파라미터 없는 메서드
int sum = Add(2, 3); // 파라미터와 결과값이 있는 메서드
중요: 메서드는 선언된 이후(혹은 코드에서 위에 있거나, 같은 클래스 안에 있을 때)만 호출할 수 있어.
4. 파라미터가 있는 메서드
메서드에 파라미터를 넘길 수 있어. 이러면 메서드 동작을 더 유연하게 바꿀 수 있지. 사실 파라미터는 메서드 안에서 쓰는 변수고, 메서드를 호출할 때 값을 넣어주는 거야. 파라미터는 메서드 만들 때 꼭 적어줘야 해.
static void Greet(string name)
{
Console.WriteLine($"안녕, {name}!");
}
// 사용 예시:
Greet("앨리스");
Greet("밥");
파라미터는 메서드 호출할 때 넘겨주는 값이야.
| 부분 | 예시 | 설명 |
|---|---|---|
| 파라미터 타입 | |
받는 값의 타입 |
| 파라미터 이름 | |
메서드 안에서 쓸 이름 |
호출 예시:
Greet("앨리스"); — name은 "앨리스" 값을 받아.
파라미터 여러 개
파라미터는 콤마로 구분해서 여러 개 선언할 수 있어:
static void PrintSum(int a, int b)
{
Console.WriteLine($"합계: {a + b}");
}
// 사용 예시:
PrintSum(5, 7); // 합계: 12
5. 값 파라미터와 참조 파라미터
함수의 파라미터는 그냥 일반 변수랑 똑같고, 똑같은 규칙이 적용돼.
그래서 기억해둬: 배열을 메서드에 넘기면, 참조가 넘어가서, 메서드가 배열 내용을 바꿀 수 있어. 기본 타입(int, double 등)은 값이 복사돼.
static void ZeroFirstGrade(int[] grades)
{
grades[0] = 0; // 원본 배열이 바뀜!
}
// 사용 예시:
int[] a = {1, 2, 3, 4, 5};
ZeroFirstGrade(a);
Console.WriteLine(a[0]); //0이 출력됨
실제로는 이렇게 되는 거야:
static void ZeroFirstGrade(int[] grades)
{
grades[0] = 0; // 원본 배열이 바뀜!
}
// 사용 예시:
int[] a = {1, 2, 3, 4, 5};
//ZeroFirstGrade(a);
int[] grades = a;
grades[0] = 0;
Console.WriteLine(a[0]); //0이 출력됨
GO TO FULL VERSION