C#/C# 강좌

C# 클래스와 객체 생성 방법 | C# Classes and Objects

DragonTory 2023. 3. 4. 22:52
반응형

C# 클래스 및 객체를 생성 방법 | 초보자를 위한 C# 자습서
 

C#에서 클래스(class)는 개체(object)를 만들기 위한 설계도 또는 템플릿이고 개체(object)는 클래스의 인스턴스입니다. 

C#의 클래스는 생성될 개체의 속성과 동작을 정의합니다.

영어로 Instance 는 사례, 경우란 뜻으로 나와 있듯이 인스턴스(instance)는 클래스나 구조체 같은 것들이 실제 메모리 생성된 실체를 가르킵니다. 


 
클래스 멤버 (Class members)
 


클래스 멤버는 클래스 내에서 정의된 변수, 속성, 메서드, 이벤트 및 기타 요소들이 있습니다.

다음은 클래스 멤버의 몇 가지 예입니다.

 

1. 필드(Fields):

필드는 클래스 내에서 선언되고 데이터 값을 보유하는 변수입니다. 필드는 비공개(private) 또는 공개(public)일 수 있으며 다양한 데이터 유형을 가질 수 있습니다.

public class Person
{
    private string _name;
    public int Age;
}


2. 속성(Properties):

속성은 해당 필드에 대한 액세스를 제어하면서 필드 값을 읽거나 쓰는(얻기 또는 설정) 방법을 제공합니다.

기본적인 형태로 속성에는 get 또는 set 접근자가 있으며 데이터의 유효성을 검사하거나 변환하는 데 사용할 수 있습니다.

public class Person
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
}


 

3. 메서드(Methods):

메서드는 클래스 내에서 정의된 함수이며 일부 작업을 수행하기 위해 호출 될 수 있습니다. 

메서드는 매개변수와 반환값을 가질 수 있습니다.

public class Person
{
    public void SayHello()
    {
        Console.WriteLine("Hello!");
    }

    public void SayName(string name)
    {
        Console.WriteLine($"My name is {name}.");
    }
}


4. 생성자(Constructors):

생성자는 클래스의 개체를 만들고 초기화하는 데 사용되는 특수 메서드입니다. 

생성자는 개체를 초기화하는 데 사용되는 값을 매개 변수를 가질 수 있습니다.

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}



5. 이벤트(Events):

이벤트는 클래스 내에서 어떤 일이 발생할 때 이벤트 알림을 발생시키는 방법을 제공합니다.

이벤트는 일반적으로 대리자 유형으로 정의되며 이벤트 발생을 수신하기 위해 다른 개체에서 구독될 수 있습니다.

( 이벤트가 발생 하면 등록된 모든 구독자에게 알림을 보내는 것과 같은 역할을 합니다.)

public class Button
{
    public event EventHandler Click;

    protected virtual void OnClick()
    {
        Click?.Invoke(this, EventArgs.Empty);
    }
}


다음은 변수, 속성, 메서드 및 이벤트를 포함하는 C# 클래스의 예입니다.

using System;

public class Person
{
    // private field
    private string _name;

    // public property with get and set accessors
    public string Name
    {
        get { return _name; }
        set
        {
            if (string.IsNullOrEmpty(value))
            {
                throw new ArgumentException("Name cannot be empty.");
            }
            _name = value;
        }
    }

    // private field
    private int _age;

    // public property with get and set accessors
    public int Age
    {
        get { return _age; }
        set
        {
            if (value < 0 || value > 120)
            {
                throw new ArgumentException("Age must be between 0 and 120.");
            }
            _age = value;
        }
    }

    // public method
    public void SayHello()
    {
        Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old.");
    }

    // public event
    public event EventHandler AgeChanged;

    // private method to raise the AgeChanged event
    private void OnAgeChanged()
    {
        AgeChanged?.Invoke(this, EventArgs.Empty);
    }
}

이 예에서 Person 클래스에는 2개의 private 필드 _name 및 _age와 get 및 set 접근자가 있는 2개의 public 속성 Name 및 Age가 있습니다. 속성은 private 필드를 설정하기 전에 입력 값에 대해 일부 유효성 검사를 수행합니다.

이 클래스에는 Name 및 Age 속성 값을 사용하여 콘솔에 메시지를 쓰는 public 메서드 SayHello()도 있습니다.

또한 이 클래스에는 event 키워드 및 EventHandler 대리자 유형을 사용하여 선언된 public 이벤트 AgeChanged가 있습니다. AgeChanged 이벤트는 this 키워드와 EventArgs.Empty 개체를 인자로 받는 이벤트를 호출하는 private 메서드 OnAgeChanged()에 의해 발생합니다.

이 예제는 클래스에서 변수, 속성, 메서드 및 이벤트를 사용하여 캡슐화된 데이터 및 동작이 있는 간단한 클래스를 만드는 방법을 보여줍니다.
  

액세스 한정자 ( Access Modifiers)

 

액세스 한정자는 필드, 속성, 메서드, 생성자 및 중첩된 타입과 같은 클래스 멤버의 노출 및 접근 가능성을 제어합니다.

다음은 C#에서 사용할 수 있는 액세스 한정자입니다.

1. public:

public 한정자는 다른 어셈블리를 포함하여 코드의 모든 위치에서 멤버에 액세스할 수 있도록 합니다.

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

  
2. private: 

private 수정자는 멤버를 정의하는 클래스 내에서만 액세스할 수 있는 멤버를 만듭니다. 이는 클래스 멤버에 대한 기본 액세스 한정자입니다.

public class Person
{
    private string _secret;

    public void DoSomething()
    {
        _secret = "This is a secret.";
    }
}

  
3. protected:

protected 한정자는 멤버를 정의하는 클래스 내부와 파생 클래스에서만 이 멤버에 액세스할 수 있도록 합니다.

파생된 클래스가 아니면 이 멤버는 노출 되지 않습니다.

public class Animal
{
    protected string _name;

    public Animal(string name)
    {
        _name = name;
    }
}

public class Cat : Animal
{
    public Cat(string name) : base(name)
    {
        // _name is accessible from derived class
        Console.WriteLine($"My name is {_name}.");
    }
}

  
4. internal:

internal 한정자는 동일한 어셈블리 내에서만 멤버에 액세스할 수 있도록 합니다.

internal class MyClass
{
    // internal class
}

public class MyPublicClass
{
    internal MyClass MyInternalClass { get; set; }
}

  
클래스 생성(Creating a Class)

 

C#에서 클래스를 만들려면 class 키워드와 클래스 이름으로 구성하여 사용합니다.

다음은 간단한 클래스 정의의 예입니다.

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}


이것은 Name과 Age라는 두 가지 속성을 가진 Person이라는 클래스를 정의합니다.

public 액세스 한정자는 클래스 외부에서 이러한 속성에 액세스할 수 있도록 합니다.

개체 만들기(Creating an Object)

 

클래스의 개체를 만들려면 new 키워드 다음에 클래스 이름 및 클래스 생성자 매개변수가 있다면 필요한 인수를 사용합니다. 

다음은 Person 개체를 만드는 예입니다.

Person person = new Person();
person.Name = "John";
person.Age = 30;

이렇게 하면 새 Person 개체가 생성되고 해당 Name 및 Age 속성이 설정됩니다.

 

생성자(Constructors)

 

생성자는 객체가 생성될 때 호출되는 특수 메서드입니다. 개체의 속성을 초기화하고 기타 필요한 설정을 수행하는 데 사용됩니다.

다음은 생성자가 있는 Person 클래스의 예입니다.

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

이것은 이름과 나이 매개변수를 취하는 생성자로 Person 클래스를 정의합니다. 생성자는 전달된 값을 사용하여 객체의 Name 및 Age 속성을 설정합니다.

 

소멸자(Distructors)


소멸자는 개체가 소멸될 때, 일반적으로 개체가 범위를 벗어나거나 Dispose() 메서드를 사용하여 명시적으로 소멸될 때 호출되는 특수 메서드입니다. 

소멸자는 클래스와 이름이 같지만 앞에 ~가 붙습니다.

다음은 소멸자의 예입니다.

public class MyClass
{
    public MyClass()
    {
        // constructor
    }

    ~MyClass()
    {
        // destructor
    }
}

소멸자는 개체가 더 이상 필요하지 않을 때 가비지 수집기(garbage collector, GC)에 의해 자동으로 호출됩니다. 소멸자의 목적은 개체가 소멸되기 전에 필요한 정리 또는 메모리에 할당된 리소스를 해제 하는 코드를 수행하는 것입니다.

예를 들어 개체가 파일 핸들, 네트워크 연결 또는 데이터베이스 연결과 같은 관리되지 않는 리소스를 보유하는 경우 소멸자는 이러한 리소스를 해제하여 메모리 누수 또는 기타 문제를 방지할 수 있습니다.

소멸자는 코드에서 직접 호출할 수 없으며 매개 변수나 액세스 한정자로 오버로드할 수 없습니다.

또한 C#에서는 가비지 수집기가 대부분의 개체에 대한 메모리 및 리소스 정리를 자동으로 관리하기 때문에 일반적으로 소멸자를 사용하지 않는 것이 좋습니다.

대신 Dispose() 메서드와 using 문을 사용하여 관리되지 않는 리소스를 명시적으로 해제하고 일회용 개체의 수명 주기를 관리하는 것이 좋습니다.

메서드(Methods)


메서드는 개체에서 호출할 수 있는 함수입니다. 이들은 클래스 내에서 정의되며 개체의 속성에 액세스할 수 있습니다.

다음은 메서드가 있는 Person 클래스의 예입니다.

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    
    public void SayHello()
    {
        Console.WriteLine($"Hello, my name is {Name} and I am {Age} years old.");
    }
}

이는 개체의 Name 및 Age 속성을 사용하여 인사말을 출력하는 SayHello() 메서드를 정의합니다.

다음과 같이 Person 개체에서 이 메서드를 호출할 수 있습니다.

Person person = new Person("John", 30);
person.SayHello();

그러면 다음이 출력됩니다.

안녕하세요, 제 이름은 John이고 30살입니다. ^^
 

지금까지 C# 클래스의 기본 개념에 대해 알아 봤습니다. 

반응형