클래스와 객체의 개념은 자바나 여타 객체 지향 언어와 개념이 같다
그래서 클래스나 객체에 대한 설명은 https://oz-97.tistory.com/8 해당 글을 참조
이 장에서는 C++에서의 클래스 특징들을 작성하려고 한다
C++의 클래스도 여타 객체 지향 언어와 마찬가지로 멤버 변수, 멤버 함수, 접근 지정자를 사용한다
구현
class Circle
{
public :
int radius; // 멤버 변수
Circle(); // 기본 생성자
Circle(int r); // 매개 변수가 있는 생성자
doouble getArea(); // 멤버 함수
};
Circle :: Circle()
{
radius = 1;
}
Circle :: Circle(int r)
{
radius = r;
}
double Circle :: getArea()
{
return 3.14 * radius * radius;
}
위처럼 Circle 클래스를 만들어 보았다
다른 언어와의 차이점이 있다면
클래스가 선언부와 구현부로 나뉜다는 점이다
1번 라인부터 6번 라인까지 선언부에는 멤버 변수와 생성자나 멤버 함수의 원형, 접근 지정자들이 들어가고
그 밑에 구현부에서는 선언부에 선언된 생성자나 멤버 함수가 정의된다
생성자
생성자를 작성하지 않으면 컴파일러는 default constructor (기본 생성자)를 자동으로 생성하고, 생성자가 하나라도 존재한다면 기본 생성자를 생성하지 않는다
Circle :: Circle()
{
radius = 1;
}
Circle :: Circle(int r)
{
radius = r;
}
위 처럼 생성자 코드가 겹치는 경우에는
Circle :: Circle() : Circle(1) {} // 위임 생성자
Circle :: Circle(int r) // 타겟 생성자
{
radius = r;
}
이렇게 코드를 줄일수도 있다
class Circle
{
radius = 3;
};
멤버 변수는 클래스 선언부 내에서 직접 초기화 될수도 있고
class Point
{
int x, y;
public :
Point();
Point(int a, int b);
}
Point :: Point() : x(0), y(0) {}
point :: Point(int a, int b) : x(a), y(b) {}
위와 같이 초기화할수도 있다
소멸자
소멸자는 객체가 사라질 때 필요한 마무리 작업이다
Circle :: ~Circle() {}
앞에 ~을 붙여 소멸자를 표시하고, 선언하지 않으면 컴파일러에 의해 기본 소멸자가 자동으로 생성된다
#include <iostream>
using namespace std;
class Class
{
public :
int radius;
Circle();
Circle(int r);
~Circle();
double getArea();
};
Circle :: Circle()
{
radius = 1;
cout << "반지름 " << radius << " 원 생성" << endl;
}
Circle :: Circle(int r)
{
radius = r;
cout << "반지름 " << radius << " 원 생성" << endl;
}
Circle :: ~Circle()
{
cout << "반지름 " << radius << " 원 소멸" << endl;
}
double Circle :: getArea()
{
return 3.14 * radius * radius;
}
Circle earth(1000); // 전역 객체
Circle sun(2000);
void f()
{
Circle fEarth(100); // 지역 객체
Circle fSun(200);
}
int main()
{
Circle mainEarth; // 지역 객체
Circle mainSun(20);
f();
}

코드를 실행하면 위와 같은 결과가 출력되는데, 우리는 이것을 보고 소멸자는 객체 생성의 반대로 실행된다는 것을 알 수 있다
접근 지정자
접근 지정자는 private, public, protected 이렇게 세 가지가 있고, 기능은 다른 객체 지향 언어와 동일하다
class Class
{
private :
int radius;
public :
Circle();
Circle(int r);
~Circle();
double getArea();
};
클래스의 선언부에서 사용하고, 한번 접근 지정자가 사용되면 다른 접근 지정자가 선언될 때까지 모든 멤버에 대하여 접근 지정자가 적용된다
인라인 함수
#include <iostream>
using namespace std;
inline int odd(int x)
{
return (x % 2);
}
int main()
{
int sum = 0;
for (int i = 1; i <= 10000; i++
{
if (odd(i)) sum += i; // if ((i % 2))
}
count << sum;
}
odd() 처럼 짧은 코드들을 함수로 처리하여 반복적으로 호출하면 그만큼 프로그램의 실행 시간이 길어지게 된다
인라인 함수를 사용하면 컴파일할 때, 함수가 사용된 곳이 함수 내부 내용으로 바뀌게 되는데, 이러면 함수 호출 횟수를 줄일 수 있기 때문에 프로그램 실행 시간이 줄어든다
class Class
{
private :
int radius;
public :
Circle();
Circle(int r);
double getArea();
};
inline Circle :: Circle()
{
radius = 1;
}
Circle :: Circle(int r)
{
radius = r;
}
inline double Circle :: getArea()
{
return 3.14 * radius * radius;
}
생성자와 멤버 함수를 이렇게 inline으로 선언할 수 있지만
class Circle
{
private :
int radius;
public :
Circle() { radius = 1; } // 자동 인라인
Circle(int r);
double getArea() { return 3.14 * radius * radius; } // 자동 인라인
};
이렇게 클래스 선언부 내에 직접 구현하면 자동으로 인라인 함수가 된다
구조체
C++도 C 처럼 구조체를 지원하는데, 변수만 가지던 C의 구조체와 달리 C++의 구조체는 멤버 변수와 멤버 함수를 가지고, 접근 지정도 할 수 있다
또한 다른 구조체나 클래스에게 상속도 할 수 있고 상속 받을 수도 있다
구조체는 디폴트 접근 지정이 public 이라는 점만 다르다
사용 방법은 아래와 같다
struct StructCircle
{
prviate :
int radius
public :
StructCircle(int r) { radius = r; }
double getArea();
}
double StructCircle :: getArea()
{
return 3.14 * radius * radius;
}
int main()
{
StructCircle Earth(100);
}'언어 > C++' 카테고리의 다른 글
| 소수 구하는 알고리즘 (0) | 2024.09.12 |
|---|---|
| c++ 자료형 (0) | 2024.09.09 |
| [MFC] 다이얼로그 2 (1) | 2023.10.29 |
| [MFC] 다이얼로그 1 (0) | 2023.10.28 |
| [C++] namespace (1) | 2023.10.23 |