매개변수

매개변수는 형식 매개변수와 실제 매개변수로 나뉩니다

형식 매개변수

형식 매개변수의 영문 명칭은 Formal Parameter이며 보통 형인자, 매개변수라고 부릅니다.

형식 매개변수는 메서드 선언 괄호 안에 작성하는 특수한 지역 변수로, 메서드 본문 내부에 정의하는 변수가 아닙니다.

아래 함수 이름 뒤 괄호 안의 두 변수가 바로 형식 매개변수입니다. C 언어를 공부한 독자라면 이 개념이 익숙할 것입니다.

// x, y는 두 개의 형식 매개변수
public void PrintArea(int x, float y )
{
}
Code language: C# (cs)
  1. 데이터 타입과 변수명을 가지며 읽기와 쓰기가 모두 가능;
  2. 정의 위치는 메서드 본문 외부이며 메서드가 실행되기 전 자동으로 초기화됩니다out 출력 매개변수 제외);
  3. 여러 매개변수는 쉼표로 구분하고 매개변수 개수에 제한이 없음;
  4. 메서드 본문 안에서 사용하는 방식은 일반 지역 변수와 완전히 동일합니다.

즉 형식 매개변수는 특수한 지역 변수로, 함수 호출 지점에서 전달되는 값을 받는 역할을 수행합니다. 값 할당은 함수 호출 시 발생하며 실행 흐름이 함수 안으로 진입할 때 이미 형식 매개변수에 값이 저장된 상태입니다.

public void PrintArea( int x, float y )
{
    float area = x * y; // x, y는 형식 매개변수, area는 일반 지역 변수로 x와 y의 곱을 저장
    Console.WriteLine($"넓이 계산: { x } * { y } = { area }");
}
Code language: C# (cs)

실행 가능 예제

class Program
{
    static void Main()
    {
        Program program = new Program();
        program.PrintArea(10,6.5F);
    }

    public void PrintArea(int x, float y)
    {
        float area = x * y; // x, y는 형식 매개변수, area는 일반 지역 변수로 x와 y의 곱을 저장
        Console.WriteLine($"넓이 계산: {x} * {y} = {area}");
    }
}Code language: C# (cs)

출력 결과

넓이 계산: 10 * 6.5 = 65

함수를 호출하는 행위는 x에 10, y에 6.5를 초기값으로 할당하는 것과 같습니다.

6.5F 뒤의 F는 해당 값이 float 단정밀도 부동소수점임을 의미합니다. F 접미사를 붙이지 않으면 컴파일러가 double 타입으로 인식하고 오류를 발생시킵니다.

단정밀도 float와 배정밀도 double은 메모리에서 차지하는 비트 수가 다르기 때문에 저장 가능한 값의 정밀도 차이가 발생합니다.

정밀도란 자료형이 정확하게 보관할 수 있는 소수점 최대 자릿수를 뜻합니다. 이 범위를 넘어가면 값이 부정확해질 수 있으며 이 특징은 메모리에 할당되는 비트 수에 따라 결정됩니다.

x와 y는 형식 매개변수입니다. 호출 시

두 개의 지역 변수에 해당 값을 초기화하는 것과 동일한 원리입니다.

int x = 10;

float y = 6.5F;Code language: C# (cs)

주의사항:

형식 매개변수의 타입, 순서, 형식과 메서드 이름이 합쳐져 메서드 서명을 구성합니다. 서명은 함수의 신분증과 같은 개념입니다. 이후 서명에 대해 학습할 예정이며 서명이 일치하는지 여부로 동일한 메서드인지 판단하고, 함수 오버로딩도 다룰 것입니다.


실제 매개변수

영문 명칭:Actual Parameters(실인자, arguments라고도 부름)

메서드를 호출할 때 형식 매개변수에 값을 전달하는 변수 또는 표현식을 실제 매개변수라고 부릅니다. 메서드가 실행되기 전 실제 매개변수의 값으로 대응하는 형식 매개변수를 초기화합니다.

  1. 실제 매개변수는 메서드 호출 괄호 안에 작성;
  2. 타입 일치 규칙:실제 매개변수 타입은 대응하는 형식 매개변수와 같거나 컴파일러가 암시적 타입 변환을 지원해야 함;
  3. 위치 매칭:기본적으로 순서대로 짝을 이룹니다(위치 인자 positional parameters).

예시로 위 코드의 Main 함수를 아래처럼 수정할 수 있습니다. 호출 부분 첫 번째 인자는 리터럴 값 5이고 두 번째 인자는 지역 변수 f입니다.

Program program = new Program();
float f = 6.3F;
program.PrintArea(5,f);
// 5는 상수식 실제 매개변수, f는 변수 실제 매개변수
// 위치 매칭:5 → x, f → y
Code language: C# (cs)

호출할 때 실제 매개변수의 값이 같은 위치의 형식 매개변수에 복사된 뒤 메서드 본문 코드가 실행됩니다.


위치 인자

class Calculate
{
    // int 형식 매개변수 두 개
    public int Sum(int x, int y)
    {
        return x + y;
    }

    // float 형식 매개변수 두 개
    public float Avg(float x, float y)
    {
        return (x + y) / 2.0F;
    }
}

class Program
{
    static void Main()
    {
        Calculate cal = new Calculate();
        int num = 6;

        // Sum:int 실매개변수가 int 형매개변수에 맞춰짐
        Console.WriteLine("Sum: {0} and {1} is {2}",
            5, num, cal.Sum(5, num));

        // Avg:int 실매개변수가 float 형매개변수로 암시적 변환
        Console.WriteLine("Avg: {0} and {1} is {2}",
            5, num, cal.Avg(5, num));
    }
}
Code language: PHP (php)
출력 결과
Sum: 5 and 6 is 11
Avg: 5 and 6 is 5.5Code language: HTTP (http)

C#은 범위가 좁은 타입에서 넓은 타입으로의 암시적 변환(int → float)을 지원합니다. 반대로 float → int 방향은 컴파일 오류가 발생하므로 직접 강제 변환을 작성해야 합니다.

num은 int 타입 변수입니다. Avg 함수의 float 형식 매개변수에 실제 매개변수로 전달할 때 컴파일러가 자동으로 int를 float로 암시 변환하기 때문에 오류가 생기지 않습니다. int가 표현 가능한 값의 범위가 float의 범위 안에 포함되기 때문입니다.

그래서 int를 float에 전달해도 데이터 손실이 일어나지 않습니다. 작은 상자를 큰 상자 안에 넣는 모습이라고 생각하면 됩니다. 반대로 큰 상자를 작은 상자에 넣으려고 하면 들어갈 수 없는 것과 같습니다.

매개변수

Previous:

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다