class와 struct(구조체)는 유사하지만 차이점이 있다.
클래스는 기본 생성자로 초기화 후, 대입하여 사용해야 한다.
● class
1. 데이터와 메서드를 하나로 묶은 사용자 정의 타입
2. 객체를 생성하기 위한 템플릿 또는 설계도 역할
3. 속성과 동작을 가짐
4. 클래스를 사용하여 인스턴스를 만듦
* ex) 붕어빵틀 (클래스), 붕어빵(인스턴스, 객체)
● class의 구성요소
1. 필드
- 클래스에서 사용되는 변수
class Player
{
private string name;
private int level;
}
2. 메서드
- 클래스에서 수행되는 동작, 함수
class Player
{
public void Attac()
{
// 공격 동작 구현
}
{
3. 생성자
- 객체를 초기화하는 역할
- 객체가 생성될 때 자동으로 호출
- 생성자는 클래스와 동일한 이름을 가지며, 반환 타입이 없음
- 객체를 생성할 때 new 키워드와 함께 호출 됨
- 생성자는 여러개 정의할 수 있으며 매개변수의 변수와 타입에 따라 다른 생성자를 호출함 (생성자 오버로딩)
- 기본적으로 매개변수가 없는 디폴트 생성자가 클래스에 자동으로 생성, 사용자가 정의한 경우, 자동 생성 안됨
class Person
{
private string name;
private int age;
public void PrintInfo()
{
Console.WriteLine($"Name: {name}, Age: {age}");
}
// 디폴트 생성자
public Person()
{
name = "UnKnown";
age = 0;
}
// 추가 생성자
public Person(string newName, int newAge)
{
name = newName;
age = newAge;
}
}
static void Main(string[] args)
{
Person person1 = new Person();
Person person2 = new Person("Jhon", 25);
}
* 생성자를 정의하지 않으면 디폴트 생성자가 자동으로 정의
* 추가 생성자를 정의했다면, 디폴트 생성자를 직접 만들어야 함
4. 소멸자
- 객체가 소멸될 때 호출하는 메서드
- 메모리나 리소스의 해제 등 작업을 수행
- 클래스와 동일한 이름을 가지며, 이름 앞에 ~를 붙여 표현
- 소멸자는 반환 타입이 없고 매개변수를 가질 수 없음
- C#에서는 가비지 컬렉터(Garbage Collector)에 의해 메모리 해제가 자동으로 되므로, 소멸자를 사용을 권장하지 않음
class Person
{
private string name;
private int age;
public void PrintInfo()
{
Console.WriteLine($"Name: {name}, Age: {age}");
}
// 소멸자
~Person()
{
}
}
● 공통점
1. 변수와 함수의 모음
2. 자료형을 새로 만들 때 사용
3. 사용자 정의 형식
● 차이점
특징 | 클래스 | 구조체 |
키워드 | class | struct |
형식 | 참조형식 (Heap 할당) | 값 형식 (Stack 할당) |
인스턴스 생성 | new 연산자와 생성자 필요 | 선언만으로 생성 |
상속 | 가능 | 불가능 |
메모리 사용방식 | 객체 중심 | 데이터 중심 |
예시 | 스크립트, Random 함수 | Vector3 |
☞ 값형과 참조식 : https://kkln2486.tistory.com/73
● 예시
// Class
public class ClassPos
{
public int x;
public int y;
public int z;
public void Show()
{
print (x + " " + y + " " + z);
}
// 추가생성자 정의
public ClassPos (int xln, int yln, int zln)
{
x = xln;
y = yln;
z = zln;
}
}
classPos cPos; // 레퍼런스 변수 생성 (실제 데이터를 가리킴)
cPos = new ClassPos(); // x, y, z 에 0이 대입되면서 cPos실데이터의 참조가 저장
cPos.x = 10;
cPos.y = 20;
cPos.z = 30;
// cPos = new ClassPos(10, 20, 30); 과 동일
// Struct
public struct StructPos
{
public int x;
public int y;
public int z;
public void Show()
{
print(x +"" + y + "" + z);
}
// 추가생성자 정의
public StructPos(int xln, int yln, int zln)
{
x = xln;
y = yln;
z = zln;
}
}
StructPos pos;
pos.x = 10;
pos.y = 20;
pos.z = 30;
// pos = new StructPos (10, 20, 30); 과 동일
'C#' 카테고리의 다른 글
C#의 특징 (0) | 2023.11.06 |
---|---|
데이터형식 범위 (0) | 2023.11.03 |
전위연산자, 후위연산자 비교 (++i, i++) (0) | 2023.11.03 |
점프문 (break, return, continue) 비교 (0) | 2023.11.03 |
foreach (0) | 2023.11.02 |