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

35.클래스(생성자오버로딩)

by 관이119 2021. 10. 9.

생성자는 오버로딩도 가능하다.

글자만 보면 무슨말이지 할수도 있다. 

둘다 앞에서 각각 배운개념이다.

 

다시 우리가 계속 사용하던 MessageBox 를 살펴보자.

그림1

 

그림1을 보면 이제 이해가 좀 될것이다.

MessageBox 라는 클래스 였던것이다.

이클래스는 닷넷프레임워크 내에 미리 만들어져있다.

그리고 Show 함수는 앞에도 이야기 했지만 여러형태로 사용할 수 있게 오버로딩이 되어있다.

 

그림2

 

MessageBox 에서 마우스 우클릭하면 위와 같이 나오는데 정의로 이동을 눌러보자.

모든클래스에서(내가 직접만든 클래스도) 우클릭으로 정의로 이동하여 찾아갈수 있다.

 

 

그림3

 

정의로 이동해서 옴겨가면 그림3과 같은 화면이 나온다.

왼쪽에 + 누르면 펼쳐지는데 한번씩 열어서 읽어보자.

제일위에 어셈블리는 실제 물리적인 파일을 의미한다.

주석으로 되어있는 경로를 따라가면 실제 물리적인 파일이 있을것이다.

그파일내에 위 클래스가 들어있다.

그리고 아래 네임스페이스명을 System.Windows.Forms 라고 해놨다.

그리고 아래 MessageBox 라고 클래스가 보인다.

그런데 생성자는 없다. private 으로 생성자를 숨겨둔경우다.

아래 보면 우리가 자주쓰는 Show 함수가 오버로딩되어있고 반환값은 DialogResult 이며 public 이라서 외부에서 호출할수 있게 해놓은것을 알수 있다.

static 은 객체를 만들지않고도 사용할수 있게 한다는 의미인데 메모리에 바로 올려버린다. 나중에 다시 살펴보자.

 

클래스를 좀 배우고 내용을 보니 이해가 잘될것이다.

위show 함수처럼 생성자도 오버로딩이 가능하다.

이전장에서 예제로 쓰던 클래스를 다시 보자.

public class badairplane

{

      int startx;

      int starty;

      

      public badairplane()

      {

           starty = 0;

      }

}

위와 같이 적군비행기를 만들었는데 그건 옛날 갤러그 시절에나 무조건 위에서 비행기가 내려왔지 요즘 비행기 게임은 밑에서도 올라오고 옆에서도 나온다.

그래서 저렇게 만들면 안될거같다.

그래서 아래와 같이 코드를 바꿨다.

 

public class badairplane

{

      private int _startx = 0;

      private int _starty = 0;

      

      public badairplane(int var_x, int var_y)

      {

           _startx = var_x;

           _starty = var_y;

      }

}

 

소스가 갑자기 많이 바꼈는데 private 는 외부에서 접근하지못하게 하기 위함이다.

보통 필드는 private 으로 외부에서 접근하지 못하게 하고 클래스내부에서 필드를 컨트롤하는게 일반적이다.

그리고 _ 를 변수명앞에 붙여 줬는데 솔직히 나도 어디서 배웠는지 기억이 나지않는다.

그런데 필드를 _ 무조건 붙이라고 배워서 사용하다보니 구분하기가 편해서 나는 무조건 필드는 _를 붙여준다.

그리고 필드를 무조건 초기화 해주는 편이다. 위예제에서 private int _startx; 처럼 변수 생성만 할수도 있지만 이런경우 다른곳에서 _startx 에 값을 넣어주지않은상태에서 사용하게 되버리면 에러가 난다.

그래서 필드의 기본값은 넣어주는게 좋다고 생각한다.

 

이제 적군비행기 객체를 생성하면서 적군비행기의 초기 좌표를 넣어줄수 있게 되었다.

badairplane ba = new badairplane(800,300);

위와 같이 코딩하면 위에서 오버로딩한 badairplane 생성자의 var_x 에 800이 들어가고 var_y 에 300이 들어가서 필드는  800 과 300의 값이 각각 세팅된다.

코드가 저렇게 되있지만 실제로 기본생성자는 무조건 존재한다.

 

public class badairplane

{

      private int _startx = 0;

      private int _starty = 0;

      

      public badairplane()

      {

      }

 

      public badairplane(int var_x, int var_y)

      {

           _startx = var_x;

           _starty = var_y;

      }

}

 

즉 실제로 위와 같은 코드로 만들진다.

저기서 보면 적군 비행기는 무조건 시작좌표가 있어야 되니 기본생성자는 필요없을수 있다.

 

public class badairplane

{

      private int _startx = 0;

      private int _starty = 0;

      

      private badairplane()

      {

      }

 

      public badairplane(int var_x, int var_y)

      {

           _startx = var_x;

           _starty = var_y;

      }

}

 

그런경우 위처럼 코드를 바꿔주면 객체를 생성할때 무조건 좌표를 넣어야 만들수 있게 된다.

즉 위코드의 경우

badairplane ba = new badairplane(); 로 객체를 만들수 없고

badairplane ba = new badairplane(800,300); 이런 형태로만 가능하다.

 

또는 아래클래스처럼 만들수도 있다.

public class badairplane

{

      private int _startx = 0;

      private int _starty = 0;

      

      public badairplane()

      {

            _startx = 500;

            _starty = 0;

      }

 

      public badairplane(int var_x, int var_y)

      {

           _startx = var_x;

           _starty = var_y;

      }

}

기본생성자에서 는 적군비행기 좌표를 위쪽 가운데쯤 에서 시작하게 만들고 오버로딩된 생성자에서는 좌표를 받을 수 있게 만든것이다.

클래스를 만들때 이렇게 사용할사람(나 또는 그누군가) 이 어떤행위를 원할까 생각해서 만드는편이 좋다.

 

 

***숙제 : 임의로 클래스를 만들고 거기 어울리는 함수들도 만들어보자. 각함수는 어떤 행동을 하는지 주석으로 설명도달아보자.(함수구현은 하지말고 형태만 만들것, 34강숙제와 같음, 한번더 새로운걸로 해볼것)   , 3개 만들어볼것

'[ Program ] > c#스터디' 카테고리의 다른 글

37.DateTime,static  (0) 2021.10.09
36.클래스(전역변수/지역변수), 실제사용법  (0) 2021.10.09
34.클래스(생성자,소멸자)  (0) 2021.10.09
33.갑자기실습  (0) 2021.10.09
32.인텔리센스/오버로딩  (0) 2021.10.09

댓글