개발꿈나무
[C# 교과서] 18. C# 활용(12) - 메서드와 매개변수 본문
메서드와 매개변수
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>
'C# 기초' 카테고리의 다른 글
[C# 교과서] 20. C# 활용(14) - 인덱서와 반복기 (0) | 2022.01.20 |
---|---|
[C# 교과서] 19. C# 활용(13) - 속성 사용하기 (0) | 2022.01.20 |
[C# 교과서] 17. C# 활용(11) - 생성자, 소멸자 (0) | 2022.01.20 |
[C# 교과서] 16. C# 활용(10) - 네임스페이스, 필드 (0) | 2022.01.19 |
[C# 교과서] 15. C# 활용(9) - 개체 만들기 (0) | 2022.01.19 |