개요
드디어 뭔가 C++에서 객체지향스러운걸 배우기 시작했습니다.
대충 클래스는 틀이고... 거기서 만들어진건 객체고...
다 C#에서 이미 배웠던겁니다.
클래스와 객체
class Circle
{
public :
int radius;
string color;
double calcArea()
{
return 3.14f * radius * radius;
}
}
익숙하죠?
저거 그대로 C#에 옮겨가도 딱히 위화감이 없습니다.
한줄 한줄 풀어보자면...
class Circle : class 키워드로 클래스를 선언하고 클래스 이름을 적습니다.
public : : 접근 제한자라고 불리고 public 이면 밖에서 맘대로 접근 할 수 있고 private이면 접근할 수 없습니다.
protected 라는 키워드도 있는데 나중에 상속 배울때 설명하겠습니다.
int radius;
string color; : 클래스의 멤버변수
double calcArea() : 클래스의 멤버 함수
이렇게 만든 클래스로 객체를 생성하려면
Circle circle;
과 같이 생성하여
circle.radius = 5
처럼 이래저래 만질 수 있습니다.
그리고 멤버 함수가 조금 복잡하다면 예전 글에서 설명했듯이 함수를 따로 빼서 선언해줄 수 있습니다.
double Circle :: calcArea()
{
return 3.14f * radius * radius;
}
class Circle
{
public :
int radius;
string color;
double calcArea();
}
접근자와 설정자
클래스에는 private 멤버 변수들이 있겠죠?
하지만 이런 변수들에게 접근하여 값을 갖고오거나 설정하려면 접근자와 설정자를 사용할 수 있습니다.
class obj
{
public :
int a;
int b;
int getC() { return c; };
int getD() { return d; };
void setC(int x) { c = x; };
void setD(int x) { d = x; };
private :
int c;
int d;
}
별건 없고 그냥 함수로 만들어주는겁니다.
C#에서 있던 프로퍼티 같은게 있을지 모르겠네요.
생성자
생성자의 특징으론...
- 생성자는 객체가 생성될때 단 한 번만 실행된다.
- 생성자 함수의 이름은 클래스 이름과 동일하게 작성되어야 한다.
- 생성자 함수의 원형에 반환형을 선언하지 않는다.
- 생성자는 매개변수를 달리하여 중복 가능하다.
정도가 있습니다.
보통 매개변수를 받아 클래스 내부 변수들을 초기화 하는데에 사용합니다.
class MyClass
{
public:
int a,b;
MyClass()
{
a = b = 1;
}
MyClass(int x, int y) // 생성자 오버로딩
{
a = x;
b = y;
}
}
int main()
{
MyClass m1();
MyClass m2(1, 2);
}
이런식으로 말이죠.
이 생성자를 통해 멤버 변수를 초기화 할때는 권장되는 방법이 있습니다.
class MyClass
{
public:
int a,b;
MyClass(int x, int y)
{
a = x;
b = y;
}
}
이런식으로 초기화 할경우 생성자를 호출하고 대입하며 이어지는 2번의 함수 호출이 일어납니다.
그렇기 때문에 중괄호를 사용해서
class MyClass
{
public:
int a,b;
MyClass(int x, int y) : a{x}, b{y} {};
}
초기화를 진행하면 한번의 호출로 초기화를 끝마치게 됩니다.
이러한 방식은 상수나 참조자가 멤버일때 무조건적으로 사용해야합니다.
...단순 생성자에서의 성능 이슈 말고도 중괄호를 사용하는 것이 =을 사용해서 초기화 하는것이 더욱 좋습니다.
vector int> v{1,2,3}
같이 컨테이너를 초기화 할때 사용할 수 있고,
int n {1.5}
같은 형변환에서 축소변환을 필요로 하며
short s {100000}
와 같은 오버플로우 상황을 방지합니다.
소멸자
소멸자의 특징으론...
- 소멸자의 목적은 객체가 사라질 때 필요한 마무리 작업을 위함이다.
- 소멸자의 이름은 클래스 이름 앞으로 ~를 붙인다.
- 소멸자는 반환형이 없으며 어떠한 값도 반환해서는 안된다.
- 소멸자는 오직 한 개만 존재하며 매개변수를 가지지 않는다.
C#에선 GC.Collect()를 호출하지 않는 이상 메모리를 직접 지울 수 없기 때문에 있으나마나 한 소멸자였지만
delete 키워드를 사용해서 프로그래머가 맘대로 메모리를 지워버릴 수 있는 전능의 영역인 C++에선 소멸자가 생각보다 흔히 쓰일 수도 있겠다는 생각이 듭니다.
소멸자는 클래스 이름 앞에 ~를 붙여서 만듭니다.
class MyClass
{
public:
int a,b;
~MyClass()
{
cout << a << 와 << " " << b << "를 가진 MyClass 하나가 소멸했습니다.";
}
}
네... 이게 끝이에요.
this 포인터
this 포인터는 클래스 멤버 함수 내에서만 사용 가능하고 멤버 함수에서 컴파일러에 의해 묵시적으로 삽입되는 매개변수입니다.
this 포인터가 가르키는 값은 객체 자신이며 보통 생성자에서 매개변수와 멤버 함수가 같을때나 객체의 주소값을 반환해야 할때 사용합니다.
class MyClass
{
public:
int a,b;
MyClass(int a, int b)
{
this -> a = a;
this -> b = b;
}
}
여기서 쓰인 -> (화살표 연산자)는 포인터를 통해 객체의 인스턴스에 접근할때 씁니다.
마치는 말
웬만해선 C#에서 있던 개념입니다.
클래스나 생성자, 소멸자, this... 등등.
-> 같은 생소한거 빼곤 C#과 똑같다고 봐도 무방하겠군요.
'개발 > C++' 카테고리의 다른 글
게임 프로그래밍 | C++ | 열거형 (1) | 2024.04.10 |
---|---|
게임 프로그래밍 | C++ | 콘솔 / 입력 (1) | 2024.04.08 |
자료구조/게임 프로그래밍 | C++ | 함수, 포인터 (1) | 2024.03.28 |
게임 프로그래밍 | C++ | 랜덤 (2) | 2024.03.22 |
자료구조 | C++ | 문자열 (3) | 2024.03.17 |