#include <iostream>
using namespace std;
// 클래스 정의. 데이터 멤버와 멤버 함수를 선언
// class는 접근제한자를 안쓰면 private(struct: public-캡슐화)
class Circle
{
private:
double radius; // 멤버변수. mutable double radius;로 선언하면 멤버함수에 const 있어도 변경가능
public:
double getRadius() const; // 멤버함수
double getArea() const; // const: 멤버함수 안에서 멤버 변수의 변경이 이루어지지 않음
double getPerimeter() const;
void setRadius(double value);
};
// 멤버 함수 정의
double Circle::getRadius() const // :: 스코프 연산자
{
return radius;
}
double Circle::getArea() const
{
const double PI = 3.14;
return (PI * radius * radius);
}
double Circle::getPerimeter() const
{
const double PI = 3.14;
return (2 * PI * radius);
}
void Circle::setRadius(double value)
{
radius = value;
}
int main() //클래스를 인스턴스화해서 객체를 만들고 활용
{
// 첫 번째 circle 객체를 만들고 멤버 함수 호출
cout << "Circle 1" << endl;
Circle circle1;
circle1.setRadius(10.0);
cout << "반지름: " << circle1.getRadius() << endl;
cout << "넓이: " << circle1.getArea() << endl;
cout << "둘레: " << circle1.getPerimeter() << endl << endl;
// 두 번째 circle 객체를 만들고 멤버 함수 호출
cout << "Circle 2" << endl;
Circle circle2;
circle2.setRadius(20.0);
cout << "반지름: " << circle2.getRadius() << endl;
cout << "넓이: " << circle2.getArea() << endl;
cout << "둘레: " << circle2.getPerimeter();
return 0;
}
- 인라인 함수
double Circle::getRadius() const
{
return radius;
}
멤버함수의 본문이 매우 짧은 경우, 인라인으로 함수를 작성하면 메인함수를 실행할 때 함수를 불러오게 된다. 컴파일러가 함수 호출 부분을 실제 코드로 대체하여 프로그램의 성능을 높힐 수 있다.(컴파일러가 무시할 수도 있다.)
인라인을 사용하지 않을 경우, 함수를 실행하는 시간(매개변수 저장, 제어 이동, 매개변수 추출, 리턴값 저장 등)이 함수 내부의 코드를 실행하는 시간보다 오래 걸릴 수 있다.
class Circle
{
private:
double radius;
public:
double getRadius() const { // 인라인 멤버함수
return radius;
}
double getArea() const;
double getPerimeter() const;
void setRadius(double value);
};
클래스를 정의 내부에 함수를 정의하면 인라인 함수가 된다.
inline double Circle::getRadius() const
{
return radius;
}
앞에 멤버 함수 앞에 inline을 넣어서 인라인 함수로 만들 수도 있다.
- 생성자
객체를 만든 뒤 데이터 멤버를 초기화하는 멤버 함수. 객체는 생성자가 호출될 때 생성된다.
리턴값이 없으며, 클래스와 이름이 같다.
class Circle
{
private:
double radius;
public:
Circle(); // 기본생성자
Circle(double rds); // 매개변수 생성자
Circle(const Circle& ccopy); // 복사생성자
};
생성자는 기본 생성자, 매개변수 생성자, 복사 생성자가 있다.
매개변수 생성자나 복사생성자가 있다면 기본 생성자도 정의해주어야 한다(다 없는 것은 괜찮다).
기본 생성자의 정의
Circle::Circle() : radius(1.0) { // 초기화 리스트
}
Circle::Circle() {
radius = 1.0;
}
2가지 방법이 있다(같은 결과).
반지름의 값이 1.0으로 초기화된다. 초기화 리스트가 없다면 쓰레기 값이 들어간다.
매개변수 생성자의 정의
Circle::Circle(double rds) : radius(rds) {
}
Circle::Circle(double rds) {
radius = rds;
}
Circle::Circle(double radius) {
this->radius = radius;
}
3번 방법에서 radius는 생성자에서 매개변수이자 지역변수. 클래스에 선언된 멤버변수는 멤버변수.
지역변수와 멤버변수를 구분해야 하기 때문에 this를 사용해야 한다.
사용하지 않으면 지역변수에 값을 넣고, 나중에 객체 선언할 때 매개변수로 값을 또 넣어주면 멤버변수의 값은 바뀌지 않는다. 멤버변수가 차지하고 있던 메모리에 쓰레기 값이 그대로 덤프가 되어 나온다. (멤버변수의 값이 초기화가 되지 않아서)
매개변수 radius와 멤버변수 radius를 구분하기 위해 현재 실행 시점의 객체를 가리키는 포인터인 this를 사용해야 한다. (this는 현재 실행 시점의 객체 메모리 번지 주소 보유)
복사 생성자의 정의
Circle::Circle(const Circle& ccopy) : radius(ccopy.radius) {
}
복사 생성자 사용
int main()
{
Circle circle1(5.0);
circle1.setRadius(10.0);
Circle circle2;
circle2.setRadius(20.0);
Circle c3(circle2); // 복사 생성자
cout << c3.getRadius() << endl; //20.0
return 0;
}
복사 생성자는 다른 원을 가져와서 그것의 복사 형태를 만든다. 내가 가져온 반지름을 꺼내는 것.
매개변수로 클래스 타입의 객체(circle2)를 넣고 복사
c3의 반지름은 20.0
- 소멸자
class Circle
{
public:
Circle();
Circle(double rds);
Circle(const Circle& ccopy);
~Circle(); // 소멸자
};
객체가 소멸하는 시점에 동작한다. 위의 코드는 메인함수에서 Circle1, Circle2를 만들었으므로 메인함수 스택에서 생성된 객체이기 때문에 메인함수가 끝나는 시점에 소멸된다.
Circle::~Circle() {
cout << this <<" 객체 소멸!\n";
}
객체는 순서대로 생성되고, 생성된 것의 역순으로 소멸된다. Circle3 -> Circle2 -> Circle1
메인함수 밖에서 객체 생성
void inha() {
Circle c4; // 생성자4
return;
}
int main()
{
Circle circle1(5.0); // 생성자1
circle1.setRadius(10.0);
Circle circle2; // 생성자2
inha();
circle2.setRadius(20.0);
Circle c3(circle2); // 생성자3
return 0;
}
circle1의 매개변수 생성자 -> circle2의 기본 생성자 -> inha() 함수 c4의 기본생성자-> (inha 함수 종료) -> c4의 소멸자 -> c3의 복사생성자 -> (main함수 종료) -> c3 소멸자 -> circle2 소멸자 -> circle1 소멸자
c4는 메인 메모리 스택이 아니라 inha 함수에서 생성된 객체이기 때문에 inha 함수가 종료되면 메모리에서 언로드된다.
'언어 공부 > C++' 카테고리의 다른 글
메모리 관리 (0) | 2022.06.22 |
---|---|
포인터-2 (0) | 2022.06.22 |
포인터-1 (0) | 2022.06.22 |
reference(참조)-2 (0) | 2022.06.21 |
reference(참조)-1 (0) | 2022.06.21 |
댓글