C#

4. 클래스(1) - 클래스란? , 생성자와 소멸자

루체도 2020. 1. 28. 21:56

객체 지향 프로그래밍(OOP)

코드 내의 모든 것을 객체(Object)로 표현하고자 하는 프로그래밍 패러다임.

객체는 세상의 모든 것을 지칭하는 단어.

객체는 속성과 기능을 가지고 있다. 코드로는 속성을 변수, 기능을 메소드로 표현을 한다.

객체 지향 프로그래밍에서 클래스는 객체를 만들기 위한 청사진이다.

 

클래스 선언과 인스턴스(객체) 생성

////Class의 기본 형태
class 클래스명
{


}

위와 같은 형태로 클래스를 하나 만들겠습니다.

class Cat
{
  public string Name;
  public string Color;
  
  public void Meow()
  {
    Console.WriteLine("{0} : 야옹", Name);
  }
}

클래스 안에 선언된 변수를 필드(Filed)라고 한다.

그리고 필드와 메소드를 비롯해 클래스 내부 요소들을 멤버(Member)라고 한다.

이제 이 클래스를 통해서 객체 즉 인스턴스를 만들겠습니다.

Cat cat1 = new Cat();
cat1.Color = "하얀색";
cat1.Name = "고양이1";
cat1.Meow();
Console.WriteLine("{0} : {1}", cat1.Name, cat1.Color);
Cat cat1 = new Cat();

new 키워드 뒤에 있는 Cat()을 생성자라고 한다.

생성자는 클래스의 이름과 동일한 이름을 가지고, 객체를 생성하는 역할을 한다.

new 키워드는 생성자를 호출해서 객체를 생성하는데 사용하는 연산자이다.

 

생성자

생성자는 클래스와 이름이 같으며 반환 형식이 없다.

생성자의 임무는 단 하나, 해당 클래스의 객체를 생성하는 것이다.

클래스를 만들 때 생성자를 명시적으로 작성하지 않아도 컴파일러가 기본생성자를 만들어준다.

그럼에도 생성자를 직접 작성하는 것은 매개변수를 받아 객체의 필드를 초기화 할 수도 있기 때문입니다.

class 클래스명
{
 한정자 클래스명(매개변수 목록)
 {
   //필드 초기화
 }
}
class Cat
{
  public string Name;
  public string Color;
  
  public Cat(string name, string color)
  {
    Name = name;
    Color = color;
  } 
  
  public void Meow()
  {
    Console.WriteLine("{0} : 야옹", Name);
  }
}

소멸자

소멸자는 클래스 이름 앞에 ~를 붙인 형태이다.

소멸자는 생성자와 달리 매개 변수도 없고, 한정자도 사용하지 않는다.

또한 오버로딩도 불가능하며 직접 호출할 수도 없다.

CLR의 가비지 컬렉터가 객체가 소멸되는 시점을 판단해서 소멸자를 호출해준다.

class 클래스명
{
  ~클래스이름()
  {
  
  }
}

C#에서 소멸자를 사용하는 것은 그다지 추천하지 않는다.

왜냐면 CLR의 가비지 컬렉터가 언제 동작할지 예측할 수 없다.

또한 명시적으로 소멸자를 구현하면 가비지 컬렉터가 object로부터 상속받은 Finalize() 메소드를 클래스의 족보를 타고

올라가며 호출하기 때문에 대개 응용 프로그램의 성능 저하만 가져올 확률이 높다.

CLR의 가비지 컬렉터가 우리보다 훨씬 똑똑하게 객체의 소멸을 처리할 수 있기 때문에 구현하지 않는 것이 좋다.