종료자
- 클래스 이름 앞에 ~붙이는 형태로 구현 가능 (C++과 동일)
- 그러나 구현하지 않는 편이 좋음.
1) 명시적으로 구현되어 있으면 GC가 object로부터 상속받은 Finalize() 메서드를 클래스의 족보를 타고 올라가며 호출하여 성능의 저하를 가져올 확률이 높음
2) 언제 GC가 수거해갈지 예측할 수 없음
class MyClass()
{
public MyClass()
{
// 생성자
}
public ~MyClass()
{
// 종료자
}
}
얕은 복사
- 참조형식으로 복사한 것. 같은 힙 공간을 가리키고 있다.
깊은 복사
- 별도의 힙 공간에 객체를 복사한 것.
- 보통은 별도로 프로그래머가 구현한다.
this() 생성자
- 생성자를 오버 로딩하여 구현할 때, this()를 사용하여 코드의 중복을 피할 수 있다.
class MyClass
{
int a, b, c;
public MyClass()
{
this.a = 1234;
Console.WriteLine("A");
}
public MyClass(int b) : this()
{
this.b = b;
Console.WriteLine("B");
}
public MyClass(int b, int c) : this(b)
{
this.c = b;
Console.WriteLine("C");
}
}
- 중요한 것은 A, B, C의 호출 순서이다.
- 마지막의 MyClass(int b, int c)로 생성했을 경우 로그에는 A -> B -> C 순으로 출력됨!
접근 한정자
internal | 같은 어셈블리에 있는 코드에서만 public 으로 접근 가능. 다른 어셈블리에 있는 코드에서는 private와 같은 수준. |
protected internal | 같은 어셈블리에 있는 코드에서만 protected로 접근 가능. 다른 어셈블리에 있는 코드에서는 private와 같은 수준. |
private protected | 같은 어셈블리에 있는 클래스에서 상속받은 클래스 내부에서만 접근 가능. |
한정자
sealed | 클래스의 상속이 불가능하도록 함. |
형 변환 연산자
is | 객체가 해당 형식에 해당하는지 여부를 bool로 반환함 |
as | 형 변환을 함. 일반적인 형식 변환 연산자는 실패시 예외가 발생하지만 as는 실패시 참조값이 null이 됨. |
object a;
MyClass temp = a as MyCalss;
if(temp != null)
temp.SomeMethod();
확장 메서드
- 기존 클래스의 기능을 확장하는 기법
- static 메서드를 선언하고, 첫 번째 매개 변수를 this로 선언하며, 그 첫 번째 매개변수의 형식(클래스)이 확장됨.
public static class StClass
{
public static void Method(this MyClass a)
{
// MyClass 의 기능이 확장됨
}
}
public class MyClass
{
}
public class OtherClass()
{
void Start()
{
MyClass temp = new MyClass();
temp.Method(); // 확장 메소드인 'Method'가 원래 MyClass의 메소드인 것 처럼 사용 가능
}
}
클래스와 구조체 비교
- 구조체 또한 메서드를 가질 수 있기 때문에 많은 부분에서 클래스와 비슷하다.
- 구조체는 값 형식이기 때문에 스택에 할당되고, 블록이 끝나는 지점의 메모리에서 사라진다.
특징 | 클래스 | 구조체 |
키워드 | class | struct |
형식 | 참조 형식 | 값 형식 |
복사 | 얕은 복사(Shallow Copy) | 깊은 복사(Deep Copy) |
인스턴스 생성 | new 연산자와 생성자 필요 | 선언만으로도 생성 |
생성자 | 매개 변수 없는 생성자 선언 가능 | 매개 변수 없는 생성자 선언 불가능 |
상속 | 가능 | 모든 구조체는 System.Object 형식을 상속하는 System.ValueType으로부터 직접 상속받음 |
- 구조체는 값 형식이기 때문에 할당 연산자를 통해 모든 필드가 그대로 복사된다.
MyStruct a;
a.MyField1 = 1;
a.MyField2 = 2;
MyStruct b;
b = a; // 값으로 할당함
b.MyField1 = 3; // a의 값에는 영향을 주지 않는다.
클래스와 객체, 인스턴스
- 클래스(Class)는 객체를 만들기 위한 틀. 변수와 메소드를 가진다. (청사진)
- 객체(Object)는 클래스가 구현할 대상.
- 인스턴스(Instance)는 클래스가 구현화되어 메모리에 할당된 구체적인 실체.
'🌍 C# Study > C# 기초' 카테고리의 다른 글
C# 복습하기 8) 프로퍼티 (0) | 2021.04.10 |
---|---|
C# 복습하기 7) 인터페이스와 추상 클래스 (0) | 2021.04.10 |
C# 복습하기 5) 메소드 (0) | 2021.04.09 |
C# 복습하기 4) 코드의 흐름 제어 (역 for문, 역 반복문) (0) | 2021.04.09 |
C# 복습하기 3) 데이터 가공 (0) | 2021.04.09 |