CH03 클래스와 객체

jiyoon·2024년 4월 17일
0

생성자

생성자의 특징

  1. 생성자의 목적은 객체가 생성될 때 객체가 필요한 초기화를 위함이다
    ex) 멤버 변수 값 초기화, 메모리 할당, 파일 열기, 네트워크 연결 등

  2. 생성자 이름은 반드시 클래스 이름과 동일

  3. 생성자는 리턴 타입 없음

  4. 객체 생성 시 오직 한 번만 자동으로 호출되고, 각 객체마다 생성자를 실행한다

  5. 생성자는 오버로딩 가능

  6. 생성자가 선언되어 있지 않으면, 컴파일러에 의해 매개 변수 없는 기본 생성자 자동으로 생성한다




생성자가 다른 생성자 호출 (위임 생성자)

다양한 생성자의 멤버 변수 초기화 방법




소멸자

소멸자의 특징

  1. 소멸자의 목적은 객체가 사라질 때 마무리 작업을 위함이다
    ex) 실행 도중 동적으로 할당 받은 메모리 해제, 파일 저장 및 닫기, 네트워크 닫기 등

  2. 소멸자 함수의 이름은 클래스 이름 앞에 ~를 붙인다
    ex) Circle::~Circle() {...}

  3. 소멸자는 리턴 타입 선언 불가

  4. 소멸자는 매개 변수 없는 함수로 중복 작성 불가능 하다 (오버로딩X)

  5. 소멸자가 선언되어 있지 않으면, 컴파일러에 의해 기본 소멸자 코드가 자동으로 생성되며, 아무것도 하지 않고 단순 리턴만 한다

  6. main()의 스택에 순서대로 객체가 생성되며, return 0;문이 실행되면 생성된 반대수으로 객체가 소멸된다.


지역 객체와 전역 객체의 생성과 소멸 과정

전역 객체 생성 -> main 함수 객체 생성 -> f() 함수 객체 생성 -> f() 함수 객체 소멸 -> main 함수 객체 소멸 -> 전역 객체 소멸




접근 지정자

  1. 생성자와 함수는 public
  2. 멤버 변수는 private
  3. 접근 지정의 중복 사용 가능
  4. 디폴트 접근 지정은 private



인라인 함수

배경 : 함수 호출에 따른 시간 오버헤드

작은 크기의 함수를 호출하면, 함수 실행 시간에 비해, 호출을 위해 소요되는 부가적인 시간 오버헤드가 상대적으로 크다.

인라인 함수 특징

  • inline 키워드로 선언된 함수
  • 목적 : C++ 프로그램의 실행 속도 향상 (why? c++에는 짧은 코드의 멤버 함수가 많음)
  • 장점 : 함수 호출에 따른 오버헤드가 없어져 프로그램의 실행 시간이 빨라진다.
  • 단점 : 인라인 함수 코드의 삽입으로 컴파일된 전체 코드 크기 증가
    • 통계적으로 최대 30% 증가 ➔ 짧은 코드의 함수를 인라인으로 선언
  • 인라인 함수에 대한 처리
    • 인라인 함수를 호출하는 곳에 인라인 함수 코드를 확장 삽입
    • 컴파일러에 의해 이루어짐


자동 인라인 함수

클래스 선언부에 구현된 멤버 함수
- inline으로 선언할 필요 없음
- 컴파일러에 의해 자동으로 인라인 처리
- 생성자를 포함, 모든 함수가 자동 인라인 함수 가능





바람직한 C++ 프로그램 작성법

헤더 파일과 cpp 파일 분리

목적 : 클래스 재사용

  • 클래스마다 분리하여 저장
  • 클래스 선언부 - 헤더 파일.h에 저장
  • 클래스 구현부 - cpp파일에 저장하고, 선언부 헤더 파일을 include해준다.
  • main() 등 전역 함수나 변수는 다른 cpp 파일에 분산 저장해준다.

헤더 파일의 중복 include 문제

-> 조건 컴파일로 해결




Open Challenge - 지수 표현 클래스 만들기

실수의 지수 표현을 클래스 Exp로 작성하라. 클래스 Exp를 Exp.h 헤더 파일과 Exp.cpp 파일로 분리하여 작성하라.

Exp.h 헤더 파일

#ifndef EXP_H
#define EXP_H

//선언부 : 컴파일러에게 선언하는 것.
// return 의 역할 : 함수를 부른 곳으로 돌아가는 것.
class Exp {
private:
	int base, exp;
public:
	Exp() { base = exp = 1; }               //inline 함수로 선언
	Exp(int a) { base = a; exp = 1; }
	Exp(int a, int b);
	int getBase() { return base; }
	int getExp() { return exp; }
	int getValue();
	bool equals(Exp b);
};
#endif

Exp.cpp

#include "Exp.h"
#include <math.h>                           //pow 함수 사용 위한 헤더파일.

Exp::Exp(int a, int b) {
	base = a;
	exp = b;
}

int Exp::getValue() { 
	return (int)pow(base, exp);              //pow : 거듭제곱 함수
}

bool Exp::equals(Exp b) {
	return getValue() == b.getValue();
}

main.cpp

#include <iostream>
using namespace std;

#include "Exp.h"

int main() {
    Exp a(3,2);  //3^2=9. 베이스 3, 지수 2
    Exp b(9);   //9^1=9. 베이스 9, 지수 1
    Exp c;      //1^1. 베이스 1, 지수 1

    cout << a.getValue() << ' ' << b.getValue() << ' ' << c.getValue() << endl;     //9 9 1
    cout << "a의 베이스 " << a.getBase() << ", 지수 " << a.getExp() << endl;        	//a의 베이스 3, 지수 2

    if(a.equals(b))
        cout << "same" << endl;
    else
        cout << "not same" << endl;
}
profile
주니어 개발자

0개의 댓글