본문 바로가기
전공/C# 프로그래밍

7강. 객체지향 프로그래밍과 클래스 (6)튜플

by 임 낭 만 2023. 4. 19.

튜플

여러 필드를 담을 수 있는 구조체 : 형식의 이름을 갖지 않음, 임시적으로 사용할 복합 데이터 형식 선언에 적합

튜플 선언 : 명명되지 않은 선언

기본적으로는 구조체, 즉 값 형식

형식 이름 없이 선언하여 사용

프로그램 전역에서 사용할 형식에는 부적합

튜플 : 명명되지 않은 튜플 (Unnamed Tuple)

  • 필드를 담을 수 있는 형식 이름이 없는 구조체
    • 프로그램 전체에 사용할 형식 선언이 아닌 즉석에서 사용할 복합 데이터 형식
    • 값 형식으로 생성된 지역을 벗어나면 스택에서 소멸되므로 메모리 사용 부담이 적음
  • 명명되지 않은 튜플 (Unnamed Tuple)
    • 튜플 사용할 때 필드의 이름을 지정하지 않음

명명되지 않은 선언 : Item1, Item2, ...ItemN

튜플 : 명명된 튜플 (Named Tuple)

  • 명명된 튜플 (Named Tuple)
    • “필드명:” 의 형태로 필드의 이름을 지정하여 선언
  • 튜플 정의와 반대 형태로 분해 가능
    • 특정 필드를 무시하기 위해 “_” 를 이용
    • 튜플 분해를 이용해 여러 변수를 단번에 생성하고 초기화 가능
var tuple2 = (Name: "홍길동", Age: 17); 
Console.WriteLine($"{tuple2.Name}, {tuple2.Age}"); // 출력결과: 홍길동, 17

// 튜플 분해
var (name, _) = tuple2; // Age 필드는 무시
Console.WriteLine($"{name}"); // 출력결과: 홍길동

var (name2, age2) = ("이순신", 34); // 여러 변수 생성 및 초기화
Console.WriteLine($"{name2}, {age2}"); // 출력결과: 이순신, 34

명명된 선언 = 필드 명 : 값

튜플 : 두 튜플 사이의 할당

  • 명명되지 않은 튜플과 명명된 튜플 사이의 할당
    • 필드의 수와 형식이 같으면 할당이 가능
var unnamed = ("슈퍼맨", 9999); // (string, int)
var named = (Name: "홍길동", Age: 17); // (string, int) 

// 명명된 튜플 = 명명되지 않은 튜플
named = unnamed;
Console.WriteLine($"{named.Name}, {named.Age}"); // 출력결과: 슈퍼맨, 9999

named = ("원더우먼", 10000);

// 명명되지 않은 튜플 = 명명된 튜플
unnamed = named;
Console.WriteLine($"{unnamed.Item1}, {unnamed.Item2}"); // 출력결과: 원더우먼, 10000

 

using System;

namespace Tuple
{
    class MainApp
    {
        static void Main(string[] args)
        {
            // 명명되지 않은 튜플
            var a = ("슈퍼맨", 9999);
            Console.WriteLine($"{a.Item1}, {a.Item2}");
            
            // 명명된 튜플
            var b = (Name: "박상현", Age: 17);
            Console.WriteLine($"{b.Name}, {b.Age}");

            // 분해
            var (name, age) = b; // (var name, var age) = b;
            Console.WriteLine($"{name}, {age}");

            // 분해2
            var (name2, age2) = ("박문수", 34);
            Console.WriteLine($"{name2}, {age2}");

            // 명명된 튜플 = 명명되지 않은 튜플
            b = a; 
            Console.WriteLine($"{b.Name}, {b.Age}");
        }
    }
}

튜플 : 위치 패턴 매칭 (Positional Pattern Matching)

  • 튜플은 switch 문 또는 switch 식의 분기조건에 활용 가능
    • 튜플이 분해된 요소의 위치에 따라 값이 일치하는지 판단
var alice = (job: "학생", Age: 17);
var discountRate = alice switch
{
    ("학생", int n) when n < 18 => 0.2, // 학생 & 18세 미만
    ("학생", _) => 0.1, // 학생 & 18세 이상
    ("일반", int n) when n < 18 => 0.1, // 일반 & 18세 미만
    ("일반", _) => 0.05, // 일반 & 18세 이상
    _ => 0,
};
Console.WriteLine(discountRate); // 출력 0.2

 

using System;

namespace PosisionalPattern
{
    class MainApp
    {
        private static double GetDiscountRate(object client)
        {
            return client switch
            {
                ("학생", int n) when n < 18 => 0.2,  // 학생 & 18세 미만
                ("학생", _) => 0.1,  // 학생 & 18세 이상
                ("일반", int n) when n < 18 => 0.1,  // 일반 & 18세 미만
                ("일반", _) => 0.05, // 일반 & 18세 이상
                _ => 0,
            };
        }

        static void Main(string[] args)
        {
            var alice   = (job: "학생", age: 17);
            var bob     = (job: "학생", age: 23);
            var charlie = (job: "일반", age: 15);
            var dave    = (job: "일반", age: 21);

            Console.WriteLine($"alice   : {GetDiscountRate(alice)}");
            Console.WriteLine($"bob     : {GetDiscountRate(bob)}");
            Console.WriteLine($"charlie : {GetDiscountRate(charlie)}");
            Console.WriteLine($"dave    : {GetDiscountRate(dave)}");
        }
    }
}

댓글