본문으로 바로가기

C# 클래스(Class) 생성자, 정적, 인스턴스 메인사진

 

안녕하세요. 애드라이프입니다.

이전 포스팅에서 객체지향 언어와 클래스의

기본적인 부분에 대해서 알아봤습니다.

 

이번 포스팅에서는 클래스 2번째 편으로

생성자, 정적(static), 인스턴스 필드 메서드에

대해서 알아보도록 하겠습니다.

 

이전 포스팅이 궁금하신 분들은 아래 링크 참고해주세요.

[C# 프로그래밍/기초 다지기] - C# 프로그램 시작하기 - 드디어 클래스(CLASS) #10

 

C# 프로그램 시작하기 - 드디어 클래스(CLASS) #10

안녕하세요. 애드라이프입니다. 오랜만에 C#으로 돌아왔습니다!! 이전 포스팅으로 기초를 더 다지고 싶으신 분들은 하단 링크 꼭 참고해주세요. [공지] C# 한 번에 모아보기 <-링크 [공지]C# 자료 한번에 모아보..

increase-life.tistory.com

 

자 가장 먼저 알아볼 내용은 생성자입니다.

 

생성자

 

생성자는 이전 포스팅에서 클래스의 인스턴스를

생성할 때 쓰였었는데 기억하시나요?

이전 포스팅 생성자부분 캡쳐

이런 식으로 언급했었습니다!!

 

생성자를 본격적으로 사용하려면

클래스의 구조를 좀 더 상세히 알아야 합니다.

 

class  클래스 이름                                         

{                                                                

한정자 클래스 이름(매개변수)

{                                        

}                                       

//필드(클래스 내부의 변수)   

//메서드                              

}                                                              

이전 포스팅에서 알려 드렸던 클래스의 기본구조에서

파란색 음영 부분이 추가되었습니다.

아는 만큼 구조도 바뀌는 법이니까요!!

알지도 못하는데 복잡하게 구조만 써놓으면

이해하기만 힘들기 때문에 알아갈 때마다

상세구조를 알려드리고 있습니다!!

 

여기서 한정자 클래스 이름(매개변수) 되어있는

부분이 바로 생성자에 해당합니다.

필드는 이번에 새롭게 추가되었지만

단순히 클래스 안에 있는 변수들을

필드라 부르기만 하지만 달라진 건 없습니다.

 

간단한 프로그램으로 위 구조를 파악해보겠습니다.

class car
{
  public car()	//생성자
  {
    car_color = "";
    persons = 0;
  }
  public car(string _car_color, int _persons)	//생성자 오버로딩
  {
    car_color = _car_color;
    persons = _persons;
  }
  
  public string car_color;    //자동차 색상을 나타내는 변수
  public int persons;         //자동차 인승을 나태내는 변수
}

 

위 구조를 프로그램으로 작성했습니다.

프로그램을 설명하기 전에 

우리가 생성자를 쓰는 이유는 무엇일까요?

보통 자신이 쓰려고 하는 필드의 값을 

원하는 부분에서 초기화할 때 사용합니다.

 

 

 

그래서 car() 생성자는 필드를 초기화하고 있습니다.

그럼 두 번째 public car(string _car_color, int _persons)

이것은 어떤 것일까요? 딱! 보니 생성자의 이름이 모두 Car로 똑같네요.

그리고 구조만 다르죠?

이거 어디서 많이 봤는데.....

 

바로 메서드 오버 로딩과 같은 맥락입니다.

클래스에서의 생성자도 오버 로딩이 가능합니다.

그래서 매개변수를 통해 입력받은 값으로 

필드를 초기화하는 생성자를 또 정의할 수 있게 되는 것입니다!

사용하는 방법은 아래와 같습니다.

 

car DreamCar = new car();// DreamCar라는 객체를 선언한다. 
DreamCar.car_color = "무지개"; //자동차의 색상을 정의합니다. 
DreamCar.persons = 2; //자동차의 인승을 정의합니다. 

car subDreamCar = new car("파란색".10); //car(string _car_color, int _persons)

생성자는 여기까지 하고 이제 

정적(static)과 인스턴스 필드, 메서드에

대해서 알아보겠습니다.

 

프로그램을 보다 보면 static이란

문구를 심심치 않게 접할 수 있습니다. 

 

C#에서 static을 한정자로 사용한 필드와

메서드는 클래스 자체에 소속됩니다.

 

우리는 클래스와 인스턴스의 차이를 이전 포스팅에서

배웠습니다. 클래스는 준비작업이고 실제 

인스턴스를 통해 실제 사용되게 됩니다.

 

그럼 static을 사용한 필드와 메소드는

클래스 자체에 소속된다고 했습니다.

클래스는 프로그램에서 같은 이름으로는

단 한 개밖에 존재하지 못하므로(인스턴스틑 여러 개 존재 가능)

클래스에 소속된다는 것은 딱 하나밖에 존재할 수 없다는 의미가 됩니다.

이런 특성을 이용해서 프로그램 전체적으로 활용해야 하는

필드와 메서드는 한정자를 static으로 지정합니다.

그러면 클래스의 인스턴스를 생성할 필요 없이

호출이 가능해지는 장점을 가지고 있습니다.

 

그렇다면 정적의 의미를 가지는 static과 반대인

인스턴스 필드와 메서드는 말 그대로 인스턴스를

생성해야만 호출이 가능한 것들이겠죠?

가볍게 딱 그때만 활용하기에는 이것도 나쁘지 않습니다.

 

간단하게 프로그램으로 어떤 식으로 활용하는지

알아보도록 하겠습니다.

using static System.Console;
namespace static_method
{
    class Global_field
    {
        public static int num = 0;  //정적 필드 정의
    }
    class field_class1
    {
        public field_class1()// 생성자
        {
            Global_field.num++;
        }
    }
    class field_class2
    {
        public field_class2()// 생성자
        {
            Global_field.num++;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine($"num:{Global_field.num}");   //최초 Global_field.num의 값
            new field_class1();
            new field_class2();
            new field_class1();
            new field_class2();
            new field_class1();
            WriteLine($"num:{Global_field.num}");   //다른 클래스의 생성자에 의해 수정된 후 Global_field.num의 값
        }
    }
}

 

정적(static) 필드에 접근하는 프로그램

예제로 들어 봤습니다.

 

물론 위와 같은 방식으로 정적 메서드로 구현이 가능합니다.

똑같이 클래스 안에 static을 한정자로 하는 메서드를

구현하고 호출 시에 인스턴스 생성 없이 바로 

클래스명. 메서드명; 이런식으로 가능합니다!!

 

여기까지 해서 클래스의 생성자와

정적 필드와 메서드, 인스턴스 필드와 메서드를

설명드렸습니다.

 

문의는 해당 포스팅 댓글로 남겨주시고

가급적이면 내용에 맞는 문의 부탁드립니다.

 

다음에는 더욱 유익한 포스팅으로 돌아오겠습니다.

by 애드라이프

 

구독과 공감버튼 눌러주세요!!