[9.8] 클래스에서의 인라인 함수를 정의하는 법
짧은 함수는 인라인함수로 정의하는 편이 좋습니다. 클래스에서 인라인 함수를 정의하는 방법은 인라인 함수의 정의 위치에 따라 다른 두 가지 방법을 사용합니다.
#인라인(inline) 함수 : 함수를 호출하는 방식이 아니라 직접 복사하는 방식으로 구동된다.
클래스 정의 내부(9.6에서 header부분)에서 구현되는 함수는 자동으로 인라인 함수(1)가 된다. 이를 인라인 정의(inline definition)이라고 한다. 클래스 구현파일(9.6에서 cpp파일)에서는 다른 방법(2)으로 인라인 함수를 정의해야 합니다.
inline double A::f2(){ //값 반환 }
[9.9] 데이터 필드 캡슐화
지금까지 변수를 public으로 정의했습니다. 이렇게 데이터 필드를 설정하면 데이터필드가 임의로 수정될 수 있다는 것(1)과 클래스의 유지보수가 어렵고 버그가 발생하기 쉽다(2)는 점에서 좋지 않습니다.
그래서 우리는 이제부터 속성에 대한 직접적인 수정이 불가능하도록 변수를 private으로 정의하는 법을 배울 것입니다. 이 방식에서는 public함수를 통해서만 변수에 접근할 수 있습니다.
//Circle.h
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle {
public:
Circle();
Circle(double);
double getArea();
double getRadius();
void setRadius(double);
private:
double radius;
};
#endif
//circle.cpp
#include <iostream>
#include "Circle.h"
using namespace std;
Circle::Circle() {
radius = 1;
}
Circle::Circle(double newRadius) {
radius = newRadius;
}
double Circle::getArea() {
return radius * radius * 3.14159;
}
double Circle::getRadius() {
return radius;
}
void Circle::setRadius(double newRadius) {
radius = (newRadius >= 0) ? newRadius : 0;
}
int main() {
Circle circle1;
Circle circle2(5.0);
cout << "The area of the circle of radius " << circle1.getRadius() <<
" is " << circle1.getArea() << endl;
cout << "The area of the circle of radius " << circle2.getRadius() <<
" is " << circle2.getArea() << endl;
circle2.setRadius(100); //원의 반지름 반경
cout << "The area of the circle of radius " << circle2.getRadius() <<
" is " << circle2.getArea() << endl;
return 0;
}
[CheckPoint]
9.15) 다음 코드에서 잘못된 부분은 무엇인가?(9.9의 코드를 사용한다.)
Circle c;
cout << c.radius <<endl;
:private으로 선언되어 있는 데이터필드를 직접 접근하려고 하기 때문에 동작하지 않는다.
Circle c;
cout << c.getRadius()<<endl;
로 수정해야 한다.
9.16) 접근자 함수란 무엇인가? 변경자 함수란 무엇인가? 이들 함수에 대한 이름 명명 규칙은 무엇인가?
일상적인 표현으로 get함수는 접근자(accessor)라 하고 set 함수는 변경자(mutator)이라고 한다.
get함수는 다음과 같은 형식을 사용한다.
returnType getPropertyName()
get함수를 bool형식으로 정의할 때는 관례상으로
bool isPropertyName()
set함수는 다음과 같은 형식을 사용한다.
vooid setPropertyName(dataType propertyValue)
9.17) 데이터필드 캡슐화의 장점은 무엇인가?
변수를 public으로 설정하는 것보다 유지보수가 쉽고 버그발생률이 낮다. 또, 데이터가 임의로 수정되지 않게 할 수 있다.
[9.10] 변수의 범위
데이터 필드는 변수로 선언되며 클래스 안에서 모든 생성자와 함수에 접근이 가능합니다. 클래스 데이터필드와 함수는 클래스 안에서 순서와 상관없이 작성이 가능합니다. 따라서 아래의 Circle1, Circle2, Circle3 는 모두 같은 것입니다.
class Circle1 { //관례상으로 이렇게 많이 씀
public:
Circle();
Circle(double);
double getArea();
double getRadius();
void setRadius(double);
private:
double radius;
};
class Circle2 {
public:
double getArea();
double getRadius();
void setRadius(double);
private:
double radius;
public:
Circle();
Circle(double);
};
class Circle3 {
private:
double radius;
public:
double getArea();
double getRadius();
void setRadius(double);
public:
Circle();
Circle(double);
};
클래스 데이터필드에 대한 변수는 한번만 선언 할 수 있지만 클래스 함수 안에서 선언한 변수 이름은 다른 함수에서 변수 선언을 할 때 사용할 수 있습니다. 만약 함수 안의 지역변수가 데이터필드와 이름이 같다면 지역 변수가 우선권을 가집니다. 아래의 예제를 보면 클래스 안의 지역변수인 x = 20이 출력된 것을 확인 할 수 있습니다. 함수 p() 안에서 데이터필드 y에 접근할 수 있습니다.
#include <iostream>
using namespace std;
class Foo {
public:
int x;
int y;
Foo() {
x = 10;
y = 10;
}
void p() {
int x = 20;
cout << "x is " << x << endl;
cout << "y is " << y << endl;
}
};
int main() {
Foo foo;
foo.p();
return 0;
}
[checkpoint]
9.18) 클래스 안에서 데이터 필드와 함수는 어떤 방식으로 배치될 수 있는가?
클래스 안에 있기만 하면 순서는 상관없다. 물론 문법은 맞추어 작성해야 한다.
'c, c++ > c++로 시작하는 객체지향 프로그래밍' 카테고리의 다른 글
11.1~11.5 (1) | 2024.04.04 |
---|---|
10.3~10.10 (2) | 2024.03.28 |
9.6~9.7) 헤더파일 분리 (1) | 2024.01.28 |
확인할 수 없는 외부 참조 오류 (0) | 2024.01.27 |
9.1~9.5) 클래스와 객체 생성 (0) | 2024.01.21 |