메서드는 이름이 지정된 코드 블록입니다. 프로그램 내 다른 곳에서 메서드 이름을 호출해 해당 코드를 실행할 수 있으며, 데이터를 전달하고 메서드가 반환하는 결과값을 받을 수 있습니다.
메서드의 구성
앞서 설명했듯이 메서드는 클래스에 속하는 함수 멤버입니다.
메서드는 사실 함수와 같습니다. 함수가 클래스 내부에 정의될 때 메서드라고 부르며, C 언어에서는 이것들을 모두 함수로 부릅니다.
메서드는 두 가지 핵심 요소로 이루어집니다: 메서드 헤더(메서드 선언부)와 메서드 바디입니다.
- 메서드 헤더: 메서드의 모든 특징을 정의하며 아래 정보를 포함합니다.
- 반환값 존재 여부. 반환값이 있다면 반환 타입을 명시해야 함
- 메서드 이름
- 주고받을 수 있는 데이터 타입과 데이터 처리 규칙
- 메서드 바디: 실행 가능한 명령문들의 집합입니다. 프로그램은 메서드 바디 첫 번째 문장부터 순서대로 한 줄씩 실행합니다.
예시를 살펴보겠습니다
string Introduce(string name,int age)
{
string words = $"hello my name is {name},i'm {age} years old";
Console.WriteLine(words);
return words;
}Code language: C# (cs)
메서드 헤더: string Introduce(string name,int age)
string: 반환 타입으로 문자열Introduce: 메서드 이름(string name,int age): 매개변수 목록입니다. 이 두 변수는 외부에서 전달받는 이름과 나이를 저장하며 메서드 본문 안에서 사용할 수 있습니다.

이 메서드를 어떻게 호출할까요?
이 메서드는 Program 클래스 안에 있으며 Main 메서드와 같은 클래스에 위치합니다. 하지만 Main은 정적(static) 메서드이므로 정적 메서드에서는 비정적 메서드를 직접 호출할 수 없습니다. Introduce를 호출하려면 Program 인스턴스를 먼저 생성한 뒤 인스턴스를 통해 호출해야 합니다.
class Program
{
static void Main()
{
Program program = new Program();
program.Introduce("John", 30);
}
string Introduce(string name,int age)
{
string words = $"hello my name is {name},i'm {age} years old";
Console.WriteLine(words);
return words;
}
}Code language: C# (cs)
아래처럼 직접 호출하면 오류가 발생합니다

올바른 방식은 Main 함수 안에서 new로 Program 인스턴스를 생성하고 인스턴스를 이용해 Introduce를 호출하는 것입니다
Program program = new Program();//√
program.Introduce("John", 30);Code language: C# (cs)
메서드 바디
메서드 바디에는 0개 혹은 여러 개의 실행 문장을 포함할 수 있습니다.
메서드 바디는 코드 블록(중괄호로 감싼 명령문 묶음)이며 코드 블록 안에는 다음 내용을 작성할 수 있습니다:
- 지역 변수
- 흐름 제어 구문(반복문, 분기문 등)
- 다른 메서드를 호출하는 코드
- 중첩된 하위 코드 블록
- 내부 지역 함수(메서드 안에 정의한 하위 메서드) [추후 학습]
class Program
{
static void Main()
{
int age = 3; // 지역 변수, 초기값 3
while (age > 0) // 흐름 제어 구문
{
--age;
Introduce("Tom", age); // 메서드 호출
}
{
//중첩된 하위 코드 블록
}
}
static string Introduce(string name,int age)
{
string words = $"hello my name is {name},i'm {age} years old";
Console.WriteLine(words);
return words;
}
}
Code language: JavaScript (javascript)
위 코드에서 Introduce 함수 앞에 static 키워드를 추가해 정적 함수로 만들었습니다. 이렇게 하면 Main 함수에서 인스턴스 없이 직접 호출할 수 있습니다.
지역 변수(Local Variables)
앞서 설명한 인스턴스 필드와 마찬가지로 지역 변수는 데이터를 저장합니다. 인스턴스 필드는 주로 객체 상태를 보관하는 반면 지역 변수는 일회성 연산에 필요한 임시 데이터를 담습니다.
지역 변수가 속한 메서드 실행이 종료되면 변수는 스택에서 제거됩니다. 값 형식 변수는 바로 소멸하고 참조 형식 변수는 나중에 가비지 컬렉터에 의해 정리됩니다.
1. 지역 변수 선언 구문
타입 변수이름 = 초기값;
변수이름: 사용자 정의 식별자= 초기값: 선택적 초기화 구문으로 변수에 초기 값을 할당
2. 지역 변수 핵심 규칙
- 생명 주기와 유효 범위: 변수를 선언한 코드 블록과 그 안의 모든 중첩 블록 내에서만 존재
- 변수는 선언된 코드 줄에서 생성되어 유효해짐
- 코드 블록 실행이 끝나면 변수는 소멸하고 사용할 수 없음
- 선언 위치 제한 없음: 메서드 본문 어디든 작성 가능하지만 사용하기 전에 먼저 선언해야 함
static void Main()
{
int age = 3; //지역 변수
Phone p = new Phone(); //사용자 정의 타입 지역 변수
{
int one = 1; //하위 코드 블록의 지역 변수
bool two = false;
}
double d = 0;
}Code language: JavaScript (javascript)

인스턴스 필드 vs 지역 변수
| 인스턴스 필드 | 지역 변수 | |
|---|---|---|
| 생명 주기 | 객체 인스턴스 생성 시 만들어지며 객체에 접근 불가능해질 때 소멸 | 선언 줄에서 활성화되고 소속된 코드 블록 실행 완료 시 소멸 |
| 기본 초기화 | 컴파일러가 자동으로 해당 타입의 기본값을 할당 | 자동 초기화 없음 값을 할당하지 않고 사용하면 컴파일 오류 |
| 메모리 저장 위치 | 값 형식, 참조 형식 상관없이 모두 힙(Heap)에 저장 | 값 형식: 스택(Stack) 참조 형식: 참조는 스택, 객체 데이터는 힙 |
메서드(Method)