03 클래스와 객체
1. 객체에 대한 이해
- C++은 클래스를 설계하고, 객체를 생성하고, 객체를 활용하고, 클래스를 상속받는 등의 내용이 계속된다.
- 우리 주변에 있는 모든 것이 "객체" 이다.
- 캡슐화 : 객체의 구성 요소들을 캡슐로 싸서 보호하고 볼 수 없게 하는 것
1) 객체의 구성 요소
ⓐ 멤버 변수 : 객체의 상태를 나타내는 속성
ⓑ 멤버 함수 : 행동을 구현한 코드들
2) C++클래스와 객체
ⓐ 클래스 : 객체를 정의하는 틀 혹은 설계도로서, 클래스에 멤버 변수와 멤버 함수를 선언한다.
ⓑ 객체 : 클래스에서 멤버 변수와 함수코드를 가지고 프로그램이 실행되는 동안 실존하는 인스턴스
ex) TV를 이용한 클래스와 객체의 개념
TV 클래스에는 멤버 변수와 멤버 함수들이 선언되어 있고, TV클래스는 하나이지만 TV객체들은 얼마든지 생성될 수있다. 이때 각 TV객체들은 상호 별도 공간에 생성된다. TV객체들의 멤버함수 코드는 클래스에 선언된 코드와 동일하지만, 객체들이 서로 다르게 활용되기 때문에 동일한 멤버 변수의 값이 각 객체에서 다르게 유지된다 - p99
2. C++ 클래스 만들기
- C++에서는 class 키워드를 이용하여 클래스를 선언한다.
- 클래스 선언부와 클래스 구현부로 나눠짐(why? 클래스의 재사용을 위해)
1) 클래스 선언부
- 클래스는 class 키워드와 클래스 이름으로 선언한다.
class Circle { //Circle 이름의 클래스 선언
...
}; //반드시 세미클론으로 종료
- 클래스 멤버 : 클래스 멤버는 변수와 함수로 구성된다.
class Circle {
public:
int radius = 5; //클래스 선언부에서 멤버변수의 초기화 가능
double getArea(); //원형 형태로 선언되어야 함
};
- public 접근 지정자 : 클래스의 일부 멤버들을 다른 클래스와의 통신을 위해 외부에 공개하려면 사용
* 접근 지정자 : public, private, protected의 3종류가 있음. 디폴트는 private(외부 접근 불가능)
2) 클래스 구현부
- 클래스 구현부에서는 클래스 선언부에 선언된 멤버 함수의 코드를 구현함
double Circle :: getArea() {
return 3.14*radius*radius;
}
- 범위 지정 연산자 :: 를 사용하여 클래스 이름과 멤버 함수를 기술함.
3. 객체 생성과 객체 활용
1) 객체 생성
클래스 이름 객체 이름;
Circle donut;
2) 객체의 멤버 접근
객체이름.멤버
donut.radius = 1;
ex) Circle 클래스의 객체 생성 및 접근
#include <iostream>
using namespace std;
class Circle {
public:
int radius;
double getArea();
};
double Circle::getArea() {
return 3.14*radius*radius;
}
int main() {
Circle donut; //도넛 객체 생성
donut.radius = 1;
double area = donut.getArea();
cout << "donut 면적은 " << area << endl;
Circle pizza; //피자 객체 생성
pizza.radius = 30;
area = pizza.getArea();
cout << "pizza 면적은 " << area << endl;
}
4. 생성자
1) 생성자란?
- 클래스는 객체가 생성될 때 자동으로 실행되는 생성자를 통해 객체를 초기화 한다.
2) 생성자의 특징
- 생성자의 목적은 객체가 생성될 때 필요한 초기 작업을 위함
- 생성자 함수는 오직 한 번만 실행됨
- 생성자 함수의 이름은 클래스 이름과 동일하게 작성되어야 함
- 생성자 함수의 원형에 리턴타입을 선언하지 않음
- 생성자는 중복 가능함
class Circle {
...
Circle(); //생성자 생성
}
Circle::Circle() {
...
return; //생성자 함수를 종료하는 정상적인 리턴문
}
3) 객체 생성과 생성자 실행
#include <iostream>
using namespace std;
class Circle {
public:
int radius;
Circle(); //기본 생성자
Circle(int r); //매개변수 있는 생성자
double getArea();
};
Circle::Circle() {
radius = 1;
cout << "반지름 " << radius << " 원 생성" << endl;
}
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << " 원 생성" << endl;
}
double Circle::getArea() {
return 3.14*radius*radius;
}
int main() {
Circle donut; //매개 변수 없는 생성자 호출
double area = donut.getArea();
cout << "donut 면적은 " << area << endl;
Circle pizza(30); //매개 변수 있는 생성자 호출
area = pizza.getArea();
cout << "pizza 면적은 " << area << endl;
}
4) 위임 생성자, 생성자가 다른 생성자 호출
- 한 클래스의 생성자들에는 대개 객체를 초기화하는 비슷한 코드가 중복된다.
- 따라서 중복된 초기화 코드를 하나의 생성자로 몰고, 다른 생성자에서 이 생성자를 호출 할 수 있게 한다.
ⓐ 타겟 생성자 : 객체의 초기화 작업이 코딩된 생성자
ⓑ 위임 생성자 : 객체의 초기화를 다른 생성자에 위임하는 생성자
- 앞서 작성한 코드를 위임 생성자를 활용하여 명료하게 바꿀 수 있다.
Circle::Circle() {
radius = 1;
cout << "반지름 " << radius << " 원 생성" << endl;
}
Circle::Circle(int r) {
radius = r;
cout << "반지름 " << radius << " 원 생성" << endl;
}
// 위 코드의 위임 생성자 활용
Circle::Circle() : Cricle(1) { } //위임 생성자
Circle::Circle(int r) { //타겟 생성자
radius = r;
cout << "반지름 " << radius << "원 생성" << endl;
}
5) 생성자와 멤버 변수의 초기화
- 클래스의 멤버 변수들은 자동으로 초기화 되지 않기 때문에 생성자에서 초기화 한다.
ⓐ 생성자 코드에서 멤버 변수 초기화
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; }
ⓑ 생성자 서두에 초기값으로 초기화
Point::Point : x(0), y(0) {
}
Point::Point(int a, int b)
: x(a), y(b) {
}
ⓒ 클래스 선언부에서 직접 초기화
class Point {
int x=0, y=0;
...
}
6) 기본 생성자
- 생성자는 무조건 있어야 한다. 하지만 선언하지 않았을 경우 컴파일러가 기본 생성자를 만들어 삽입한다.
- 디폴트 생성자라고도 부르며, 매개변수가 없다.
- 생성자가 하나라도 선언된 클래스는 컴파일러가 기본 생성자를 자동 삽입하지 않는다.
'Major > C&C++' 카테고리의 다른 글
[C++] 명품 C++ Programming 3장 연습문제 (0) | 2021.08.07 |
---|---|
[C++] 명품 C++ Programming 3장 개념정리 (2) (0) | 2021.07.28 |
[C++] 명품 C++ Programming 2장 연습문제 (0) | 2021.07.12 |
[C++] 명품 C++ Programming 2장 개념정리 (0) | 2021.07.10 |
[C++] 명품 C++ Programming 1장 연습문제(이론) (0) | 2021.05.03 |