생성자

1 minute read

생성자

constructor

객체가 생성되는 시점에 자동으로 호출되는 함수이다.

생성자의 이름은 클래스명과 동일하며 반환 타입을 명시하지 않는 특징이 있다.

using System;

namespace Bakcoding
{
    class Person
    {
        string name;
        int age;

        public Person()
        {
            Console.WriteLine("Constructor Call");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            Person person = new Person();
            
        }
    }
}

// 콘솔창을 켜놨다면
// Constructor Call 이 출력된다.

메인 함수에서 객체를 생성했기 때문에 생성자 안에서 출력한 문자가 콘솔창에 뜨는걸 확인할 수 있다.


기본 생성자

생성자의 제한자를 private로 해본다. 그러면 메인 함수에서 객체를 만드는 부분이 에러가 나는것을 확인할 수 있다.

생성자에 제한자를 둔거랑 객체를 만드는거랑 무슨상관인가 의문이든다. 하지만 잠시 코드를 바라보면 이유를 알 수 있다.

Person person = new Person();

new 연산자 뒤에 오는 별 생각없이 썼던 Person()이 지금보니 생성자와 똑같이 생겼다. 여기서 이 메서드가 바로 생성자라는걸 알 수 있다. 에러가 난 이유도 private로 선언을 하고 외부에서 접근하였기 때문이라는게 이해가 간다.

하지만 곧바로 다른 의문이 생긴다. 그렇다면 생성자를 따로 선언하지 않았을 때는 어떻게 객체가 문제없이 만들어진건가

그 답은 기본 생성자에 있다. C# 컴파일러는 클래스가 생성자 없이 인스턴스화 될 때 자동으로 매개 변수가 없는 생성자를 제공하는데 이게 기본 생성자(defalut constructor)이다.


초기화

생성자의 역할은 초기화에 있다. 기본적으로 외부에서 멤버변수에 대한 직접적인 접근은 코드의 안전성을 위해서 지향하는게 좋기 때문에 값을 초기화할 때 생성자를 사용하기도 한다.

생성자는 오버로딩(overload)이 가능하기 때문에 같은 이름으로 매개변수만 달리해서 다양한 생성자를 만들 수 있다.

따라서 이 생성자를 원하는 방식으로 만들고 외부에서 객체를 인스턴스화 할 때 인자값을 넣어 초기화한다.

using System;

namespace CSharp_Project
{
    class Person
    {
        string name;
        int age;

        public Person(string _name, int _age)
        {
            name = _name;
            age = _age;
            Console.WriteLine($"name : {name}\nage : {age}");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {

            Person person = new Person("bak", 50);
        }
    }
}

// 출력
// name : bak
// age : 50

생성자를 통해 멤버변수의 값을 초기화하고 출력하여 값의 확인까지 가능하다.