나만의 작은 도서관

[C#] 문법 정리 #4. 클래스 본문

Unity/문법 및 메소드(System)

[C#] 문법 정리 #4. 클래스

pledge24 2024. 11. 21. 01:27

클래스(Class)

클래스는 객체를 생성하기 위한 청사진(설계도)과 같다. 클래스에 속성과 동작을 정의하여 객체를 체계적으로 만들고 관리할 수 있다. C#에서는 클래스는 class라는 키워드를 통해 선언한다.

class Person
{
	// code...
}

 


클래스의 주요 구성 요소

1. 필드(Fields)

필드는 클래스에서 데이터를 저장하기 위한 변수이다. 객체의 특징이나 속성을 표현하며, 클래스의 멤버 변수로 선언된다.

class Person
{
    public string name;  // public 필드
    private int age;     // private 필드
}

 

접근 제한자(Access Modifier)

접근 제한자(Access Modifier)는 클래스, 필드, 메서드 등의 접근 가능한 범위를 지정하는 키워드이다. 접근 제한자는 범위를 지정함으로써 캡슐화(데이터와 메서드를 하나로 묶고, 외부에서 직접 접근하지 못하도록 보호하는 것을 의미) 역할을 한다. 대표적인 접근 제한자는 다음과 같다.

  • public: 외부에서 자유롭게 접근이 가능
  • private: 같은 클래스 내부에서만 접근 가능
  • protected: 같은 클래스 내부와 상속받은 클래스에서만 접근 가능

 

2. 메서드(Methods)

메서드는 클래스가 수행할 함수를 정의한다. 객체의 행동이나 동작을 구현하며, 클래스의 멤버 함수로 선언된다. 

class Person
{
    public void SayHello()
    {
        Console.WriteLine("안녕하세요!");
    }
}

 

3. 속성(Properties, 프로퍼티라고도 부름)

속성은 클래스 멤버로서, 객체의 필드 값을 읽거나 쓰는데 사용하는 접근자(Accessor) 메서드의 조합이다. 필드에 대한 접근을 제어하기 위해 사용하며, 객체의 필드에 직접 접근하지 않고, 간접적으로 값을 읽거나 쓰도록 한다.

 

속성은 get, set접근자를 사용하여 값을 읽고 쓰는 동작을 정의한다. get 접근자는 속성 값을 반환하며, set 접근자는 속성 값을 쓴다. 

[접근_제한자] [데이터_타입] 속성_이름
{
    get
    {
        // 필드를 반환
    }
    set
    {
        // 필드에 값을 설정
    }
}

 

필요 시 유효성 검사와 같은 로직을 get, set접근자 안에 추가하는 것도 가능하다.

class Person
{
    private string name;
    private int age;

    public string Name	// name 속성
    {
        get { return name; }
        private set { name = value; }
    }

    public int Age	// age 속성
    {
        get { return age; }
        set
        {
            if (value >= 0)
                age = value;
        }
    }
}

 

자동 속성(Auto Property)

C# 에서는 보다 간단한 속성 정의를 위해 자동 속성 기능을 제공한다. 필드의 선언과 접근자 메서드의 구현을 컴파일러가 자동으로 처리하여 개발자가 간단한 구문으로 프로퍼티를 정의할 수 있다.

[접근_제한자] [데이터_타입] 속성_이름 { get; set; } // 기본 구문
[접근_제한자] [데이터_타입] 속성_이름 { get; private set; } // 접근 제한자도 추가할 수 있다.

 

 

4. 생성자(Constructor)

생성자는 객체를 생성할 때 호출되며, 필드를 초기화하는 역할을 한다. 기본적으로 매개변수가 없는 디폴트 생성자가 자동으로 생성되지만, 별도로 정의한 생성자를 존재할 경우 디폴트 생성자는 생성되지 않는다.

 

생성자는 클래스 이름과 동일하며 반환 타입이 없다.

 

생성자 정의

class Person
{
    public string name;
    public int age;

    public Person(string name, int age)  // 생성자(Constructor)
    {
        this.name = name;
        this.age = age;
    }
}

 

생성자 호출

생성자는 객체를 생성할 때 new 키워드와 함께 호출된다.

Person person1 = new Person();                     // 디폴트(default) 생성자 호출
Person person2 = new Person("John", 25);           // 매개변수를 받는 생성자 호출

 

 

5. 소멸자(Destructor)

소멸자는 생성자와 반대되는 개념으로, 객체가 소멸되는 시점에서 자동으로 호출되는 특별한 메서드이다. 객체의 사용이 종료되어 메모리를 해제할 때 자동으로 호출되어 필요한 작업들을 수행한다. 

 

소멸자는 클래스 이름 앞에 ~를 붙인 이름으로 정의되며, 반환 타입과 매개변수를 가질 수 없다.

 

소멸자 정의

~Person()
{
    Console.WriteLine("Person 객체 소멸");
}

 

소멸자의 역할

  • 자원 해제: 파일 핸들, 네트워크 연결, 데이터베이스 연결 등의 외부 리소스를 사용한 경우, 소멸자를 통해 해당 리소스를 해제
  • 메모리 해제: 객체가 사용한 메모리를 해제하고 관련된 자원을 정리
  • 로깅 및 디버깅: 객체가 소멸되는 시점에 로깅 작업을 수행하거나 디버깅 정보를 기록

주의사항

C#은 가비지 컬렉터(Garbage Collector)가 존재하는 프로그래밍 언어이다. 가비지 컬렉터를 통해 자동으로 메모리 관리를 하기때문에 메모리 해제와 관련된 소멸자를 명시적으로 호출하는 행위는 하지 않는 것이 좋다.