C++ (2)
2024. 3. 25. 14:27ㆍ카테고리 없음
클래스와 객체
1.1 객체
캡슐화 : 객체의 구성 요소들을 캡슐로 싸서 보호하고 볼수 없게 하는 것 (객체의 본질적인 특징)
객체 = state(상태) + behavior(행동)
실제 코드 상에서는 "객체 = 멤버 변수(상태) + 멤버 함수(행동)" 이다.
이러한 객체를 사용하기 위해서는 인스턴스(instance)를 만들어야한다.
붕어빵 틀에 밀가루 반죽을 넣어 붕어빵을 제작하듯, 객체를 인스턴스를 통해 직접 객체에 있는 변수나 함수들을 사용한다.
1.2 클래스
클래스 = 클래스 선언부 + 클래스 구현부
1.2.1 클래스 선언부
class [클래스이름] {
[접근지정자] :
int a; // 멤버 변수
void getA(); //멤버 함수
};
접근지정자 : public(외부 접근 가능), private(외부 접근 불가능), protected(상속관계만 접근 가능)
1.2.2 클래스 구현부
[함수의 리턴 타입] [클래스이름] :: [멤버 함수명]([매개변수]) {
return [값];
}
범위 지정자 연산자(::) : 클래스 이름과 멤버 함수를 표현하는데 사용
#include <iostream>
using namespace std;
//선언부
class Circle{
public:
int radius; //멤버 변수
double getArea(); //멤버 함수
};
//구현부
double Circle :: getArea(){
return radius * radius*3.14;
}
int main(){
Circle a; //객체 생성
a.radius = 10; //멤버 변수 접근
cout << a.getArea(); //멤버 함수 호출
}
1.3 생성자
생성자 : 생서자를 통해 객체를 초기화 할수 있음
- 생성자의 목적은 객체가 생성될 때 필요한 최초 작업을 위함이다.
- 생성자는 디폴트로 '기본 생성자'가 생성되어 객체를 초기화 하지만, 클래스 하나에 여러 개의 생성자를 둘 수 있다.
- 생성자의 이름은 클래스 이름과 동일하게 작성되어야만 한다.
- 생성자 함수의 원형에 Return 타입을 선언하지 않는다.
- 다만, 생성자 함수는 return 문을 통해 함수 실행 종료를 진행할 수는 있기 때문에, 값만 리턴하지 않으면 된다.
위임 생성자
include <iostream>
using namespace std;
class Circle{
public :
int radius;
int test1 = 100;
int test2;
Circle();
Circle (int r);
// int Circle(int r); 리턴 타입 있으면 안됨
}
Circle :: Circle() : test2(10){ //test2 변수를 생성자 함수에서 초기화 할 수 있음.
radius =1;
// return; //생성자 함수를 종료하는 정상 리턴문
// return 0; 값이 있으면 안됨
}
Circle :: Circle(int r){
radius = r;
}
/*
지금 Circle()과 Circle(int r) 두개의 생성자의 코드가 거의 동일하다.
이때 위임 생성자를 통해 중복되는 코드를 간략화 할 수 있다.
아래처럼 하면 Circle a;를 main()에서 진행 할 경우 radius = 1; 진행하게 되어 Circle() 생성자와 동일한 진행이 된다.
Circle :: Circle() :: Circle(1){ }
Circle :: Circle(int r){
radius = r;
}
아래는 멤버 변수 초기화와 위임 생성자를 할용한 코드이다.
Circle :: Circle() ::Circle(1, 2, 3){ }
Circle :: Circle(int a, b, c){
radius(a), test1(b), test2(c);
}
*/
int main(){
Circle a; //Circle() 생성자 호출
Circle b(2); // Circle(int r) 생성자 호출
}
1.4 소멸자
소멸자 : 객체가 소멸 시점에서 객체 메모리가 반환되기 위해서 호출되는 함수
- 소멸자의 목적은 객체가 사라질 때 필요한 마무리 작업을 위함이다.
- 소멸자의 이름은 클래스 이름 앞에 ~를 붙인다.
- 리터 타입이 없으면 어떤 값도 리턴이 안된다.
- 오직 한 개만 존재하며 매개 변수를 가지지 않는다.
- 선언되어 있지 않으면 기본 소멸자가 자동으로 생성된다.
- 생성된 반대 순으로 객체가 소멸된다. (가장 나중에 선언된 지역 객체 << 처음으로 선언된 지역 객체 << 전역 객체)
include <iostream>
using namespace std;
class Circle(){
public:
int radius;
Circle();
~Circle();
};
Circle :: Circle(){
radius = 1;
}
Circle :: ~Circle(){
cout << radius << "소멸" <<endl;
}
int main(){
Circle a;
Circle b;
return 0; // 소멸 시점에 ~Circle() 소멸자 함수 호출을 통해 b, a순으로 메모리 반환해 준다.
}
1.5 인라인 함수
~~~