1. 필드
- 클래스 레벨에서 정의되는 변수, 상수 등
2. 메소드
- 다양한 기능을 처리.
- 처리 결과를 반환하거나, 반환 없이 연산.
3. 프로퍼티
- 멤버 변수와 비슷하지만, 멤버 변수는 값을 설정할 때 Validation을 처리할 수 없다.
- 하지만 프로퍼티는 get/set을 통하여 입/출력 관리를 할 수 있으며 값 설정 전에 다양한 처리가 가능.
4. 생성자
- 클래스의 인스턴스를 생성하기 위해 여러 가지 초기화 작업을 수행하는 코드.
- 객체 생성시 반드시 호출 되는 특수 메소드.
5. 인덱서
- 배열과 비슷한 개념으로 클래스의 객체를 배열과 같은 형태로 정의해서 사용가능.
- 다양한 컬랙션, 객체 등에 사용된다.
6. 이벤트
- 버튼 클리고가 같은 컨트롤 혹은 다양한 클래스들의 이벤트를 정의하고 사용 가능.
7. 델리게이트
- 메소드가 처리해야 할 일을 위임 받아 처리하며 보통 이벤트와 함께 사용된다.
※ 접근 제한자
1) public
- 클래스 내/외부, 어셈블리, 네임스페이스 어디에서도 제한 없이 접근 가능.
2) private
- 클래스 내부에서만 접근 가능하며 외부에서는 접근 불가.
- 보통 외부에서 값을 변경하지 못하도록 보호하는 경우에 사용.
3) protected
- 클래스 내부 혹은 상속으로 이루어진 파생 클래스에서 접근 가능.
4) internal
- 동일 어셈블리에서는 public 과 같은 속성을 가지며, 다른 어셈블리에서는 호출을 할 수 없다.
5) protected internal
- protected 와 internal 의 속성을 모두 가지고 있는 것으로, 파생 클래스 혹은 동일 어셈블리 내에서 접근 가능.
※ 소멸자
- 소멸자는 가비지 컬렉터가 수행 직전 실행이 되는 특수한 메소드.
- .NET Framework에서는 기본적으로 가비지 컬렉터가 수집하는 시점을 임의로 조정할 수 없음므로
소멸자가 실행되는 시점 또한 통제를 할 수 없다.
- 소멸자와 더불어 C# 에서는 IDisposable 인터페이스 상속을 통하여 리소스를 정리하는 방법이 존재한다.
- 일반적으로 소멸자에서는 unmanaged 객체를, IDisposable 인터페이스에서는 managed 객체의 리소스 정리 코드를
작성하는 것이 일반적이다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SqlerCSharp
{
public class InitFinalizer : IDisposable
{
public InitFinalizer()
{
Console.WriteLine("생성자");
}
~InitFinalizer()
{
Console.WriteLine("소멸자");
}
public void Dispose()
{
Console.WriteLine("Dispose");
}
}
class Program
{
static void Main(string[] args)
{
InitFinalizer initTest = new InitFinalizer();
initTest.Dispose();
}
}
}
※ Sealed 클래스
- 모든 클래스가 상속이 필요한 것은 아니며, 정의된 클래스가 더 이상 상속이 필요하지 않으면 Sealed 클래스로 선언.
- Sealed 클래스로 선언을 하면 다른 클래스의 부모 클래스가 될 수 없으며, 더 이상 상속하지 않는다는 명시적 표현.
- Sealed 클래스로 선언을 하면 인스턴스 생성에 성능 향상을 가져올 수 있다.
※ Static 클래스
- 클래스의 인스턴스를 생성할 필요 없이 클래스의 멤버가 모두 정적(Static)인 요소로만 구성이 될 경우
Static 클래스로 선언이 가능하다.
- Static 클래스로 선언을 하면 인스턴스 생성이 불가하다.
※ Partial 클래스
- WinForm, WPF 같은 디자인 관련 코드와 비즈니스 관련 코드가 하나의 클래스에 존재할 경우 여러 명이 동시에 작업할 수 없다.
- 이러한 문제점을 Partial 클래스를 이용해 해결이 가능하다.
- Partial 클래스는 Partial 메소드를 선언할 수 있다.
단, Partial 메소드 선언에는 액세스 한정자 또는 virtual, abstract, override, new, sealed 나 extern 한정자 사용 불가.
// Class_01
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SqlerCSharp
{
public partial class PartialTest
{
public void PartialTest01Method()
{
Console.WriteLine("Method 01");
}
partial void PartialTestPartialMethod();
}
}
// class 02 & main()
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SqlerCSharp
{
public partial class PartialTest
{
public void PartialTest02Method()
{
Console.WriteLine("Method 02");
PartialTestPartialMethod();
}
partial void PartialTestPartialMethod()
{
Console.WriteLine("PartialMethod 구현");
}
}
class Program
{
static void Main(string[] args)
{
PartialTest test = new PartialTest();
test.PartialTest01Method();
test.PartialTest02Method();
}
}
}
※ Object Initializer
- C# 3.0 부터 Object Initializer 를 인스턴스 생성과 함게 필드 초기화를 할 수 있다.
- DB 처리를 ORM을 이용할 때 정의도니 클래스는 DB의 테이블 스키마가 되며,
생성된 인스턴스는 DB에 입력된 행이라 할 수 있다.
- 인스턴스 생성 시점에 값을 초기화하는 코드가 필요할 경우 코드의 가독성도 확보하며 간결해진다.
Test test = new Test
{
Name = "KIM"
Nick = "nick"
};
'Language > C#' 카테고리의 다른 글
[C#] ref / out / params (0) | 2020.12.26 |
---|---|
[C#] 프로퍼티(Property) / 인덱서(Indexer) (0) | 2020.12.26 |
[C#] 문자열 다루기 - StringBuilder (0) | 2020.12.23 |
[C#] 문자열 다루기 - string, 문자열 포맷 (0) | 2020.12.23 |
[C#] 배열 정렬 (0) | 2020.12.23 |