1.튜플(Tuple)
C# 7 부터는 튜플(Tuple)을 사용하여 메서드로부터 복수 개의 값들을 리턴할 수 있게 되었다!
(List나 배열로도 출력이 가능하겠지만 아무래도 좀 불편했다)
파이썬이랑 문법이 상당히 유사하다. 뭐 튜플이 다 거기서 거기겠다만,,빠르게 예제로 배우자!
var person = ("Alice", 25);//기본적인 튜플 형식, 당연하겠지만 var로 선언이 가능하다.
var person = (Name: "Alice", Age: 25);//요소에 이름도 지정이 가능하다.
public static (string, int) GetPerson()
{
string name = "Alice";
int age = 25;
return (name, age);
}
//와 같이 매서드의 반환 형식으로도 표현이 가능하다.
1-1 튜플 Deconstruction
튜플로 복수 개의 값들이 리턴될 경우 이를 각각의 변수로 쪼개서 할당하는 것을 튜플 Deconstruction 이라 부른다.
대부분 우리는 클래스에 값들을 필드로 설정할 때 튜플로 선언하는 경우는 드물다(아무래도 튜플일 경우 가독성이 크게 떨어진다.) 따라서 튜플로 리턴된 값을 필드에 할당할 때 아래와 같이 편하게 셋팅이 가능하게 끔 만들어준듯 하다.
(int hp, int power) = MonsterInforTuple(list); //설정
(int hp, var power) = MonsterInforTuple(list); //var로 설정
var(hp, power) = MonsterInforTuple(list); //더 편하게 var로
(hp, power) = MonsterInforTuple(list); //아예 암시적으로 표현.
2.로컬 함수(Local Function)
메서드 안에 그 메서드에서만 사용하는 로컬 함수를 작성할 수 있다. 로컬함수는 자신의 메서드 이외에서 호출할 수 없으며, 하나의 메서드 안에는 여러 개의 로컬 함수들을 만들 수 있다.
void func() {
// 로컬 함수 정의
int add(int a, int b) {
return a + b;
}
int x = 10, y = 20;
int sum = add(x, y);
printf("%d + %d = %d\n", x, y, sum);
}
add() 함수는 func() 함수 내부에서만 사용되는 함수이다. 이런 경우에는 로컬 함수로 정의하는 것이 가독성과 유지보수성 면에서 좋다!
3.Out파라미터
일단 out 매개변수 형식은 함수의 반환값을 넘겨주는 것을 피하고, out파라미터를 직접 변경해서 넘겨주는 방법이다!
ref랑 뭐가 다른가 하면 아래의 접은글을 참고하자.
ref와 out의 차이점
using System;
class Program
{
static void Main(string[] args)
{
// ref 키워드를 사용하여 호출 전에 a를 초기화해야 함
int a = 10;
TestRef(ref a);
// out 키워드를 사용하여 호출 전에 b를 초기화하지 않아도 됨
int b;
TestOut(out b);
}
}
7.0이전
public void Calculate(int input, out int result)
{
result = input * 2;
}
// 호출하는 측
int result;
Calculate(5, out result);
7.0이후
public void Calculate(int input, out int result1, out int result2)
{
result1 = input * 2;
result2 = input * 3;
}
// 호출하는 측
Calculate(5, out int result1, out int result2);
이렇게 하면 호출하는 측에서 result1, result2 변수를 따로 선언하지 않아도 된다!
4.C# 7 자리수 분리자 및 이진 리터럴
4-1.자리수 분리자 : _ . 의 기호로 보기 좋게 정수를 선언할 수 있다. 좀 큰 상수선언에 유용할듯하다.
int a = 123_456_789;
double b = 1_234.567_890;
decimal c = 123_456.789M;
Console.WriteLine(a); // 123456789
Console.WriteLine(b); // 1234.56789
Console.WriteLine(c); // 123456.789
4-2.이진 리터럴 :이진수를 표현할 수 있다. 앞에 0x를 붙이면 16진수인 것처럼 0b를 붙이면 2진수로 표현이 된다!
int a = 0b1010; // 10진수로 10
int b = 0b1111_0000; // 10진수로 240
int c = 0b0101_0101_0101; // 10진수로 1365
Console.WriteLine(a); // 10
Console.WriteLine(b); // 240
Console.WriteLine(c); // 1365
5.Deconstructor
Deconstructor에서 De 빼면 constructor인데 이건 생성자를 의미한다. 생성자의 반대 ? 라고 생각할 수 있겠다.
생성자는 필드에 값을 넣어주는 것이라고 생각하면 그 반대로 필드의 값을 매개변수에 전달해주는(매개변수에 값을 전달해 준다는 것에서 out키워드를 이용할 것이라고 생각이 가능하다!) 역할을 한다.
class Person
{
public string Name { get; set; }
public int Age { get; set; }
public void Deconstruct(out string name, out int age)
{
name = Name;
age = Age;
}
}
'프로그래밍 언어 > c#' 카테고리의 다른 글
C# Var에 관해서 (0) | 2023.05.01 |
---|---|
C#7.0 ref local, return, struct, Throw expression (0) | 2023.04.29 |
C# 7.0 패턴 매칭 (2) | 2023.04.29 |
c# yield, nullable, 전처리기, 인덱서, Anonymous, Extension,partial, dynamic (0) | 2023.04.28 |
C# 6.0 정리 (1) | 2023.04.24 |