객체지향 프로그래밍에서는 코드로 표현할 때, 프로그램을 객체의 모임, 객체들의 상호작용으로 모델링하는 것이다.
이 때, 객체를 생성하기 위한 틀이 클래스라고 생각하면 된다.
많이 드는 비유를 여기서도 작성하자면 붕어빵의 틀과 그 틀로 만들어지는 붕어빵에 비유할 수 있다.
(이보다 적합한 비유가 생각나진 않는다.)
클래스는 붕어빵의 틀로써 어떤 종류의 객체를 만들지 틀을 정해놓는 것이다.
그리고 나중에 해당 객체를 만들고 싶을 때 그 클래스를 바탕으로 만드는 것이다.
class Person
{
내용
}
위와 같이 선언을 할 수 있다.
클래스의 내용은 멤버변수, 멤버함수로 채워지게 된다.
class Person
{
string name;
int weight;
int height;
public Person()
{
}
public void Walk()
{
}
}
위와 같이 변수와 함수들로 구성이 되는데, 함수같은 경우에, 일반함수도 있지만 반환형도 없고 함수이름이 클래스이름과 동일한 함수가 보일 것이다. 이는 생성자함수라고 한다.
클래스를 객체로 생성할 때, 반드시 호출되는 함수라고 할 수 있다.
이 생성자 함수에는 처음에 객체를 생성할 때, 어떤 동작을 하면 좋을지를 작성하면 된다.
class Person
{
string name;
public Person()
{
// "생성" 출력하기
}
public Person(string name) :this()
{
this.name = name;
}
}
위 코드를 보면 생성자함수도 오버로딩이 가능하다는 것을 알 수 있다.
매개변수가 없다면 기본 생성자가 호출되면 매개변수로 string을 넣는다면 두번째 생성자가 호출되는데,
이 때, this 키워드란 자기자신을 의미한다. 즉, 자기자신을 가리키는 포인터라고 생각하면 된다.
또한 () 옆에 : this() 는 자기자신의 기본생성자를 호출하라는 의미이다.
또한, : 오른쪽의 this() 부터 호출이 되기 때문에 기본생성자 후에 this.name=name; 코드가 실행된다.
그러면 main에서 어떻게 사용할지를 살펴보자.
static void Main(string[] args)
{
Person p = new Person();
Person p2 = new Person("sss");
}
new 키워드를 통해 객체를 생성할 수 있다. 클래스는 기본적으로 ref로 동작한다. 따라서 new는 동적으로 heap에 메모리를 할당하고 변수 p,p2는 그 주소를 저장하고 있다고 보면 된다.
p는 기본생성자를 호출해서 객체를 생성했고, p2는 두번째 생성자를 호출해서 객체를 생성한다.
이러한 클래스는 다른 함수의 매개변수로 넘겨줄 때도 자동으로 ref로 동작하게 된다.