Language/C#

[C#] 클래스

마탁이 2020. 12. 26. 16:32

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();
        }
    }
}

 

<생성자, 소멸자 IDispose>


※ 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();
        }
    }
}

 

<Partial Class>

 


※ 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