C# 클래스(Class)란?
C#의 클래스에 대해 알아보자. 마이크로소프트 사의 C# 공식 문서를 참고해 관련 용어를 정리해보았다.
[클래스(Class) 란?]
class(으)로 정의된 형식은 참조 형식입니다. 런타임에 참조 형식의 변수를 선언할 때 변수는 new 연산자를 사용하여 클래스의 인스턴스를 명시적으로 만들거나 다음 예제와 같이 다른 곳에서 생성되었을 수 있는 호환되는 형식의 개체를 할당할 때까지 null 값을 포함합니다. 개체가 만들어지면 해당 특정 개체에 대해 관리되는 힙에 충분한 메모리가 할당되고 변수에는 개체 위치에 대한 참조만 포함됩니다. 개체에서 사용하는 메모리는 가비지 수집으로 알려진 CLR의 자동 메모리 관리 기능에 의해 회수됩니다. 가비지 수집에 대한 자세한 내용은 자동 메모리 관리 및 가비지 수집을 참조하세요. 출처 : 마이크로소프트 C# 공식 문서 - https://learn.microsoft.com/ko-kr/dotnet/csharp/fundamentals/types/classes |
//Declaring an object of type MyClass.
MyClass mc = new MyClass();
//Declaring another object of the same type, assigning it the value of the first object.
MyClass mc2 = mc;
[참조 형식]
: 참조 형식은 객체의 실제 데이터가 아니라 객체가 있는 메모리의 주소를 저장하는 형식이다. 즉, 변수가 객체를 직접 저장하는 게 아니라 그 객체를 가리키는 참조만 가지고 있다. 그래서 같은 객체를 여러 변수가 참조할 수 있고, 한 변수가 객체를 변경하면 다른 변수에서도 그 변경된 내용을 볼 수 있다. 예시로 아래 그림을 볼 수 있다. 선언된 문자열 변수 'name'은 리터럴 변수로서 소스코드의 고정된 값 즉, null은 아무것도 참조하지 않는 값 null은 참조 형식 변수의 기본값이다.
그 후 프로그래머가 변수에 값을 할당하게 되는데, 이는 힙 영역에 할당된다.
출처 : https://velog.io/@yongseok1000/0811
[유니티 C#] 값형식과 참조형식
velog.io
그렇다면, 왜 클래스가 이 같은 참조 형식을 사용할까? 아래 4가지 이유를 들 수 있다.
- 메모리 효율성: 객체가 크고 복잡할 때, 객체의 전체 데이터를 복사하는 것보다 메모리 주소만 참조하는 것이 훨씬 효율적이다. 이렇게 하면 메모리 사용량을 줄일 수 있다.
- 객체 공유: 여러 변수가 같은 객체를 참조할 수 있어서, 객체의 상태를 공유하고 변경할 수 있다. 이로 인해 데이터의 일관성을 유지할 수 있다.
- 동적 할당: 객체는 런타임에 동적으로 생성되기 때문에, 필요한 만큼 메모리를 할당하고 해제할 수 있다. 이는 유연한 메모리 관리에 도움을 준다.
- 가비지 수집: 참조 형식은 CLR의 자동 메모리 관리 시스템인 가비지 수집과 잘 통합되어 있어, 사용하지 않는 객체를 자동으로 정리해 준다. 이로 인해 메모리 누수가 줄어든다.
[클래스 사용 간단 예시]
public class Car
{
// 필드 (속성)
public string Brand;
public string Model;
public int Year;
// 생성자
public Car(string brand, string model, int year)
{
Brand = brand;
Model = model;
Year = year;
}
// 메서드
public void DisplayInfo()
{
Console.WriteLine($"브랜드: {Brand}, 모델: {Model}, 연도: {Year}");
}
}
위 코드에서 클래스 'Car'는 세 가지 구성 요소로 이루어져 있다.
- 필드 (Field): 클래스의 속성을 정의한다.
- 생성자 (Constructor): 객체를 생성할 때 호출되는 특수한 메서드로, 초기화를 담당한다.
- 메서드 (Method): 클래스의 동작을 정의한다.
Car myCar = new Car("Toyota", "Camry", 2021);
myCar.DisplayInfo(); // 출력: 브랜드: Toyota, 모델: Camry, 연도: 2021
참조 형식의 클래스에서 실제 객체를 생성해 힙 영역에 클래스 객체를 할당하는 예시이다. 또한 상속을 사용해 새로운 클래스를 만들 수도 있다! 아래 소스 코드가 그 예시가 된다.
public class ElectricCar : Car
{
public int BatteryCapacity;
public ElectricCar(string brand, string model, int year, int batteryCapacity)
: base(brand, model, year)
{
BatteryCapacity = batteryCapacity;
}
public void DisplayBatteryInfo()
{
Console.WriteLine($"배터리 용량: {BatteryCapacity} kWh");
}
}
클래스 'ElectricCar' 는 'Car' 클래스로 부터 상속받아 만든 클래스이다. 위 생성자를 보면, 부모 클래스의 생성자를 그대로 가지면서도, 자신만의 특징(배터리 용량)이 추가되어 있다. 이는 코드 유지보수를 용이하게 한다.
'TIL' 카테고리의 다른 글
[TIL] C# 대리자(Delegate)란? (0) | 2024.09.26 |
---|---|
[TIL] C# 경고 잡기 : CS8618 이란? (0) | 2024.09.24 |
[TIL] C# 제네릭(Generic) 이란? (0) | 2024.09.20 |
[TIL] 유니티 싱글톤 패턴 활용 (1) | 2024.09.13 |
[TIL] 디자인 패턴이란 (1) | 2024.09.11 |