클래스
- 특정한 용도를 수행하기 위한 변수와 함수를 모아 둔 틀이다 자료형으로 볼 수 있다
- struct는 public 선언이, class는 private 선언이 기본이다
private
- 클래스 내에서 private로 선언된 개체는 외부에서 접근이 불가능하다 클래스에서 선언되는 함수로만 접근 가능하다
ex) class TV {
private:
bool powerOn;
int channel;
int volume;
}
public
- 클래스 내에서 public으로 선언된 개체는 외부에서 접근이 가능하다 private로 선언된 개체와 구분을 위해 사용한다
- private와 사용방법은 같다
객채
- 클래스라는 틀을 이용하여 찍어낸 개체(변수, 메모리상의 공간)이다
- 변수를 선언해 주듯이, 선언을 해주면 객체가 생성된다
생성자
- 객체가 생성될 때 자동으로 호출되는 함수
- 클래스와 이름이 같은 함수를 만든다
- 멤버 변수를 초기화하는데 유용하다
- 중첩 사용이 가능하다 생성자 위임으로 코드 수정을 간편하게 만들 수 있다
- 중괄호 앞에 ':'와 변수이름(값)을 써도 같다 중괄호 안에서 '변수이름(값)' 형태는 사용이 불가능하다
ex) class Time {
public:
Time() {
hour = 0;
minute = 0;
second = 0;
}
Time(int s_) : Time() {
second = s_;
}
Time(int m_, int s_) : Time(s_) {
minute = m_;
Time(int hour, int minute, int second) : Time(minute, second) { 멤버변수와 매개변수의 구분이 확실한 방법
hour = hour;
}
소멸자
- 객체가 소멸될 때 자동으로 호출되는 함수
- 클래스와 이름이 같은 함수 앞에 '~'를 붙여 만든다
this
- 자기가 소속된 객체의 주소를 나타낸다
- 보이지 않는 매개변수로 주소가 넘어간다고 생각하면 된다 자주 사용되는 형태이기 때문에 간편화가 되어있다
ex) class MyClass {
public:
void PrintThis() {
cout << "나의 주소는" << this << endl;
}
}
멤버 메서드
- 클래스 내부에 있는 함수들을 지칭한다
- 대부분 선언과 정의는 분리한다
ex) class Vector2 {
public:
Vector();
Vector(float x, float y);
/* 중략 */
};
Vector2::Vector2() : x(0), y(0) { }
Vector2::Vector2(float x, float y) : x(x), y(y) { }
연산자 오버로딩
- +, -, *, / 등의 연산자를 원하는 연산으로 대체시켜준다
주의 멤버 메소드로 작성한 오버로딩은 무조건 좌변에 객체를 두어야 한다
ex) class Vector2 {
public:
Vector2 operator+(const Vector2 rhs) const { }
Vector2 operator*(const Vector2 rhs) const { }
Vector2 operator/(const Vector2 rhs) const { }
/* 중략 */
};
Vector2 Vector2::operator+(const Vector2 rhs) const {
return Vector2(x + rhs.x, y + rhs.y);
}
Vector2 operator*(const float a, const Vector2 b) { 클래스의 메소드가 아니다
return Vector2(a * b.GetX(), A * b.GetY());
}
Vector2 c1 = a + b;
Vector2 c2 = 1.6 * a;
Vector2 c3 = 1.6 / a; (1.6).operator/(a)는 (1.6)이 객체가 아니기 때문에 불가능하다
정적 멤버 변수
- 클래스와 밀접한 전역변수를 클래스 내부로 들여오는 방법이다
- 서로 다른 클래스의 전역변수 공동 사용으로 인한 오류를 방지할 수 있다
주의 선언은 클래스 안에서 하지만 정의는 클래스 밖에서 해야한다
ex) class Color {
public:
/* 중략 */
static int idCounter; class 안에서 정적 멤버 변수를 초기화 할 수 없다
private:
float r;
float g;
float b;
};
int Color::idCounter = 1; 정적 멤버는 네임스페이스처럼 작동한다
정적 멤버 메서드
- 클래스의 private 멤버까지 접근이 가능하면서 전역 함수처럼 쓸 수 있다
ex) class Color {
public:
/* 중략 */
static Color MixColors(Color a, Color b) { static을 쓰지 않으면 멤버의 소속을 밝혀야 해서 불편하다
return Color((a.r + b.r) / 2, (a.g + b.g) / 2, (a.b + b.b) / 2); private 멤버에 접근이 가능하다
}
private:
float r;
float g;
float b;
};
Color purple = Color::MixColors(blue, red); purple.MixColors(blue, red); 사용도 가능하다
상수형 매개변수
- 매개변수가 변화하지 않도록 만들어 준다 매개변수 값이 절대로 변하지 말아야 하는 상황에 쓰인다
- 모든 함수에서 사용이 가능하다
ex) void Deposit(const int d) { 임금되는 돈의 액수가 달라지면 안된다
d = money; 매개변수가 상수화 되었기 때문에 사용 불가능한 명령어
money += d;
}
상수형 메서드
- 멤버 변수를 확인만 할 뿐, 값의 변경이 없어야 할때 사용한다 읽기 전용
- 멤버 메서드에 대해서만 사용이 가능하다
주의 함수 선언 뒤쪽에 const를 작성한다 함수 선언 앞에 작성하는 경우는 상수형 메소드가 아니다
ex) int ViewMoney() const {
money++; 메서드가 상수화 되었기 때문에 사용 불가능한 명령어
return money;
}
'Study > C C++' 카테고리의 다른 글
[두들낙서] 객체 복사 (0) | 2021.03.04 |
---|---|
[두들낙서] 동적 할당 (0) | 2021.03.04 |
[두들낙서] C++ 스타일 문법 (0) | 2021.03.03 |
[두들낙서] 상수 (0) | 2021.03.01 |
[두들낙서] 구조체 (0) | 2021.03.01 |