객체에 대한 이해
캡슐화 : 객체(object)의 구성 요소들을 캡슐로 싸서 보호하고 볼 수 없게 하는 것으로, 객체의 가장 본질적인 특성
- 객체는 이 캡슐화(encapsulation)를 통해 외부의 접근을 통제하여 자신의 내부 요소들을 보호한다.
- 구성: 상태(state)인 멤버 변수와 행동(behavior)인 멤버 함수
- 행동으로 상태가 변하고, 어떤 행동은 객체 상태를 외부로 전달
클래스 : 객체를 정의하는 틀 혹은 설계도로서, 클래스에 멤버 변수와 멤버 함수를 선언한다.
- 이때 객체는 클래스라는 틀에서 찍어낸 멤버 변수와 멤버 함수를 실제로 갖고, C++ 프로그램이 실행되는 동안 실존하는 실체(instance)다.
- 객체가 생성되면 상호 별도 공간에 생성된다.
요약
캡슐화: 객체의 구성 요소들을 보호하는 것으로, 객체의 특징
클래스: 객체(실존하는 실체)를 정의하는 틀
C++ 클래스 만들기
C++에서 클래스를 만들기 위해 class 키워드를 이용한다.
- 이때 c++ 클래스는 개발자가 정의하는 새로운 데이터 타입이다.
- 클래스 선언부(declaration)과 구현부(implemetation)로 나누어 작성한다.
class Circle
{
public: // 멤버에 대한 접근 지정자
int radius; // 멤버 변수
double getArea(); // 멤버 함수
}; // 클래스 선언부
double Circle::getArea()
{
return 3.14 * radius * radius;
} // 클래스 구현부
- 클래스 선언부
- 선언부의 중괄호 마지막에 세미콜론으로 끝나는 것에 주의하자.
- 멤버 변수와 멤버 함수의 원형을 선언한다.
- 클래스 구현부
- 클래스 선언부에 선언된 멤버 함수의 코드를 구현
- 범위 지정 연산자 ::를 사용하여 클래스 이름과 함께 멤버 함수를 기술한다. (중복 방지)
이렇게 선언부와 구현부를 나눈 이유는 클래스의 재사용을 위해서다.
요약
C++에서는 클래스의 재사용을 위해 선언부와 구현부로 나눈다.
객체 생성과 객체 활용
// 예제 3-1
#include <iostream>
using namespace std;
class Circle
{
public:
int radius;
double getArea();
};
double Circle::getArea()
{
return 3.14 * radius * radius;
}
int main()
{
Circle circle;
circle.radius = 1;
double area = circle.getArea();
// circle 객체는 area 변수와 함께 main()의 스택에 존재
cout << "circle의 면적은 " << area << "입니다.\n";
Circle donut;
donut.radius = 30;
area = donut.getArea();
cout << "donut의 면적은 " << area << "입니다.\n";
return 0;
}
- Circle이라는 클래스의 기능을 그대로 간직한 실체로서 객체는 해당 프로그램에서 circle과 donut이다.
객체가 생성되면 클래스 크기의 메모리가 할당하고, 만약 객체의 멤버에 접근하기 위해서는 객체이름에 '.'(dot)을 붙여 접근할 수 있다.
요약
객체에 접근하기 위해서는 '.'연산자를 이용한다.
생성자
// 예제 3-4
#include <iostream>
using namespace std;
class Circle
{
public:
int radius;
Circle();
Circle(int r);
double getArea();
};
Circle::Circle() : Circle(1) { } // 위임 생성자
Circle::Circle(int r) // 타겟 생성자
{
radius = r;
cout << "반지름 " << radius << " 원 생성\n";
}
double Circle::getArea()
{
return 3.14 * radius * radius;
}
int main()
{
Circle circle;
double area = circle.getArea();
cout << "circle의 면적은 " << area << "입니다.\n";
Circle donut(30);
area = donut.getArea();
cout << "donut의 면적은 " << area << "입니다.\n";
return 0;
}
생성자: 객체가 생성될 때 자동으로 실행되는 특별한 멤버 함수 (constructor)
- 특징
- 객체가 생성될 때 필요한 초기 작업을 실행
- 오직 한 번만 자동으로 실행
- 생성자의 이름은 클래스의 이름과 동일
- 생성자 함수의 원형에 리턴 타입을 선언하지 않음
- 생성자 함수를 종료하는 return은 가능하지만, return value와 같이 값을 반환하면 안 됨
- 매개 변수 개수나 타입이 서로 다르게 중복 가능
- C++ 컴파일러는 반드시 생성자 중 하나를 호출하도록 컴파일 하므로, 생성자가 없으면 기본 생성자를 자동으로 호출한다.
- 이때 기본 생성자는 아무 실행 없이 바로 리턴한다.
위임 생성자: 기본 생성자와 매개 변수를 하나 갖는 생성자의 객체를 초기화 하는 코드가 중복되는데, 중복된 초기화 코드를 하나의 생성자로 몰아 호출하는 것을 의미.
- 위임 생성자가 호출되면, Circle() 생성자는 자신의 코드를 실행하기 전 타겟 생성자를 호출해 r에 1을 넘겨주어 radius를 1로 초기화한다.
요약
생성자
1. 정의: 객체가 생성될 때 자동으로 실행되는 함수
2. 특징
a. 객체가 생성될 때 필요한 초기 작업을 수행
b. 생성자의 이름은 클래스의 이름과 동일하며, 함수 원형에 리턴타입을 선언하지 않음
c. 생성자가 없으면 기본 생성자를 자동으로 호출
3. 위임 생성자: 중복된 초기화 코드를 하나의 생성자로 몰아 호출하는 생성자
문제풀이: GitHub
반응형
'Language > C++' 카테고리의 다른 글
[C++] CH5 함수와 참조, 복사 (1) (0) | 2023.02.28 |
---|---|
[C++] CH4 객체 포인터, 배열, 동적 할당 (2) (0) | 2023.02.03 |
[C++] CH4 객체 포인터, 배열, 동적 할당 (1) (0) | 2023.01.31 |
[C++] CH3 클래스와 객체 (2) (0) | 2023.01.30 |
[C++] CH2 C++ 프로그래밍의 기초 (0) | 2023.01.27 |