이론을 싫어!

[C#] 생성자와 소멸자 본문

C#

[C#] 생성자와 소멸자

이론을 싫어! 2023. 5. 2. 19:56
반응형

생성자 

 

 - 클래스 명과 동일 

 

- 리턴형이 없다. 

 

-접근 한정자 public 

 

-멤버 변수 초기화로 쓰임

 

- 객체 생성시 자동으로 처리하는 것들 

1
2
3
4
5
6
7
class ABC
{
  public ABC()
  {
  ...
  }
}
cs

소멸자 

 

- 클래스 명 동일

 

- 리턴형 없다.

 

- 접근 한정자 없다. 

 

- '~' 키워드로 구성된다.

1
2
3
4
5
6
7
8
9
10
11
class ABC
{
  public ABC()
  {
  ...
  }
  ~ABC()
 {
   ...
 }
}
cs

 

 

상세하게 설명을 위해서  예시를 보면 

 

예시코드 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
 
namespace Ex02
{
    internal class Program
    {
        static void Main(string[] args) //main
        {
            AA aa = new AA();
            AA aaa = new AA(10);
            AA aaaa = new AA(14053.2f);
        }
    }
}
class AA //클래스
{
   public int a; //필드
    float f; // 필드
 
    public AA() //기본생성자
    {
        a = 0;
        f = 0.0f;
        Console.WriteLine(" Calss Construcor ");
        Console.WriteLine(" a : " + a);
        Console.WriteLine(" f : {0}", f);
       
    }
    public AA(int a1) // 생성자1
    {
        a = a1;
 
        Console.WriteLine(" Calss Construcor ");
        Console.WriteLine(" a : " + a);
        Console.WriteLine(" f : {0}", f);
    }
    public AA(int a1, float f1) //생성자2
    {
        a = a1;
        f = f1;
        Console.WriteLine(" Calss Construcor ");
        Console.WriteLine(" a : " + a);
        Console.WriteLine(" f : {0}", f);
    }
 
   ~AA() //소멸자
    {
        Console.WriteLine(" Call Destructor ");
    }
 
}
cs

 

위의 코드를 좀 설명을 하자면 

 

AA라는 클래스가 있다 안에 필드는 a와 f가 선언되어져있고 

 

밑에 요번에는 메소드가 아닌 생성자가 있다. 

 

생성자의 특징을 위에서 보게 되면 클래스와 같은 이름을 가지고 있다는것이 특징이다. 

 

여기서 주석을 어떤것은 기본생성자 그리고 그냥 생성자가 있다. 

 

( ) 괄호안에 있는 것을 파라미터 라고 하는데 기본생성자는 파라미터가 없는 것을 기본생성자라고 한다. 

 

어 근데 여기서 이상한 점을 발견할수 있다. 똑같은 AA 생성자가 3개가 있다는것이다. 

 

생성자는 ( ) 의 파라미터만 다르면 된다. 

 

파라미터의 갯수나 자료형이 달라야한다. (변수명은 달라도 의미없음)

 

주석으로 생성자1 이라고 된 부분을 보면 ( ) 괄호 안 즉, 파라미터가 int a 가 있다. 

 

그리고 생성자2 라고 된 부분을 보면 ()괄호 안 즉, 파라미터가 int a , float f 가 있다. 

 

이렇게 갯수가 다른 상황에서는 생성자를 추가로 계속 생성이 가능하다. 

 

근데 여기서 우리가 한가지 주의해야될 점이 있다.

 

그것은 기본생성자이다. 

 

저 위의 코드에서 기본생성자를 지워버리면 9번 줄에 에러가 생긴다. 

 

이때까지 했을때는 아무런 문제가 없는데 왜그럴까??

 

우리가 생성자를 만들지 않으면 자동으로 컴퓨터가 기본생성자를 생성해준다. 

 

하지만.....

 

우리가 생성자를 하나라도 만드는 순간 기본 생성자는 안만들어준다. 

 

그래서 에러가 발생하는것이다.

 

결국 내가 생성자를 만들게 된다면 기본 생성자는 무조건 !!! 만들어줘야한다.

 

실행을 하게 되면 

 

 

실행 결과

 

 가 나오는것을 볼수 있다.

 

여기서 좀 당황했던것이 버전이 올라가면서 소멸자가 출력 되지 않는다는 것인데 

 

모든것이 끝나면 소멸자로 인해서 종료가 된다. 

 

조금더 설명을 하면 가비지 컬렉션이라는것인데 

 

메모리 상에 더이상 필요없는 객체 같은 것들을 자동으로 지워주는 역할을 한다.