본문 바로가기
[ Program ]/c#스터디

34.클래스(생성자,소멸자)

by 관이119 2021. 10. 9.

앞에서 은근히 계속 이야기하던 클래스라는것에 대해서 배워보자.

클래스는 쉽게 말하면 함수들을 모아놓은것이다.

앞에 그림에서도 이야기했지만   네임스페이스 ᑐ 클래스 ᑐ 함수 로 생각하면 된다.

 

함수에 비해서 클래스는 범위도 넓고 더 많은 내용을 가질수 있다.

뿐만아니라 아예 파일을 분리하는것도 가능하다.

그리고 클래스는 앞에서 말하던 하나의 객체로 만들수 있다.

 

기본적인 클래스의 형태는 대체로 다음과 같다.

참고로 메서드 = 함수 이다.

class 클래스명

{

       필드

       메서드()

       {

       }

}

 

위에서 필드라고 했는데 필드 = 변수 라고 생각하면된다.

필드가 없을수도 있고 메서드가 없을수도 있다.

심지어 둘다 아무것도 없이 만들수도 있다.(당연히 아무의미 없겠지만)

 

클래스는 객체로 만들수 있는데 객체로 만들때는 new 키워드를 사용한다.

<예제>

public class mytestclass

{

}

public class testclass

{

      mytestclass mtcs = new mytestclass();

}

 

위 예제에서 두개의 클래스를 만들었다.

mytestclass 라고 위에 임의의 클래스를 만들고 사용할때는 실제 내가 작성하고 있는 클래스에서 new 를 사용하여 mytestclass mtcs = new mytestclass(); 이런식으로 만들어서 쓰면 된다.

mytestclass 는 이전에 int 나 double 처럼 형식을 나타낸다.

mtcs 는 일반적으로 사용하던 변수명이고 =new 는 새로운클래스 객체를 만들겠다는 의미이고 마지막 mytestclass() 는 생성자이다. 생성자는 잠시뒤에 설명하겠다.

복잡해졌다.

 

 

mytestclass mtcs = new mytestclass();

int mtcs = 10;

 

위두문장에서 위와 아래가 같은 형태라고 생각하면 된다.

타입 변수명 = 값;

 

다만 클래스는 만들어줄때 타입에 클래스의 이름을 적어줘야하고 new 를 써줘야하며 클래스명() 으로 되있는 생성자를 사용해야 한다는것만 다르다.

어려우면 그냥 통채로 외워도 된다.

 

클래스의 객체를 만들때는 아래와 같이만든다.

 

클래스명 변수명 = new 클래스명();

 

이렇게 외워도 된다.

위에서 생성자라고 했는데 생성자는 클래스가 무조건 가지고 있는 기본함수이다.

<예제1>

public class testclass

{

}

 

<예제2>

public class testclass

{

      public testclass()

      {

      }

}

내가 만약 예제1과 같은 클래스를 만들었다면 자동으로 예제2와 같은 코드로 컴파일러가 변환한다.

저 testclass() 라는 함수는 특수한 함수 인데 클래스를 만들면 생성하지않아도 자동으로 만들어지고( 예제2처럼 보이게 직접만들어줘도 된다. 단,클래스명과 동일해야한다.) 반환값이 없다는 특징이 있다.

생성자는 클래스가 객체화될때 (new 로 만들때) 어떤행동을 할지 기본적으로 정의해주는 역할을 한다.

 

<예제3>

public class testclass

{

      int n = 0;

      public testclass()

      {

            n = 50;

      }

}

 

내가 예제3과 같은 클래스를 만들어서 testclass tc = new testclass(); 라고 객체(인스턴스) 를 만들었다면 저 클래스의 객체에 n 이라는 값은 무조건 50을 가진상태로 시작된다.

잘이해가 안갈텐데 우리가 비행기 게임을 만든다고 생각해보자.

전군비행기는 어차피 다 똑같이 생겼으니 다음과 같이 하나의 클래스로 만들었다.

public class badairplane

{

      int startx;

      int starty;

      

      public badairplane()

      {

           starty = 0;

      }

}

그리고 적군비행기 시작위치를 지정해줘야 하는데 대부분 위에서 출현하니 생성자에서 starty 로 만들어주면 badairplane ba = new badairplane(); 처럼 만들어주면 적군비행기의 시작위치는 무조건 위쪽부터 시작할것이다.

이런형태로 활용할수 있다.

 

다시 위로 올라가서 확인해보자.

mytestclass mtcs = new mytestclass();

이경우 mytestclass 클래스형태 의 변수를 만드는데 변수명은 mtcs 이고 new 로 mytestclass 의 생성자를 호출하여 새로운객체를 만들것이다 라고 해석할수 있다.

 

그리고 생성자는 일단은 무조건 public 으로 만들어야된다고 알아두자.

위와같이 new 로 새로운객체를 만들려면 생성자가 public 이어야 외부에서 접근가능한데 가끔 private 로 생성자를 만들어 객체를 만들수 없게 만드는경우도 있긴하다.

이경우는 특수한경우이기때문에 나중에 다시 살펴보고 일단은 생성자는 무조건 public 이어야 한다고 알아두자.

 

 

전체적으로 다시 정리하면 다음과같다.

생성자는 클래스명과 같은 함수인데 반환값은 없고 클래스내에 자동으로 생성된다. 직접만들수도있다.

그리고 형식은  public 클래스명() 이다.

 

클래스가 만들어질때 실행되는 생성자와 반대로 클래스가 소멸할때 실행되는 소멸자라는것도 있다.

public class badairplane

{

      int startx;

      int starty;

      

      public badairplane()

      {

           starty = 0;

      }

      

      ~badairplane()

      {

      }

}

 

위 예제에서 ~badairplane() 라고 해놨는데 생성자와 비슷한형태로 앞에 ~ 을 붙이면 된다.

클래스가 소멸될때 호출되는데 이게 좀 애매하다.

위 예제로 생각하면 적군비행기가 폭파될때 소멸자를 쓰면 되지않을까 생각할수도 있는데 사실 그런경우 따로 폭파되는 함수를 만들어서 쓰지 소멸자를 쓰거나 하진않는다.

결론적으로 소멸자를 쓸경우는 프로그램하면서 없지않을까 생각이든다.

이런거도 있구나 알고넘어가는 정도로만 하자.

아래 경로도 한번읽어보자 (내용을 이해못하면 못하는대로 넘어가도 된다.)

 

edykim.com/ko/post/c-sharp-class-destructor-tilde/

 

C# 클래스 소멸자 ~ (물결 문자)

C#을 쓸 일이 종종 있는데 아직 초보 수준이라서 모르는 문법이 많다. 코드를 읽다가 메서드 선언 앞에 나온 물결 문자를 보게 되었는데 관련된 내용을 찾아봤다. 다음 내용은 함수명 앞에 오는

edykim.com

 

 

***숙제 : 임의로 클래스를 만들고 거기 어울리는 함수들도 만들어보자. 각함수는 어떤 행동을 하는지 주석으로 설명도달아보자.(함수구현은 하지말고 형태만 만들것) - 아래 예제 참고  , 3개 만들어볼것

 

public class badairplane

{

      //적군비행기 시작위치

      int starty;

      

      //생성자에서 적군 비행위치를 맨위로 만든다.

      public badairplane()

      {

           starty = 0;

      }

      

      //총알발사

      public void shoot()

      {

      }

      

      //폭발하면서 죽음

      public void boom()

      {

      }

 

      //도망감

      public void run()

      {

      }

}

댓글