함수 오버로딩 / 클래스와 생성자

김펭귄·2025년 5월 2일

C++

목록 보기
15/20

1. 함수 오버로딩

  • C++에서는 같은 이름의 함수를 여러 개 정의할 수 있다

  • 인자의 타입이나 개수에 따라 적합한 함수가 자동으로 선택됨

  • 오버로딩 규칙:

    1. 정확히 일치하는 타입의 함수가 있으면 선택
    2. 없으면 표준 타입 변환(char→int, float→double 등) 후 선택 (값이 잃지 않도록 더 넓은 범위로 승격)
    3. 여전히 없으면 더 포괄적인 변환(예: int→double 등) 시도 (값 손실 가능)
    4. 그래도 없거나 모호하면 컴파일 에러
  void print(int x);
  void print(double x);	// 이름은 다 같은 함수지만
  void print(char x);	// 인자의 종류가 다름
  void print(int x, char y);
  
  int main() {
  	int a = 3;
    double b = 2.5;
    char c = 7;
    
    print(a);    // int 버전 호출
    print(b);    // double 버전 호출
    print(c);    // char 버전 호출    
    print(a, c); // 마지막 print 호출
  }

2. 클래스(class)

  • 클래스는 struct와 마찬가지로 새로운 자료형(사용자 정의 타입)을 만드는 도구

  • 멤버 변수(데이터)와 멤버 함수(동작)를 묶어서 객체지향 프로그래밍의 기본 단위를 제공

  • 클래스 정의로부터 실제 데이터를 담는 객체(인스턴스)를 생성


3. 객체 생성과 생성자

  • 클래스를 기반으로 객체를 선언하면, 생성자(constructor)가 자동으로 호출되어 객체를 초기화

  • 생성자는 클래스 이름과 동일하며 반환형이 없다

  class Date {
  public:
      Date(int year, int month, int day) 	// 생성자는 꼭 public에 위치
      {    /* 객체 초기화 코드*/   }
  };
  
  int main() {
      Date day1(2025, 5, 12); // 생성자 호출, day1 객체 생성 (암시적)
      Date day2 = Date(2025, 5, 12); // 명시적 방법. 위와 완전 동일
  }
  • 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자(default constructor)를 생성
class Date {
public:
	// Date(int year, int month, int date) { ... } 이런 생성자가 없거나
	Date() = default; // 명시적으로 생성자를 default로 할 경우
};

int main() {
	Date day1;	// day1객체에는 쓰레기 값이 들어간다
}

4. 생성자 오버로딩

  • 생성자도 함수처럼 오버로딩(여러 개 정의)할 수 있다
  • 서로 다른 인자(개수, 타입)로 여러 방식의 객체 초기화 가능
  class Date {
  public:
      Date() { /* 정해진 기본값으로 초기화 */ }
      Date(int year, int month, int day) { /* 전달값으로 초기화 */ }
  };
  
  int main() {
  	Date d1;                 // 인자 없기에 기본 생성자 호출. d1은 기본값으로 초기화
  	Date d2(2025, 5, 12);    // d2는 전달값(2025, 5, 12)로 초기화됨
  }
  • 컴파일러는 객체 생성 시 넘긴 인자를 보고 알맞은 생성자를 자동으로 선택

5. 객체 생성 문법 주의점

  • Date d; 또는 Date d(2025,5,12);는 객체 생성(생성자 호출)

  • 인자 없이 객체를 생성할 때 Date d();로 할 경우, 객체가 아니라 반환형이 Date인 함수 d의 선언으로 해석된다


6. 클래스의 동적할당

  • 생성자를 정의하지 않았거나 인자 없는 생성자라면 Date* ptr = new Date;

  • 매개변수 있는 생성자의 경우Date* ptr = new Date(값,값,값);

  • delete ptr로 메모리 해제

profile
반갑습니다

0개의 댓글