1. 개요
생성자(Constructor)는 객체 지향 프로그래밍에서 객체가 생성될 때 초기화시켜주는 함수를 의미한다. 필요에 따라 객체 내 데이터에 특정한 값을 입력하기도 한다.C++과 자바 같은 언어에서는 클래스와 동일한 이름을 가진 함수가 생성자로서 기능한다. 그 외 파이썬이나 Objective-C같은 언어에서는 특정한 키워드가 따로 정의되어있다.
생성자는 자료형을 갖지 않는다.
void
조차 아니다. 생성자는 클래스와 이름이 동일해야한다. 가끔 생성자와 클래스의 이름을 다르게 설정하는 경우가 있는데 이럴 경우 단순하게 메서드가 되어 동작에 오류를 일으키거나 컴파일 에러가 난다.(...)
2. 예시
다음과 같은 C++ 코드가 있다고 가정하자.#!syntax cpp
class Game{
private:
string title; // 게임의 제목을 나타낸다
int price; // 게임의 가격을 나타낸다.
}
int main(){
Game Minecraft; // Minecraft라는 이름의 인스턴스가 생성
}
이 경우,
Minecraft
라는 이름의 인스턴스는 생성되기만 했을 뿐 게임의 제목과 가격은 값이 지정되지 않았다. 이런 경우에는 다음과 같은 방식으로 게임의 제목과 가격을 정해줄 수 있다.#!syntax cpp
class Game{
private:
string title; // 게임의 제목을 나타낸다
int price; // 게임의 가격을 나타낸다.
public:
void set_data(string s, int n); // 게임의 제목과 가격을 지정해 줄 함수이다.
}
void Game::set_data(string s, int n){
title = s;
price = n
}
int main(){
Game Minecraft; // Minecraft라는 이름의 인스턴스가 생성된다.
Minecraft.set_data("Minecraft", 30000); // 게임의 이름과 가격을 정해주기 위해 함수를 호출한다.
}
이와 같은 방식으로 인스턴스에다가 게임의 제목은
Minecraft
로, 가격은 30000으로 지정할 수 있다. 하지만 생성자를 사용하면 더 간편하게 지정이 가능하다.#!syntax cpp
class Game{
private:
string title; // 게임의 제목을 나타낸다
int price; // 게임의 가격을 나타낸다.
public:
Game(string s, int n); // 생성자이므로, 클래스와 동일한 이름을 가지며 자료형을 가지지 않는다.
}
Game::Game(string s, int n){
title = s;
price = n;
}
int main(){
Game Minecraft("Minecraft", 30000); // Minecraft라는 이름의 인스턴스가 생성되는 동시에 제목과 가격이 지정된다.
}
3. 오버로딩
자세한 내용은 오버로딩 문서 참고하십시오.4. 하스켈에서
하스켈에는 아래와 같이 두 가지 생성자가 있다.- 타입 생성자
- 값 생성자
타입 생성자는 타입을 만드는 함수이다. 예를 들어 아래 정의에서
Bool
은 타입 생성자이다.data Bool = False | True
타입 생성자는 타입을 변수로 받을 수도 있다. Maybe
타입은 타입 변수 a
를 인자로 받아 타입을 리턴한다.data Maybe a = Nothing | Just a
값 Just 42
의 타입은 Maybe Int
이다.한편
False
, True
, Nothing
은 값 생성자이다. 값 생성자도 Just
처럼 값을 인자로 받을 수 있다. 값 생성자 Just
를 아래와 같은 타입을 가진 함수로 볼 수 있다.Just :: a -> Maybe a