반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발꿈나무

[C# 교과서] 18. C# 활용(12) - 메서드와 매개변수 본문

C# 기초

[C# 교과서] 18. C# 활용(12) - 메서드와 매개변수

HYOKYE0NG 2022. 1. 20. 08:27
반응형
메서드와 매개변수

 

C#에서는 모든 함수를 클래스 내에 선언하기에 함수 대신에 메서드(method)라고 한다.

메서드는 클래스가 수행할 수 있는 기능들을 이름 하나로 묶어 관리하는 코드 블록을 의미한다.

 

메서드

 

  • 클래스 내에서 선언된 함수(function, sub procedure)를 메서드라고 한다.
  • 특정한 코드를 묶어 실행할 때 사용하는 코드 블록이 메서드이다,
  • 메서드는 개체가 수행할 수 있는 기눙, 동작, 행위 등을 의미한다.
  • 자동차의 동작/기능인 전진, 후진, 좌회전과 같은 의미가 같은 기능을 구현할 때 사용한다.
  • 메서드 이름은 동사+명사 형태를 권장한다. EX) GetPrice(), SetPrice()

 

정적 메서드와 인스턴스 메서드

  • 정적 메서드: static 키워드를 붙이면 정적 호출이 가능하며 클래스.메서드() 형태로 호출 가능하다.
  • 인스턴스 메서드: static 키워드 없이 메서드를 만들어 new() 키워드로 인스턴스를 생성한 수 인스턴스.메서드() 형태로 호출 가능하다.
Class Car
{
	public static void Go()
    {
    	//정적 메서드
    }
    public void Go2()
    {
    	//인스턴스 메서드
    }
}

Class CarGoTest
{
	static void Main()
    {
    	Car.Go(); //정적 메서드 호출
        
        Car car = new Car();
        car.Go2(); //인스턴스 메서드 호출
    }
}

 

 

public과 private 메서드 사용하기

  • public 메서드: 제한 없이 접근 가능
  • private 메서드: 해당 클래스에서만 접근
using System;

class Dog
{
    public void Eat()
    {
        Console.WriteLine("[1] 밥을 먹는다.");
        this.Digest(); // [2] private 메서드 호출
    }

    private void Digest()
    {
        Console.WriteLine("[2] 소화를 시킨다.");
    }
}

class MethodPrivate
{
    static void Main()
    {
        Dog dog = new Dog();
        dog.Eat(); // [1] public 메서드 호출 
    }
}

[1] 다른 클래스에서 호출되는 메서드를 만들 때는 public 액세스 한정자를 붙인다.

[2] private 액세스 한정자가 붙은 메서드는 해당 클래스 내에서만 호출되고, 외부 클래스에서는 접근할 수 없다.

 

 

메서드의 매개변수 전달 방식

 

  • 값 전달 방식: 값을 그대로 복사해서 전달하는 방식
  • 참조 전달 방식(ref): 실제 데이터는 매개변수가 선언된 쪽에서만 저장하고, 호출된 메서드에서는 참조(가리키는)만 하는 형태로 변수 이름만 절달하는 방식
  • 반환형 전달 방식(out): 메서드를 호출하는 쪽에서 선언만 하고, 초기화하지 않고 전달하면 메서드 쪽에서 해당 데이터를 초기화해서 넘겨주는 방식
  • 가변형 전달 방식(params): 1개 이상의 매개변수를 가변적으로 받을 때 매개변수를 선언하면 params 키워드를 붙인다. 가변적이라는 것은 같은 타입으로 하나 이상 받을 수 있도록 배열형으로 받는다는 의미이다. 가변 길이 매개변수는 반드시 매개변수를 선언할 때 마지막에 위치해야 한다.

 

<값 전달 방식>

using System;

class ParameterIn
{
    static void Main()
    {
        int num = 10;
        Console.WriteLine($"[1] {num}"); // [1] 10

        Do(num);

        Console.WriteLine($"[3] {num}"); // [3] 10
    }

    static void Do(int num)
    {
        num = 20;
        Console.WriteLine($"[2] {num}"); // [2] 20
    }
}

<참조 전달 방식>

using System;

class ParameterRef
{
    static void Main()
    {
        int num = 10;
        Console.WriteLine($"[1] {num}"); // [1] 10

        Do(ref num); // 참조 전달 방식 

        Console.WriteLine($"[3] {num}"); // [3] 20
    }

    static void Do(ref int num)
    {
        num = 20; // [A] 호출한 부분에 적용(Main 메서드의 num 변수의 값이 변경됨)
        Console.WriteLine($"[2] {num}"); // [2] 20
    }
}

<반환형 매개변수 전달 방식>

using System;

class ParameterOut
{
    static void Do(out int num)
    {
        num = 1234; // [B] ref와 동일: 호출한 부분에 적용, 반드시 초기화해야 함
        Console.WriteLine($"[1] {num}"); // [1] 1234
    }

    static void Main()
    {
        int num; // [A] 변수를 반드시 초기화할 필요 없음

        Do(out num); // 반환형 매개 변수 전달 방식 

        Console.WriteLine($"[2] {num}"); // [2] 1234
    }
}

 

 

날짜 형태의 문자열을 날짜형으로 변환: out 키워드 사용하기

using System;

class DateTimeTryParse
{
    static void Main()
    {
        DateTime dt; // [1] 반환형 매개 변수에 사용될 지역 변수(초기화하지 않음)
        
        // [2] DateTime.TryParse()로 날짜 형식으로 변환 시도(변환 가능하면 dt에 저장)
        if (DateTime.TryParse("2020-01-01", out dt))
        {
            Console.WriteLine(dt);
        }
        else
        {
            Console.WriteLine("날짜 형식으로 변환할 수 없습니다.");
        }

        // [3] TryParse() 메서드에 지역 변수 선언과 동시에 초기화 가능
        if (DateTime.TryParse("2020-01-01", out var myDate))
        {
            Console.WriteLine(myDate);
        }
    }
}

[1] 날짜 형식으로 변환되면 담을 그릇을 초기화하지 않고 선언 가능

[2] TryParse() 메서드를 사용하여 날짜 형식으로 변환되면 out 키워드로 지정된 dt 변수에 변화된 날짜 값 저장

[3] out var 형태를 사용하여 [1]과 [2]를 줄여 표현하는 방법

 

 

가변 길이 매개변수

메서드의 매개변수를 받을 때 배열 형식의 매개변수를 하나 사용하여 가변적으로 하나 이상의 값을 받아 배열에 저장할 수 있는 가변형 매개변수를 제공한다.

using System;

class ParamsDemo
{
    static void Main()
    {
        // 가변 길이 매개 변수 => params
        Console.WriteLine(SumAll(3, 5)); // 8
        Console.WriteLine(SumAll(3, 5, 7)); // 15
        Console.WriteLine(SumAll(3, 5, 7, 9)); // 24
    }

    static int SumAll(params int[] numbers) // [1] params로 여러 개의 매개 변수 받기 
    {
        int sum = 0;
        foreach (int num in numbers)
        {
            sum += num;
        }
        return sum;
    }
}

params 키워드를 붙이면 이 매개변수는 가변 길이 매개변수가 된다.

가변 형식 매개변수를 일반적인 매개변수와 함께 사용할 때는 반드시 가변 형식 매개변수가 마지막에 위치해야 한다.

 

 

메서드 본문을 줄여 표현하기

using System;

class ExpressionBodiedFunction
{
    static void Main()
    {
        Work();
        Walk();
    }

    static void Work()
    {
        Console.WriteLine("Work"); // [1] 기본 형식
    }

    static void Walk() => Console.WriteLine("Walk"); // [2] 축약 형식
}

 

 

선택적 매개변수와 명명된 매개변수

메서드의 매개변수를 선언할 때는 기본값을 줄 수 있는데 이를 선택적 매개변수(optional parameter) 또는 기본 인수(default argument)라고 한다.

using System;

public class Messenger
{
    public void PrintMessage(string message, string prefix = "", string suffix = "")
    {
        Console.WriteLine($"{prefix}{message}{suffix}");
    }
}

class MethodOverloadNamed
{
    static void Main()
    {
        Messenger messenger = new Messenger();
        messenger.PrintMessage("My"); // [A]
        messenger.PrintMessage(prefix: "Oh ", message: "My"); // [B]
        messenger.PrintMessage(prefix: "Oh ", message: "My ", suffix: "God"); // [C] 
    }
}

/*
My
Oh My
Oh My God
*/

 

 

 

 

 

<Reference>

 

반응형
Comments