구조체 사용하기

  • 32 minutes to read

하나의 이름으로 서로 다른 데이터 형식을 묶어서 관리해주는 구조체에 대해서 살펴보겠습니다.

> // 구조체(Struct): 하나의 이름으로 서로 다른 데이터와 함수 등을 묶어 관리하는 데이터 구조

C# 교과서 22장 구조체 사용하기 동영상 강의

다음 동영상은 C#의 구조체에 대한 기본 소개를 진행합니다. 미리보기로 먼저 시청 후 아래 이어지는 내용들을 읽어보셔도 좋습니다.

구조체란?

구조체(Struct)는 하나의 데이터 묶음을 하는 레코드 역할을 합니다. 앞서 배운 변수는 하나의 이름으로 하나의 공간을 갖고, 배열은 하나의 이름으로 동일한 데이터 형식을 갖는 여러 개의 공간을 갖습니다. 변수와 배열을 확장하여 하나의 이름으로 여러 개의 데이터 형식을 한 개 또는 여러 개 보관하는 그릇 역할을 하는 것이 바로 구조체(Struct)입니다. 구조체는 int, string 등의 서로 다른 자료를 하나의 집단으로 정의하여 하나의 이름으로 지정할 수 있는 여러 항목들의 모임으로, 데이터베이스에서 말하는 레코드(Record) 개념으로 볼 수 있습니다. 구조체 변수란 하나의 이름으로 하나 이상의 데이터 형식을 하나 보관해 놓는 그릇 역할이고, 구조체 배열은 하나의 이름으로 하나 이상의 데이터 형식을 여러 개 보관해 놓는 그릇 역할을 하는 것으로 볼 수 있습니다. C#에서는 구조체를 확장한 클래스(Class) 개념을 제공하기에 구조체는 닷넷에 이미 만들어 있는 내장 구조체를 몇 개 정도 학습한 후 뒤에서 배울 클래스 위주로 사용하면 좋습니다.

구조체 만들기

구조체를 만드는 방법은 다음과 같습니다. 구조체를 의미하는 struct 키워드를 사용하여 구조체를 만들고 중괄호 안에 구조체의 멤버들을 생성할 수 있습니다.

구조체 선언 모양

struct 구조체명
{
    데이터형식 변수1;
    데이터형식 변수2;
    데이터형식 변수3; 
}

위에서 구조체명은 새로운 데이터 형식이 되며, 변수를 선언할 때 구조체 이름을 사용할 수 있습니다. 구조체를 가리켜 사용자 정의 데이터 형식으로 부르기도 합니다.

구조체 만들고 사용하기

다음 샘플 코드는 Point 이름으로 XY를 담을 수 있는 구조체를 만들고 값을 저장 후 이를 다시 출력하는 내용입니다.

> struct Point
. {
.     public int X;
.     public int Y;
. }
> Point p;
> p.X = 100;
> p.Y = 200;
> $"{p.X}, {p.Y}"
"100, 200"

이처럼 구조체를 사용하면 하나의 이름으로 여러 데이터를 저장하여 사용할 수 있습니다.

구조체를 사용하여 하나 이상의 변수 또는 배열을 묶어서 관리

구조체를 사용하여 하나 이상의 변수를 묶어서 사용하는 방법에 대해서 예제를 먼저 살펴보겠습니다.

코드: StructDemo.cs

//[?] 구조체: 하나 이상의 변수 또는 배열을 묶어서 관리
using System;

struct Point
{
    public int X; // public 키워드를 사용하여 외부에서 int X 변수를 사용하도록 설정
    public int Y;
}

class StructDemo
{
    static void Main()
    {
        Point point; // Point 구조체 형식의 변수 선언
        point.X = 100; // 점을 구분해서 X 변수에 값을 할당
        point.Y = 200; // 점을 구분해서 Y 변수에 값을 할당
        Console.WriteLine($"X: {point.X}, Y: {point.Y}"); // X: 100, Y: 200  
    }
}
X: 100, Y: 200

구조체를 선언할 때에는 struct 키워드를 사용합니다. struct Point {} 형태로 Point 이름의 구조체를 만듭니다. 만들어진 구조체는 int, string 형식의 변수 선언과 동일한 방법으로 선언 후 사용할 수 있습니다. 다만, 변수와의 차이점은 변수는 하나의 값만 저장하는 대신에 구조체는 점(.)을 구분으로 구조체 선언 시 사용한 여러 개의 변수를 하나의 이름(point)으로 묶어서 사용할 수 있는 장점을 가집니다.

구조체 선언 및 사용하기 예제

앞서 예제에서 살펴본 것처럼 구조체를 선언하고 사용하려면 구조체 변수를 선언한 후 사용할 수 있습니다. 다음 예제를 C# Interactive에서 단계별로 실행해 보세요. 한글 주석은 생략하면 됩니다. 프로젝트로 만들어진 소스 코드는 StructNote.cs 파일에 있습니다.

구조체 선언은 struct 키워드와 public을 붙인 변수를 사용하여 만듭니다.

> //[1] 구조체 선언
. struct BusinessCard
. {
.     public string Name; // Name 필드(Field): 필드 개념은 따로 클래스 시간에 배움
.     public int Age;
.     public string Address;
. }

선언된 구조체 이름을 통해서 마치 int, string 형식 변수를 만드는 것처럼 변수를 만들 수 있습니다.

> //[A] int 형식, string 형식 변수가 아닌 구조체 형식 변수 선언
. BusinessCard my;

위와 같이 명함을 의미하는 BusinessCard 이름의 구조체를 선언하면, 메모리 상에 다음과 같은 공간이 잡힙니다.

이름 나이 주소
- - -

그림: BusinessCard 구조체를 선언할 때의 메모리 공간

BusinessCard 구조체를 선언할 때의 메모리 공간

구조체 형식 변수인 my 변수는 하나의 이름으로 Name, Age, Address를 묶어서 저장할 수 있습니다.

> //[B] 구조체의 Name, Age, Address 변수(필드)에 접근해서 사용
. my.Name = "홍길동";
. my.Age = 21;
. my.Address = "서울시";

구조체의 각 항목을 일반적으로 구조체 멤버(Member)라고 부릅니다. 구조체 멤버에 값을 할당할 때에는 점(.)을 구분으로 값을 입력합니다.

구조체변수명.멤버명 = 값;

이렇게 구조체를 사용하면 서로 다른 데이터 형식을 묶어서 관리하는 편리함을 제공받을 수 있습니다. 구조체 변수를 사용하는 것은 점(.)을 구분으로 각각의 멤버를 호출해서 사용합니다.

> //[C] 구조체를 사용하면 서로 다른 형식의 변수를 묶어서 관리하는 편리함 제공
. Console.WriteLine($"{my.Name}, {my.Age}, {my.Address}");
. 
홍길동, 21, 서울시

구조체를 사용하여 하나의 변수로 여러 개의 변수를 묶어서 관리

구조체를 사용하여 하나의 변수로 여러 개의 변수를 묶어서 관리하는 내용을 또 다른 예제로 살펴보겠습니다. 참고로, 코드에서는 아래 영역에 있는 Product 구조체를 먼저 작성해야합니다.

코드: StructVariable.cs

// StructVariable.cs
// 구조체를 사용하여 하나의 변수로 여러 개의 변수를 묶어서 관리
using System;

class StructVariable
{
    static void Main()
    {
        // 구조체 형식 변수 선언
        Product product;
        // 구조체 변수의 각각의 멤버에 값을 할당 
        product.Id = 1;
        product.Title = "좋은 책";
        product.Price = 10000M;
        // 구조체 형식 변수 사용
        string message = 
            $"번호: {product.Id}\n상품명: {product.Title}\n가격: {product.Price}";
        Console.WriteLine(message);
    }
}

// 3개의 멤버(Member)를 가지는 Product 구조체 선언
struct Product
{
    // 구조체의 멤버가 되는 변수들은
    // public 액세스 한정자(Access Modifier)를 붙여서 외부에서 사용 가능하도록 설정
    public int Id; // 상품번호
    public string Title; // 상품명
    public decimal Price; // 가격
}
번호: 1
상품명: 좋은 책
가격: 10000

struct 키워드를 사용하여 만든 개체는 일반 변수처럼 사용할 수 있습니다. 구조체 내에 전역적으로 선언된 변수를 멤버 변수라고 합니다.

멤버 변수들은 외부에서 사용하도록 public 키워드를 붙입니다. public 키워드를 액세스 한정자(Access Modifier)라고도 합니다.

구조체를 사용하게 되면 하나의 이름으로 여러 개의 서로 다른 데이터 형식을 가지는 변수들을 묶어서 관리할 수 있습니다.

구조체 변수를 사용하면 점(.)을 찍어서 여러 개의 멤버 변수 목록을 볼 수 있어 편리합니다.

구조체 배열

구조체에도 배열을 사용할 수 있습니다. 다음과 같이 구조체 배열을 사용하여 1,000개의 명함구조체를 만들 수 있습니다.

명함구조체[] 명함배열 = new 명함구조체[1000];

만들어진 구조체 배열은 다음과 같이 0번째 인덱스부터 999번째 인덱스까지 배열을 사용하여 이름, 주소, 전화번호 멤버에 접근해서 값을 할당하거나 값을 참조해서 사용할 수 있습니다.

이름 주소 전화번호
명함배열[0].이름 명함배열[0].주소 명함배열[0].전화번호
... ... ...
... ... ...
... ... ...
명함배열[999].이름 명함배열[999].주소 명함배열[999].전화번호

그림: 만든 구조체 배열 형태

만든 구조체 배열 형태

구조체 배열을 사용해서 데이터 대입 및 출력하기

이번에는 변수와 배열을 사용할 때 이미 알고 있는 데이터 형식을 사용하지 않고 새롭게 만든 데이터 형식, 즉 구조체를 만들어 그 구조체 형식 변수 및 배열을 사용하는 방법을 알아보겠습니다.

참고로, 구조체와 클래스를 namespace 키워드를 사용하여 한번 더 묶어주었습니다.

코드: StructArray.cs

using System;

namespace StructArray
{
    //[1] 구조체 선언
    struct BusinessCard
    {
        public string Name; // 이름
        public int Age; // 나이
    }

    class StructArray
    {
        // 출력 전담 함수
        static void Print(string name, int age) 
            => Console.WriteLine($"{name}은(는) {age}살입니다.");

        static void Main()
        {
            //[A] 구조체 변수: 하나의 이름으로 하나 이상의 데이터 형식을 하나 보관
            BusinessCard biz; // 구조체 형식 변수 선언
            biz.Name = "홍길동";
            biz.Age = 17;
            Print(biz.Name, biz.Age);

            //[B] 구조체 배열: 하나의 이름으로 하나 이상의 데이터 형식을 여러 개 보관
            BusinessCard[] names = new BusinessCard[2]; // 구조체 형식 배열 선언
            names[0].Name = "백두산"; names[0].Age = 102;
            names[1].Name = "임꺽정"; names[1].Age = 31;
            for (int i = 0; i < names.Length; i++)
            {
                Print(names[i].Name, names[i].Age);
            }
        }
    }
}
홍길동은(는) 17살입니다.
백두산은(는) 102살입니다.
임꺽정은(는) 31살입니다.

BusinessCard 구조체를 사용하여 변수와 배열을 만들어 보았습니다. C 언어와 같은 이전 프로그래밍 언어에 비해서 C#에서의 구조체 사용은 클래스의 사용에 비해서 그 사용 빈도가 극히 적은 편입니다. 하지만, 간단한 구조의 데이터를 모아서 처리할 때에는 클래스에 비해서 처리 속도가 좋기에 적절하게 사용하도록 합니다.

구조체 매개 변수: 함수의 매개 변수에 구조체 사용하기

이번에는 함수의 매개 변수로 구조체를 전달하는 구조체 매개 변수를 사용해보겠습니다.

코드: StructParameter.cs

using System;

// Member 구조체 선언
struct Member
{
    public string Name;
    public int Age;
}

class StructParameter
{
    static void Main()
    {
        //[1] 변수 사용
        string name = "홍길동";
        int age = 21;
        Print(name, age); // 매개 변수를 따로 선언

        //[2] 구조체 사용 
        Member m;
        m.Name = "백두산";
        m.Age = 100;
        Print(m); // 구조체 매개 변수를 사용하여 전달
    }

    static void Print(string name, int age) =>
        Console.WriteLine($"이름: {name}, 나이: {age}");

    static void Print(Member member) =>
        Console.WriteLine($"이름: {member.Name}, 나이: {member.Age}");
}
이름: 홍길동, 나이: 21
이름: 백두산, 나이: 100

이 예제는 두 가지 방식을 통해 Print 함수에 데이터를 전달합니다. 첫 번째는 일반적인 변수를 사용하는 방식이고, 두 번째는 구조체를 활용하는 방식입니다. 매개변수가 많을 경우, 구조체를 사용하여 데이터를 효율적으로 묶어 전달할 수 있으며, 이는 코드의 복잡성을 줄이고 가독성을 높이는 데 도움이 됩니다.

향후 클래스에 대해 배우면서, 여러 값을 전달할 때 주로 클래스 인스턴스를 사용하는 방법에 대해서도 알아볼 것입니다.

[!INCLUDE 중첩 구조체 사용하기)]

내장형 구조체 사용하기

닷넷 프레임워크에 이미 내장(BuiltIn)되어 있는 구조체 중에는 자주 사용되는 구조체는 날짜 처리를 전담하는 DateTime 구조체와 TimeSpan 구조체가 있고, 문자 관련 처리를 담당하는 Char 구조체가 있습니다.

이번에 살펴볼 내장형 구조체 4가지를 미리 정리해 보면 다음과 같습니다.

  • DateTime 구조체: 시간/날짜 관련된 모든 정보를 제공합니다.
  • TimeSpan 구조체: 시간/날짜 간격에 대한 모든 정보를 제공합니다.
  • Char 구조체: 문자 관련 모든 정보를 제공합니다. 예를 들어, 특정 문자가 숫자 형식인지 기호 문자인지 공백 문자인지 등을 판단하는 기능을 제공합니다.
  • Guid 구조체: 절대로 중복되지 않는 유일한 문자열을 생성해줍니다.

날짜 관련 구조체 사용하기

날짜 관련 내장 구조체에는 DateTimeTimeSpan 구조체가 있습니다.

DateTime 구조체를 사용하여 날짜 정보 얻기

이번에는 닷넷에 내장되어 있는 구조체 중에서 날짜 관련 구조체인 DateTime 구조체를 사용해보겠습니다.

코드: DateTimeDemo.cs

> //[1] 현재 시간 출력: DateTime 구조체
> Console.WriteLine($"현재 시간: {DateTime.Now}");
현재 시간: 2025-02-18 오후 10:31:10
> //[2] 년, 월, 일, 시, 분, 초 출력
> Console.WriteLine(DateTime.Now.Year);
2025
> Console.WriteLine(DateTime.Now.Month);
2
> Console.WriteLine(DateTime.Now.Day);
18
> DateTime.Now.Hour
22
> DateTime.Now.Minute
32
> DateTime.Now.Second
7
> DateTime.Now.Millisecond
264
> //[3] DateTime 형식의 변수 선언 후 속성 또는 메서드 호출
> DateTime now = DateTime.Now;
> Console.WriteLine(now.Date);
2025-02-18 오전 12:00:00
> Console.WriteLine(now.ToLongTimeString());
오후 10:32:16

DateTime 구조체의 Now 속성을 사용하면 현재 사용중인 컴퓨터의 시간 관련한 모든 정보를 알려줍니다.

단순하게 날짜 전체 정보를 화면에 출력하려면 DateTime.Now를 사용하면 됩니다.

만약, 각각의 날짜와 시간 정보를 따로 호출하려면 DateTime.Now.Year 부터 DateTime.Now.Millisecond 까지 사용해서 문자열을 묶어 원하는 모든 날짜와 시간 정보를 얻을 수 있습니다.

DateTimeOffset

DateTime 구조체와 동일한 기능을하나, UTC(Universal Time) 시간을 기준으로 합니다.

> DateTime.Now
> DateTimeOffset.Now

UtcNow와 시간 변환

DateTime.Now는 현재 시스템의 로컬 시간(예: 한국 시간 UTC+9)을 반환하지만, DateTime.UtcNow를 사용하면 협정 세계시(UTC, Universal Time Coordinated)를 가져올 수 있습니다. 이는 서로 다른 시간대 간 변환이 필요한 경우 유용하게 활용됩니다.

다음은 C# 인터랙티브에서 실행한 결과를 예제로 보여줍니다.

> DateTime.Now
[2025-03-12 오후 8:44:14]
> DateTime.UtcNow
[2025-03-12 오전 11:44:17]
> DateTime.UtcNow.ToLocalTime()
[2025-03-12 오후 8:44:19]
> DateTimeOffset.UtcNow
[2025-03-12 오전 11:44:23 +00:00]
> DateTimeOffset.UtcNow.ToLocalTime()
[2025-03-12 오후 8:44:25 +09:00]
> DateTimeOffset.Now.DateTime
[2025-03-12 오후 8:45:10]
  • DateTime.UtcNow는 UTC 기준의 현재 시간을 반환합니다.
  • DateTime.UtcNow.ToLocalTime()을 호출하면 시스템의 로컬 시간대로 변환됩니다.
  • DateTimeOffset.UtcNowDateTime과 유사하지만 시간대(+00:00 또는 +09:00 등)를 포함하는 정보를 제공합니다.
  • DateTimeOffset.UtcNow.ToLocalTime()은 UTC 시간을 현재 시스템의 로컬 시간으로 변환합니다.
  • DateTimeOffset.Now.DateTime을 사용하면 현재 시스템 시간대에서 DateTime 값을 얻을 수 있습니다.

ISO 8601 날짜 및 시간 형식

ISO 8601 표준 형식의 날짜와 시간은 다음과 같이 구성됩니다.

예시: 2025-09-27T22:45:00+00:00

  • 2025: 연도 (Year)
  • 09: 월 (Month)
  • 27: 일 (Day)
  • 22: 시 (Hour)
  • 45: 분 (Minute)
  • 00: 초 (Second)
  • +00:00: 시간대 오프셋 (Time Zone Offset) 또는 Z(Zulu Time, UTC)

이 형식은 국제 표준으로, 전 세계적으로 시간 데이터를 교환할 때 일관성을 유지하는 데 사용됩니다.

TimeSpan 구조체를 사용하여 시간차 구하기

이번에는 날짜와 시간 차이를 구해주는 TimeSpan 구조체를 사용해보겠습니다.

코드: TimeSpanDemo.cs

using System;

class TimeSpanDemo
{
    static void Main()
    {
        // 시간차(D-Day) 구하기: TimeSpan 구조체
        TimeSpan dday = Convert.ToDateTime("2025-12-25") - DateTime.Now;
        Console.WriteLine(
            $"{DateTime.Now.Year}년도 크리스마스는 {(int)dday.TotalDays}일 남음");

        // 지난 시간 구하기
        TimeSpan times = DateTime.Now - Convert.ToDateTime("1975-02-05");
        Console.WriteLine($"내가 지금까지 며칠 살아왔는지? {(int)times.TotalDays}");
    }
}
2025년도 크리스마스는 309일 남음
내가 지금까지 며칠 살아왔는지? 18276

날짜간의 차이는 TimeSpan 구조체를 사용할 수 있습니다.

앞으로 남은 시간은 (해당 시간 – 현재 시간)을 TimeSpan 구조체 변수에 담고 이 변수의 주요 속성을 사용하여 여러 가지 형태로 값을 추출해낼 수 있습니다.

구조체_날짜관련.cs

C# 구조체 중에서 시간과 날짜 관련 구조체를 예제로 살펴봅니다.

코드: 구조체_날짜관련.cs

using System;

class 구조체_날짜관련
{
    static void Main()
    {
        //[1] 현재 시간 출력: DateTime 구조체
        Console.WriteLine($"현재 시간: {DateTime.Now}");

        //[2] 년, 월, 일, 시, 분, 초 출력
        Console.WriteLine(DateTime.Now.Year);
        Console.WriteLine(DateTime.Now.Month);
        Console.WriteLine(DateTime.Now.Day);
        Console.WriteLine(DateTime.Now.Hour);
        Console.WriteLine(DateTime.Now.Minute);
        Console.WriteLine(DateTime.Now.Second);
        Console.WriteLine(DateTime.Now.Millisecond);

        //[3] DateTime 형식의 변수 선언
        DateTime now = DateTime.Now;
        Console.WriteLine(now.Date);
        Console.WriteLine(now.ToLongTimeString());

        //[4] 시간차(D-Day) 구하기: TimeSpan 구조체
        TimeSpan dday = Convert.ToDateTime("2025-12-25") - DateTime.Now;
        Console.WriteLine(
            $"{DateTime.Now.Year}년도 크리스마스는 {(int)dday.TotalDays}일 남음");
    }
}
현재 시간: 2025-11-02 오후 4:33:27
2025
11
2
16
33
27
758
2025-11-02 오전 12:00:00
오후 4:33:27
2025년도 크리스마스는 52일 남음

인라인 out 변수로 문자열 형식의 날짜를 날짜 형식으로 변환하기

날짜 모양의 문자열을 실제 날짜 형식으로 변환할 때 out var 또는 out DateTime 형태로 변수를 선언하자마자 사용하는 예제를 만들어 보겠습니다.

코드: OutVariableDemo.cs

using System;

class OutVariableDemo
{
    static void Main()
    {
        if (DateTime.TryParse("2025/12/25", out var xmas))
        {
            Console.WriteLine(xmas);
        }
    }
}
2025-12-25 오전 12:00:00

위 코드에서 날짜 모양의 문자열이기에 날짜 형식인 DateTime 형태의 변수인 xmas 변수가 생성되고 사용이 됩니다.

여기서 out var xmasout DateTime xmas 형태로 명확하게 형식을 지정할 수도 있습니다.

1부터 8760까지의 정수에 해당하는 날짜를 반환해주는 함수

DateTime 구조체의 AddHours()와 같은 메서드를 사용하면 아래와 같은 유형의 구할 때 편리합니다.

일반적으로 1년은 365일 8760시간입니다.

1년을 시간으로 표현해보면 1부터 8760까지로 표현할 수 있습니다.

1은 1은 20XX년 1월 1일 0시이고 8760은 20XX년 12월 31일 23시가 됩니다.

다음과 같은 기능을 하는 함수를 예제로 만들어 보겠습니다.

  • f(1) => 2025년 1월 1일 0시
  • f(8760) => 2025년 12월 31일 23시
  • f(x) => 해당 숫자에 맞는 일시

다음 소스 코드를 편집기에 입력 후 실행해 보세요.

코드: GetDateTimeFromYearlyHour.cs

using System;

class GetDateTimeFromYearlyHour
{
    static void Main()
    {
        Console.WriteLine(GetDateTimeFromYearlyHourNumber(1));
        Console.WriteLine(GetDateTimeFromYearlyHourNumber(8760/2));
        Console.WriteLine(GetDateTimeFromYearlyHourNumber(8760));
    }

    /// <summary>
    /// 1부터 8760까지의 정수를 입력받아 해당 날짜를 반환해주는 함수 
    /// </summary>
    static DateTime GetDateTimeFromYearlyHourNumber(int number)
    {
        return (new DateTime(2025, 1, 1, 0, 0, 0)).AddHours(--number);        
    }
}
2025-01-01 오전 12:00:00
2025-07-02 오전 11:00:00
2025-12-31 오후 11:00:00

DateTime 구조체의 AddHours() 메서드는 현재 시간에 시간 값을 더한 후 다시 그 값을 돌려줍니다.

이를 통해서 1월 1일 0시부터 시작해서 12월 31일 23시까지의 시간을 1부터 8760에 맞는 시간 정보를 얻을 수 있습니다.

올해가 며칠 지났는지

> $"올해가 {(DateTime.Now - (new DateTime(2025, 1, 1))).TotalDays}일 지났습니다."
"올해가 223.008214650928일 지났습니다."
> 

만 14세 미만 체크

C#을 사용하여 생년월일 정보를 입력 받았을 때, 이를 사용해서 만 14세 미만인지 아닌지를 체크하는 메서드를 만들어 보도록 하겠습니다. 다음 코드의 IsBelow14() 메서드가 이러한 역할을 합니다.

코드: UserRegister.cs

// IsBelow14_연습문제_만 14세 미만 체크 메서드 구현
using System;

class UserRegister
{
    static void Main(string[] args)
    {
        Console.WriteLine(IsBelow14(2002, 2, 2)); // false
        Console.WriteLine(IsBelow14(2005, 2, 2)); // flase 
        Console.WriteLine(IsBelow14(2025, 1, 1)); // true 
    }

    //[!] 만 14세 미만 체크 by (년, 월, 일)
    public static bool IsBelow14(int year, int month, int day)
    {
        // 현재 년월일과 생년월일의 차이 구하기
        var yearDiff = DateTime.Now.Year - year;
        var monthDiff = DateTime.Now.Month - month;
        var dayDiff = DateTime.Now.Day - day;

        // 년도 차이가 14이면 월과 일 차이도 체크
        if (yearDiff == 14)
        {
            // 월 차이가 마이너스면 아직 생일이 지나지 않은 상태
            if (monthDiff < 0)
            {
                return true; // 만 14세 미만
            }
            else if (monthDiff == 0)
            {
                if (dayDiff < 0)
                {
                    return true; // 만 14세 미만
                }
                else
                {
                    return false; // 만 14세 이상 
                }
            }
            else
            {
                return false;
            }
        }
        else if (yearDiff < 14)
        {
            return true; // 아직 14세 미만
        }
        else
        {
            return false; // 14세 이상
        }
    } // </만 14세 미만 체크> 
}
False
False
True

문자 관련 구조체

이번에는 문자 관련 구조체인 Char 구조체를 사용해보겠습니다.

Char 구조체를 사용하면 문자의 내용을 판단하여 대문자, 소문자, 숫자인지 등을 판단할 수 있습니다.

코드: CharStruct.cs

using System;

class CharStruct
{
    static void Main()
    {
        char a = 'A'; char b = 'a';
        char c = '1'; char d = '\t'; // 이스케이프 시퀀스도 하나의 문자로 인식

        if (Char.IsUpper(a)) // 대문자인지?
        {
            Console.WriteLine("{0}은(는) 대문자", a);
        }
        if (Char.IsLower(b)) // 소문자인지?
        {
            Console.WriteLine("{0}은(는) 소문자", b);
        }
        if (Char.IsNumber(c)) // 숫자형인지? 
        {
            Console.WriteLine("{0}은(는) 숫자형", c);
        }
        if (Char.IsWhiteSpace(d)) // 공백 문자인지? 
        {
            Console.WriteLine("{0}은(는) 공백 문자", d);
        }

        Console.WriteLine(Char.ToLower(a)); // A -> a
        Console.WriteLine(Char.ToUpper(b)); // a -> A

        string s = "abc";
        if (Char.IsUpper(s[0])) // 첫문자가 대문자인지?
        {
            Console.WriteLine("첫문자가 대문자로 시작합니다.");
        }
        else
        {
            Console.WriteLine("첫문자가 소문자로 시작합니다.");
        }

        Console.WriteLine(Char.MinValue); // 문자의 최솟값
        Console.WriteLine(Char.MaxValue); // 문자의 최댓값
    }
}
A은(는) 대문자
a은(는) 소문자
1은(는) 숫자형
        은(는) 공백 문자
a
A
첫문자가 소문자로 시작합니다.

?

위 실행결과는 콘솔 창에서 제대로 나오지 않을 수 있습니다.

System 네임스페이스에 있는 Char 구조체는 여러가지 속성과 메서드를 제공합니다.

이를 통해서 특정 문자에 대한 속성을 가져오거나 다른 문자 형태로 변환을 해주는 등의 작업을 할 수 있습니다.

Guid 구조체로 유일한 값 출력하기

닷넷에 내장된 구조체 중에서 Guid 구조체는 GUID(Globally Uinque Identifier) 값을 출력합니다.

GUID 값은 유일한 값을 의미하는데 실행할 때마다 동일한 값을 만날 확률이 0입니다.

이번에는 Guid 구조체를 사용해보겠습니다.

코드: GuidDemo.cs

using System;

class GuidDemo
{
    static void Main()
    {
        string unique = Guid.NewGuid().ToString();
        Console.WriteLine($"유일한 값: {unique}");

        Console.WriteLine($"유일한 값: {Guid.NewGuid().ToString("D")}");
    }
}
유일한 값: 86f84261-ed4d-4ac3-ac4b-07714326e0b6
유일한 값: 30ead7ae-39ea-44fd-b394-675179b9c0cd

Guid.NewGuid().ToString() 형태로 실행할 때마다 서로 다른 문자열을 출력할 수 있습니다.

이렇게 출력되는 문자열은 데이터의 레코드를 구분하는 고유한 키 값으로도 많이 사용됩니다.

Guid 값을 ToString 메서드를 통해서 출력할 때 서식 지정자로 D를 사용해 보았습니다. D를 사용하면 하이픈으로 구분 된 32자리 숫자로 표현됩니다. D 이외에 N, B, P, X 등이 있는데 해당 옵션에 대한 자세한 사항은 AI 검색 또는 Microsoft Learn 사이트를 참고하기 바랍니다.

장 요약

구조체는 DateTimeTimeSpan과 같은 내장 구조체는 많이 사용하지만 사용자가 직접 만드는 사용자 정의 구조체는 잘 사용하지 않습니다.

그 이유는 뒤에서 배울 클래스때문인데요.

요즘은 클래스로 구조체의 역할까지도 하기 때문에 클래스로 주로 사용하고 구조체는 내장 구조체를 기본으로 사용하면 됩니다.

구조체 퀴즈

퀴즈

(1) C#에서 구조체를 정의할 때 사용하는 키워드는 무엇인가요?

a. struct
b. structure
c. class
d. interface

정답: a

C#에서 구조체는 struct 키워드를 사용하여 정의합니다.


(2) 다음 중 구조체 pointX 멤버 변수에 접근하는 올바른 방법은 무엇인가요?

a. point->X
b. point.X
c. point-X
d. point:X

정답: b

C#에서 구조체의 멤버에 접근할 때는 점(.) 연산자를 사용합니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com