클래스
- 객체를 만들어내기 위한 정의된 설계도, 틀
- 클래스는 객체, 실체도 아니다.
- 멤버 변수와 멤버 함수 선언
객체
- 객체는 생성될 떄 클래스의 모양을 그대로 가지고 탄생
- 멤버 변수와 멤버함수로 구성
- 메모리에 생성, 실체(instance)라고도 부름
- 하나의 클래스 틀에서 찍어낸 여러 개의 객체 생성 가능
1) 클래스 선언부
- class 키워드를 이용하여 클래스 선언
- 멤버 변수와 멤버 함수 선언
- 멤버에 대한 접근 권한 지정
클래스 만들기 설명
class Circle{
public::
int radius; // 프로퍼티
double getArea(); //메소드
};
double Cirle:: getArea() { //Circle 메소드 구현
return 3.14*radius*radius;
}
생성자(construtor)
- 객체가 생성되는 시점에서 자동으로 1번 호출되는 멤버 함수
- 클래스 이름과 동일한 멤버 함수
- 리턴(반환)타입이 없음
- 클래스 이름과 동일하게 생성
- 초기화할 값이 없을 떄에는 안써줘도 됨(원래 자동으로 생성되지만 보이지는 않음)
(1)생성자 왜 이용?
객체가 생성될 때 객체가 필요한 초기화를 위해
(2)생성자의 특징
- 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있습니다.
- 생성자는 반환값이 없지만, void형으로 선언하지 않습니다.
- 객체를 초기화하는 방법이 여러 개 존재할 경우에는 오버로딩 규칙에 따라 여러 개의 생성자를 가질 수 있습니다
(3)기본생성자
- C++컴파일러는 객체가 생성될 떄, 생성자 반드시 호출
- 자동호출
- 생성자가 하나라도 선언된 클래스의 경우 컴파일러는 기본 생성자를 자동 생성하지 않음.
ex)
#include <iostream>
using namespace std;
class Rectangle {
public:
int width, height;
Rectangle();
Rectangle(int w, int h);
Rectangle(int l);
bool isSquare();
};
Rectangle::Rectangle() {
width = height = 3;
}
Rectangle::Rectangle(int w, int h) {
width = w; height = h;
}
Rectangle::Rectangle(int l) {
width = height = l;
}
bool Rectangle::isSquare() {
if (width == height) return true;
else return false;
}
int main() {
Rectangle rect1;
Rectangle rect2(3, 5);
Rectangle rect3(3);
if (rect1.isSquare()) cout << "rect1은 정사각형이다." << endl;
if (rect2.isSquare()) cout << "rect2는 정사각형이다." << endl;
if (rect3.isSquare()) cout << "rect3는 정사각형이다." << endl;
}
소멸자
- 객체가 소멸되는 시점에서 자동으로 호출되는 함수
- 오직 한번만 자동 호출, 임의로 호출할 수 없음
- 객체 메모리 소멸 직전 호출됨
- 오직 한개만 만들어 줄 수 있다.
- 객체는 생성의 반대순으로 소멸된다. -> 스택의 원리(LIFO)
class Circle {
Circle();
Circle(int r);
..............
~Circle(); // 소멸자는 매개변수를 받지않음!!
};
Circle::~Circle() { //소면자
...............
}
#include <iostream>
using namespace std;
class Circle {
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;
}
int main() {
Circle donut;
Circle pizza(30);
return 0;
}
생성자 소멸자 실행 순서
멤버에 대한 3 가지 접근 지정자
private
- 디폴트 접근 지정자
- 동일한 클래스의 멤버 함수에만 제한함
- 같은 클래스안에서 사용가능
- 클래스 밖의 외부에서는 접근을 하지 못함
#include <iostream>
using namespace std;
class PrivateAccessError {
private:
int a;
void f();
PrivateAccessError();
public:
int b;
PrivateAccessError(int x);
void g();
};
//생성자를 구현하고 있는데 이것은 결국 class안에 있는 것이므로
//a는 private라도 호출 가능
PrivateAccessError::PrivateAccessError() {
a = 1; // (1)
b = 1; // (2)
}
PrivateAccessError::PrivateAccessError(int x) {
a = x; // (3)
b = x; // (4)
}
void PrivateAccessError::f() {
a = 5; // (5)
b = 5; // (6)
}
void PrivateAccessError::g() {
a = 6; // (7)
b = 6; // (8)
}
int main() {
//PrivateAccessError objA; // (9)
PrivateAccessError objB(100); // (10)
//objB.a = 10; // (11)
objB.b = 20; // (12)
//objB.f(); // (13)
objB.g(); // (14)
}
public
모든 다른 클래스에 허용
protected
클래스 자신과 상속받은 자식 클래스에만 허용
ex) 종합예제
2차원 공간에서 하나의 점을 나타내는 Point 클래스를 작성하여 보자.
Point 클래스는 x좌표와 y좌표를 나타내는 필드를 가진다.필드는 모두 private로 선언한다.
생성자를 이용하여 x, y 좌표를 설정하고 좌표의 값을 화면에 출력하는 print_xy() 함수를 만들자.
main에서 p1()과 p2(30, 40)을 갖는 객체를 생성하고 객체 p1의 x는 100, y는 200으로 초기화한다.
소멸자를 통해서 소멸되는 x, y값을 확인해보자.
#include <iostream>
using namespace std;
//2차원 공간에서 하나의 점을 나타내는 Point 클래스를 작성하여 보자.
//
//Point 클래스는 x좌표와 y좌표를 나타내는 필드를 가진다.필드는 모두 private로 선언한다.
//
//생성자를 이용하여 x, y 좌표를 설정하고 좌표의 값을 화면에 출력하는 print_xy() 함수를 만들자.
//
//main에서 p1()과 p2(30, 40)을 갖는 객체를 생성하고 객체 p1의 x는 100, y는 200으로 초기화한다.
//
//소멸자를 통해서 소멸되는 x, y값을 확인해보자.
class Point {
private:
int x;
int y;
public:
Point();
Point(int x, int y);
void print_xy();
~Point();
};
Point::Point() {
x = 100; y = 200;
}
Point::Point(int a, int b) {
x = a; y = b;
}
Point::~Point() {
cout << "x는 " << x << "이 소멸되었습니다, " << "y는 " << y << "이 소멸 되었습니다." << endl;
}
void Point::print_xy() {
cout << "x좌표는 " << x << " y좌표는 " << y << "입니다." << endl;
}
int main() {
Point p1;
Point p2(30, 40);
p1.print_xy();
p2.print_xy();
return 0;
}
헤더파일
- <>경로에가서 가져옴 위치가 설정됨
- ""위치를 알려줄때 주로 같은 폴더안에 경로를 적어줌
1) 헤더파일 나누기
ex) _친 부분은 꼭 헤더파일에 적어주기!
조건 컴파일 문. Circle.h를 여러 번 include해도 문제없게 하기 위함
#ifndef CIRCLE_H
#define CIRCLE_H
class Circle {
private:
int radius;
public:
Circle();
Circle(int r);
double getArea();
};
#endif
'Programming > C++' 카테고리의 다른 글
C++ 동적할당 실습 문제 (0) | 2021.04.20 |
---|---|
C++ 객체 포인터 선언 및 활용 (0) | 2021.04.19 |
C++ 문자열 배열 실습문제 (0) | 2021.04.15 |
C++ 포인터 배열 실습문제 (0) | 2021.04.15 |
C++ 포인터 (0) | 2021.04.13 |
댓글