C#에서 클래스와 구조체는 둘 다 객체 지향 프로그래밍의 기본적인 구성 요소로 사용됩니다. 그러나 둘은 약간의 차이점이 있습니다. 이번 포스팅에서는 클래스와 구조체 각각의 특징에 대해서 정리했습니다.
클래스(Class)
클래스는 객체 지향 프로그래밍에서 가장 기본적인 개념 중 하나입니다. 클래스는 데이터와 메서드(또는 함수)를 포함할 수 있으며, 이러한 데이터와 메서드는 클래스의 인스턴스(즉, 객체)에서 사용될 수 있습니다.
클래스 선언
class MyClass
{
// 클래스의 멤버 변수 (데이터)
private int myInt;
private string myString;
// 클래스의 생성자
public MyClass(int num, string str)
{
myInt = num;
myString = str;
}
// 클래스의 메서드 (함수)
public void PrintData()
{
Console.WriteLine("myInt = " + myInt);
Console.WriteLine("myString = " + myString);
}
}
클래스의 사용
// MyClass 객체 생성
MyClass obj = new MyClass(42, "Hello World");
// MyClass 객체의 메서드 호출
obj.PrintData();
클래스의 특징
- 클래스는 참조 타입(reference type)입니다.
- 클래스는 상속을 지원합니다.
- 클래스는 클래스 간의 협업 및 데이터 공유를 용이하게 합니다.
- 클래스는 크기가 상대적으로 큰 객체에 적합합니다.
구조체(Structure)
구조체는 클래스와 비슷하지만, 몇 가지 차이점이 있습니다. 구조체는 클래스와 달리 값 형식(value type)이며, 일반적으로 클래스보다 작고 단순한 객체를 나타냅니다. 구조체는 구조체의 인스턴스를 생성할 때 메모리를 할당하는 데 필요한 시간과 자원이 적기 때문에 일반적으로 성능이 더 우수합니다.
구조체의 선언
struct MyStruct
{
// 구조체의 멤버 변수 (데이터)
public int myInt;
public string myString;
// 구조체의 생성자
public MyStruct(int num, string str)
{
myInt = num;
myString = str;
}
// 구조체의 메서드 (함수)
public void PrintData()
{
Console.WriteLine("myInt = " + myInt);
Console.WriteLine("myString = " + myString);
}
}
구조체의 사용
// MyStruct 객체 생성
MyStruct obj = new MyStruct(42, "Hello World");
// MyStruct 객체의 메서드 호출
obj.PrintData();
구조체의 특징
- 구조체는 값 형식(value type)입니다.
- 구조체는 상속을 지원하지 않습니다.
- 구조체는 클래스보다 작고 단순한 객체를 나타냅니다.
- 구조체는 스택 메모리에 저장됩니다.
- 구조체는 객체 생성과 메모리 할당에 있어서 클래스보다 효율적입니다.
- 구조체는 일반적으로 간단한 데이터 구조를 나타내는 데 적합합니다.
클래스와 구조체의 사용 예제
다음은 클래스와 구조체를 사용하여 이름, 나이, 주소를 출력하는 예제입니다.
using System;
namespace ClassAndStruct_exam
{
class Person
{
// Person 클래스의 멤버 변수 (데이터)
public string name;
public int age;
public Address address;
// Person 클래스의 생성자
public Person(string name, int age, Address address)
{
this.name = name;
this.age = age;
this.address = address;
}
// Person 클래스의 메서드 (함수)
public void PrintInfo()
{
Console.WriteLine("Name: {0}", name);
Console.WriteLine("Age: {0}", age);
Console.WriteLine("Address: {0}", address.ToString());
}
}
struct Address
{
// Address 구조체의 멤버 변수 (데이터)
public string street;
public string city;
public string state;
public string zipcode;
// Address 구조체의 생성자
public Address(string street, string city, string state, string zipcode)
{
this.street = street;
this.city = city;
this.state = state;
this.zipcode = zipcode;
}
// Address 구조체의 메서드 (함수)
public override string ToString()
{
return string.Format("{0}, {1}, {2} {3}", street, city, state, zipcode);
}
}
internal class Program
{
static void Main(string[] args)
{
// Person 객체 생성
Address address = new Address("123 Main St", "Anytown", "CA", "12345");
Person person = new Person("John Doe", 30, address);
// Person 객체의 메서드 호출
person.PrintInfo();
}
}
}
[결과]
Name: John Doe
Age: 30
Address: 123 Main St, Anytown, CA 12345
위의 코드에서 Person 클래스는 이름(name), 나이(age), 주소(address)라는 세 개의 멤버 변수를 가집니다. 이때 Address 구조체는 주소를 표현하는 멤버 변수인 street, city, state, zipcode를 가집니다.
Person 클래스의 생성자에서는 이름, 나이, 주소의 값을 입력받고, 이들을 this 키워드를 통해 Person 클래스의 멤버 변수에 저장합니다. 마지막으로 Person 클래스의 PrintInfo() 메서드를 통해 Person 객체의 이름, 나이, 주소를 출력합니다.
Address 구조체는 ToString() 메서드를 재정의하고 있습니다. 이는 구조체를 문자열을 변환하여 출력할 때 사용됩니다.
Program 클래스의 Main 메서드에서는 Person 객체를 생성하고, 이를 출력합니다. 이를 실행하면 John Doe의 나이와 주소가 출력됩니다.
'Program Language > C#' 카테고리의 다른 글
Part2. C# 기초다지기(11. 메서드 오버로딩) (16) | 2023.02.28 |
---|---|
Part2. C# 기초 다지기(10. 클래스의 구성) (11) | 2023.02.24 |
Part2. C# 기초 다지기(8. 버블 정렬) (16) | 2023.02.22 |
Part2. C# 기초 다지기(7. 선형탐색과 이진탐색) (18) | 2023.02.17 |
Part2. C# 기초 다지기(6. 배열의 최대 / 최소 값 구하기) (22) | 2023.02.15 |
댓글