구조체란?
기존의 변수와 배열은 하나의 이름으로 하나의 데이터 형식을 가지고 공간을 차지했다.
구조체란 변수와 배열을 확장하여 하나의 이름으로 여러 개의 데이터 형식을 한 개 또는 여러 개 보관하는 그릇 역할을 하는 것이 바로 구조체(struct)이다.
구조체 변수란 하나의 이름으로 하나 이상의 데이터 형식을 하나 보관해 놓는 그릇 역할이고, 구조체 배열은 하나의 이름으로 하나 이상의 데이터 형식을 여러 개 보관해 놓는 그릇 역할을 하는 것으로 볼 수 있다.
1. Data Type 정의
2. 해당 Type의 변수 선언
3. 해당 구조체 사용
구조체 선언 모양
struct 구조체명
{
데이터형식 변수1;
데이터형식 변수2;
데이터형식 변수3;
}
구조체를 의미하는 struct 키워드를 사용하여 구조체를 만들고, 중관호 안에 구조체 멤버들을 생성한다.
여기에서 구조체 이름은 새로운 데이터 형식이 되며, 변수를 선언할 때 구조체 이름을 사용할 수 있다.
구조체를 가리켜 사용자 정의 데이터 형식이라고도 한다.
ex)
namespace structEx
{
class Program
{
struct Point
{
public int x;
public int y;
}
static void Main(string[] args)
{
Point p;
p.x = 100;
p.y = 200;
Console.WriteLine($"{p.x}, {p.y}");
}
}
}
구조체 배열
명함구조체[] 명함배열 = new 명함구조체[1000];
ex)
namespace structEx
{
class Program
{
struct Student
{
public int A;
public int B;
public int C;
public int sum;
public double avg;
}
static void Main(string[] args)
{
Student s; //s라는 변수 안에 A, B, C, sum, avg가 포함된다.
s.A = 100;
s.B = 200;
s.C = 300;
Student[] students = new Student[5];
students[0].A = 500;
students[0].B = 600;
students[1].A = 5000;
students[4].A = 50000000;
for (int i = 0; i<5; i++)
{
Console.WriteLine($"{students[i].A}, {students[i].B}");
}
}
}
}
구조체 배열을 통해 변수를 입력하고, for문을 통해 구조체 배열에 입력된 값들을 확인할 수 있다.
구조체 매개 변수
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}");
}
위와 같이 구조체 Member를 생성한 뒤 Print 함수의 매개변수로 구조체를 입력할 수 있다.
내장형 구조체
DateTime 구조체: 시간/날짜 관련된 모든 정보를 제공합니다.
TimeSpan 구조체: 시간/날짜 간격에 대한 모든 정보를 제공합니다.
Char 구조체: 문자 관련 모든 정보를 제공합니다. 예를 들어, 특정 문자가 숫자 형식인지 기호 문자인지 공백 문자인지 등을 판단하는 기능을 제공합니다.
Guid 구조체: 절대로 중복되지 않는 유일한 문자열을 생성해줍니다.
TimeSpan 구조체 ex)
namespace netStruct
{
class Program
{
static void Main(string[] args)
{
TimeSpan dDay = Convert.ToDateTime("2024-12-25") - DateTime.Now;
Console.WriteLine($"{DateTime.Now.Year}년도 크리스마스는 {(int)dDay.TotalDays}일 남음");
TimeSpan times = DateTime.Now - Convert.ToDateTime("1995-04-17");
Console.WriteLine($"내가 지금까지 살아온 년도와 날짜는 {(int)times.TotalDays}일 살아왔고, {((int)times.TotalDays / 365)}년 살아왔습니다.");
}
}
}
구조체 배열을 이용한 학생 점수 합, 평균 구하기
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 5명, 이름 - string, 과목 - int, 합 - int, 평균 - double
// 5명 정보 입력
// 출력 A, B, sum, avg 계산을 해서 출력
namespace structStudent
{
class Program
{
struct Student
{
public string name;
public int A, B;
public int sum;
public double avg;
}
static void Main(string[] args)
{
Student[] s = new Student[5];
// 이름 및 A, B 과목
for(int i = 0; i < 5; i++)
{
Console.WriteLine($"{i+1}번째 이름을 입력하세요 : ");
s[i].name = Console.ReadLine();
Console.WriteLine($"{i+1}번째 A과목 점수를 입력하세요 : ");
s[i].A = Convert.ToInt32(Console.ReadLine());
Console.WriteLine($"{i+1}번째 B과목 점수를 입력하세요 : ");
s[i].B = Convert.ToInt32(Console.ReadLine());
s[i].sum = s[i].A + s[i].B;
s[i].avg = s[i].sum / 2;
Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("*******입력한 학생 정보입니다.*******");
for(int i = 0; i < 5; i++)
{
Console.WriteLine($"{i}번째 학생 이름은 : {s[i].name}");
Console.WriteLine($"{i}번째 학생의 A과목 점수는 : {s[i].A}");
Console.WriteLine($"{i}번째 학생의 B과목 점수는 : {s[i].B}");
Console.WriteLine($"{i}번째 학생 A, B 과목 점수 합은 : {s[i].sum}");
Console.WriteLine($"{i}번째 학생 A, B 과목 점수의 평균은 : {s[i].avg}");
Console.WriteLine();
}
}
}
}
열거형
열거형(Enumeration) 형식은 기억하기 어려운 상수들을 기억하기 쉬운 하나의 이름으로 묶어 관리하는 표현 방식이다.
열거형을 사용하면 여러 개의 값 리스트를 하나의 이름으로 관리할 수 있다. 열거형은 enum 키워드를 사용한다.
열거형 배경색 바꾸기 ex)
namespace netStruct
{
class Program
{
static void Main(string[] args)
{
// 열거형 예제
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine("Blue");
Console.ResetColor();
Console.BackgroundColor = ConsoleColor.Yellow;
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Red");
Console.ResetColor();
}
}
}
열거형 만들기
enum 열거형명
{
열거형상수1,
열거형상수2,
열거형상수3
}
enum 열거형명
{
열거형상수1 = 기본값1,
열거형상수2 = 기본값2,
열거형상수3 = 기본값3
}
지정된 열거형의 상수 리스트를 배열로 가져오기
using System;
class EnumGetNames
{
static void Main()
{
// ConsoleColor 열거형의 Type을 cc 변수에 저장
Type cc = typeof(ConsoleColor);
// 모든 색상 이름을 반환
string[] colors = Enum.GetNames(cc);
// 출력
foreach (var color in colors)
{
Console.WriteLine(color);
}
}
}
열거형 상수, 지정된 값 가져오기
namespace netStruct
{
class Program
{
enum size
{
Short,
Tall,
Grande,
Vent
}
enum price
{
Short = 3000,
Tall = 4000,
Grande = 5000,
Vent = 6000
}
static void Main(string[] args)
{
Type price_cc = typeof(price);
Type size_cc = typeof(size);
int[] prices = Enum.GetValues(price_cc) as int[];
string[] sizes = Enum.GetNames(size_cc);
foreach(int p in prices)
{
Console.WriteLine($"{p}");
}
Console.WriteLine();
foreach(string s in sizes)
{
Console.WriteLine($"{s}");
}
}
}
}
Public이 붙어있으면 다른 클래스에 있는 변수도 가져다가 쓸 수 있는 것이다.
'Embedded > 3. C, C#, Python' 카테고리의 다른 글
C - 헷갈리는 개념 정리 (0) | 2024.04.17 |
---|---|
C# - 클래스 (1) | 2024.04.15 |
C# - 코드 작성 연습 (숫자 맞추기 게임) (0) | 2024.04.10 |
C# - 배열, 함수 (코드 작성 연습) (0) | 2024.04.08 |
C - 포인터, 이중포인터 Call-by-Value, Call-by-Reference (0) | 2023.03.28 |