1. 객체
- 캡슐화 : 객체의 구성 요소들을 캡슐로 싸서 보호하고 볼 수 없게 하는 것
- 객체는 캡슐화를 통해 외부의 접근을 통제해 자신의 내부 요소를 보호함
1) 캡슐화
- 실세계나 C++ 프로그램이나 구성 객체들이 상호 통신하며 시스템이 구동된다
- 캡슐화로 정보들을 보호할 수 있게 접근을 막지만 모든 요소를 차단하면 안된다
정보를 교환하고 통신하기 위해 일부 요소를 노출시켜야 된다
2) 멤버 변수 & 멤버 함수
- 객체는 상태와 행동으로 구성되어 있음
- 상태 = 멤버 변수
- 행동 = 멤버 함수
- 멤버 변수(상태)를 알고 싶다면 멤버 함수(행동)를 호출해야 된다
3) 클래스와 객체
(1) 클래스 (붕어빵 틀)
- 객체를 만들어내기 위해 정의된 설계도, 틀
- 클래스는 객체도 실제도 아님
- 멤버 변수와 멤버 함수를 선언하는 공간
(2) 객체 (=인스턴스) (붕어빵)
- 객체는 생성될 때 클래스의 모양을 갖고 만들어짐
- 멤버 변수와 멤버 함수로 구성되어 있음
- 하나의 클래스로 여러 객체를 생성할 수 있음
- 객제들은 상호 별도의 공간에 생성된다
2. 클래스
1) 클래스 선언부
- clsaa 키워드를 이용해 클래스 선언
class 클래스이름 {
}
< 예시 >
class Circle {
}
- 멤버 변수와 멤버 함수 선언
멤버 변수 -> 클래스 선언 내에서 초기화 할 수 없다
멤버 함수 -> 원형 형태로 선언해야 됨
- 접근 지정자
· Private, public, protected 중 하나
· Public : 다른 모든 클래스나 객체에서 멤버의 접근이 가능함
· Private : 어느 곳에서도 접근할 수 없음 (기본값)
· Protected : 상속받은 자식만 접근이 가능함
2) 클래스 구현
- 클래스에 정의된 모든 멤버 함수 구현
- 클래스의 재사용을 위해서 선언부와 구현부를 분리해 작성함
(함수의 리턴 타입) (클래스 이름) :: (멤버 함수) {
구현할 코드
}
< 예시 >
double Circle :: getArea(){
return 3.14 * radius * radius;
}
3) 객체 생성
- main함수에서 클래스의 이름으로 호출해 생성
int main(){
(클래스 이름) 객체이름;
}
< 예시 >
int main(){
Circle dounut; // 객체 생성
donut.radius = 1; // 멤버 변수 접근
double area = donut.getArea(); // 멤버 함수 호출
}
- 객체의 멤버에 접근하기 위해서는 객체 이름 뒤에 .(점)을 찍고 접근할 멤버 변수 혹은 멤버 함수를 적는다
3. 생성자
- 객체가 생성되는 시점에서 자동으로 호출되는 멤버 함수
- 클래스 이름과 동일한 멤버 함수
- 객체를 초기화 해준다
1) 생성자의 특징
// 생성자 선언
class Circle {
Circle(); // 클래스 이름과 동일하며 리턴 타입 없음
Circle(int r);
}
// 생성자 함수 구현
Circle::Circle() { }
Circle::Circle(int r) { }
- 생성될 때 필요한 초기 작업을 위해 생성자를 사용함
- 생성자의 이름은 반드시 클래스 이름과 동일해야 한다
- 생성자는 리턴 타입을 선언하지 않음 (void 타입도 X)
- 객체 생성 시 오직 한 번만 호출할 수 있다
- 생성자는 중복이 가능하지만 그 중 하나만 실행 된다
- 생성자가 선언되어 있지 않으면 기본 생성자를 자동을 생성 (컴파일러가)
* 기본 생성자 : 컴파일러에 의해 자동 생성된 매개 변수가 없는 생성자 (함수 구현에도 내용 없음)
2) 생성자 멤버 변수 초기화 방법
(1) 생성자 코드에서 멤버 변수 초기화
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; }
(2) 생성자 서두에 초기값으로 초기화
class Point {
int x, y;
public:
Point();
Point(int a, int b);
};
Point::Point() : x(0), y(0) { // x와 y를 0으로 초기화
}
Point::Point(int a, int b) // x = a, y = b로 초기화
: x(a), y(b) {
}
(3) 클래스 선언부에서 직접 초기화
class Point {
int x=0; y=0;
public:
...
};
3) 위임 생성자
Circle::Circle() : Circle(1) { } // 위임 생성자
Circle::Circle(int r) { // 타겟 생성자
raidus = r;
cout << "반지름은 " << radius << "이다" << endl;
}
- 여러 생성자에 중복 작성된 코드의 간소화
- 타겟 생성자 : 객체 초기화를 전담하는 생성자
- 위임 생성자 : 타겟 생성자를 호출하는 생성자, 객체 초기화를 타겟 생성자에 위임
4) 기본 생성자
class Circle {
//Circle(); 이렇게 컴파일러가 자동 생성해 준다
}
int main(){
Circla c;
}
- 생성자는 항상 클래스 내에 있어야 한다. 하지만 개발자가 생성자를 작성하지 않으면 컴파일러에 의해 기본 생정자가 자동으로 생성된다
- 기본 생성자는 매개 변수가 없고 생성자 함수 내에 구현되어 있지 않다
- 생성자가 하나라도 선언되어 있는 경우 기본 생성자를 자동 생성하지 않는다
class Circle{
int radius;
public:
Circle(int r) { radius = r; }
}
int main(){
Circle c1(5); // Circle(int r) 생성자 호출
Circle c2(); // 기본 생성자가 생성되지 않기 때문에 에러 발생
}
4. 소멸자
- 객체가 소멸되는 시점에서 자동으로 호출되는 함수
- 오직 한번만 자동 호출되며 임의로 호출할 수 없다
- 객체 메모리 소멸 직접에 호출된다
1) 소멸자 특징
class Circle {
Circle();
Circle(int r);
~Circle(); // 소멸자 함수 구현
};
// 소멸자 함수 구현
Circle::~Circle() {
}
- 객체가 사라질 때 실행 도중 동적 할당 받은 메모리 해제 등 마무리 작업을 하기 위해 소멸자를 사용한다
- 소멸자 함수의 이름은 클래스 이름 앞에 ~를 붙인다
- 소멸자는 리턴 타입이 없음
- 중복으로 선언하는 것이 불가능하다
소멸자는 하나의 클래스에는 오직 하나만 선언할 수 있다
- 소멸자는 매개 변수가 없는 함수이다
- 소멸자가 선언되어 있지 않으면 기본 소멸자가 자동 생성함
* 기본 소멸자는 아무것도 하지 않고 단순 리턴이다
2) 생성자와 소멸자 실행 순서
- 객체가 선언된 위치에 따라 지역 개체는 함수가 종료하면 소멸되고 전역 객체는 프로그램이 종료할 때 소멸된다
- 객체 생성
· 전역 객체 : 프로그램에 선언된 순서로 생성
· 지역 객체 : 함수가 호출되는 순간 순서대로 생성
- 객체 소멸
· 전역 객체 : 프로그램이 종료되면 전역 객체가 생성된 순서의 역순으로 소멸
· 지역 객체 : 함수가 종료되면 객체가 생성된 순서의 역순으로 소멸
- new를 이용해 동적으로 생성된 객체는 delete로 객체를 소멸한다
< 참고 >
명품 C++ 프로그래밍 - 황기태
'Study > C++' 카테고리의 다른 글
[C++] 입출력, 연산자 (0) | 2020.08.02 |
---|---|
[C++] 클래스와 객체 & 객체 포인터 (1) | 2020.05.31 |
[C++] 포인터, 함수 (0) | 2020.04.07 |
[C++] 조건, 반복,배열 (0) | 2020.03.31 |
댓글