[C++] 4.1 클래스 - 생성자

함수 오버로딩

Overload : 과적하다. 너무 많이 주다. 과부하가 걸리게 하다.
함수 오버로딩도 뜻풀이 상, 함수 과부화 가 된다.
근데 개념상 이 개념이 맞다.

  • 하나의 함수이름으로 여러 함수를 만드는 것이 함수 과부화, 즉 함수 오버로딩이다.

함수 오버로딩을 시도해보자.

#include <iostream>

void print(int x) { std::cout << "int : " << x << std::endl;}
void print(char x) { std::cout << "char : " << x << std::endl;}
void print(double x) { std::cout << "double : " << x << std::endl;}
int main(){
	int a = 1;
	char b = 'c';
	double c = 3.2f;

	print(a);
	print(b);
	print(c);

	return 0;
}


print()라는 함수를 여러번 만들어 여러번 각각 호출시켰는데, 생각한 값이 바로 나왔다.

  • C++에서는 적합한 인자가 있는 함수가 호출된다.
  • 인자의 타입이 일치하지 않는다면, 최대한 비슷한 타입의 인자가 있는 함수가 호출된다.
    • 변경된 타입변경될 타입
      intchar, unsigned char, short
      int, unsigned intunsigned short
      doublefloat
      intenum
    • 만약 저렇게 바꾸고, 비슷한 타입을 못찾는다면, ambiguous(모호하다)에러가 뜬다.

멤버함수 선언

클래스의 멤버변수를 이런식으로도 선언할 수 있다.

#include <iostream>

class Date{
	int year_;
	int month_;
	int day_;

public:
	void SetDate(int year, int month, int date);
	void AddDay(int inc);
	void AddMonth(int inc);
	void AddYear(int inc);

	// 해당 월의 총 일수를 구함
	int GetCurrentMonthTotalDays(int year, int month);

	void ShowDate();
};

void Date::SetDate(int year, int month, int date){
	...
}
void AddDay(int inc){
	...
}
...
int main(){
	Day day;
    ...
    day.ShowDate();
    ...
    return 0;
}

클래스 내에서 굳이 선언하지 않는 이유는?

  • 가독성을 위해서!

생성자(Constructor)

클래스를 생성할 때 여러 값들을 지정하거나, 설정할 수 있게 생성자라는 것을 만든다.

#include <iostream>

class Date {
  int year_;
  int month_;  // 1 부터 12 까지.
  int day_;    // 1 부터 31 까지.

 public:
  void SetDate(int year, int month, int date);
  void AddDay(int inc);
  void AddMonth(int inc);
  void AddYear(int inc);

  // 해당 월의 총 일 수를 구한다.
  int GetCurrentMonthTotalDays(int year, int month);

  void ShowDate();

  // 생성자
  Date(int year, int month, int day) {
    year_ = year;
    month_ = month;
    day_ = day;
  }
};

...

int main(){
	Date day(2022, 2, 17);
	day.ShowDate();
	
    ...

	return 0;

}
  • Date day로 생성자를 호출하는데,
    현재 우리가 Date()를 알맞게 건들여 놔서 설정 값에 맞게 클래스가 생성되었다.

Default 생성자

생성자를 만들지 않고 클래스를 불러오면, 그냥 아무일 없이 클래스가 만들어진다.
Default생성자는 그런 일을 방지하고자, 생성자에 인자하나 없이 기본값을 설정하게 하는 생성자이다.

class Date {
  int year_;
  int month_;  // 1 부터 12 까지.
  int day_;    // 1 부터 31 까지.

 public:
  void SetDate(int year, int month, int date);
  void AddDay(int inc);
  void AddMonth(int inc);
  void AddYear(int inc);

  // 해당 월의 총 일 수를 구한다.
  int GetCurrentMonthTotalDays(int year, int month);

  void ShowDate();

  // Default 생성자
  Date() {
    year_ = 2022;
    month_ = 02;
    day_ = 17;
  }
};

생성자 오버로딩

생성자를 여러개 생성할 수 있다. 그리고 다양한 생성자를 만들어 사용할 수 있다.
자바 공부할 땐 이거 자동으로 해주는 친구 있었는데..

class Date {
  int year_;
  int month_;  // 1 부터 12 까지.
  int day_;    // 1 부터 31 까지.

 public:
  void SetDate(int year, int month, int date);
  void AddDay(int inc);
  void AddMonth(int inc);
  void AddYear(int inc);

  // 해당 월의 총 일 수를 구한다.
  int GetCurrentMonthTotalDays(int year, int month);

  void ShowDate();

  // Default 생성자
  Date() {
    year_ = 2022;
    month_ = 02;
    day_ = 17;
  }
  
  // 생성자
  Date(int year, int month, int day) {
    year_ = year;
    month_ = month;
    day_ = day;
  }
};
  • 이렇게 함수 오버로딩 하듯, 생성자도 오버로딩 가능하다.

좋은 웹페이지 즐겨찾기