우선 예시 코드부터 살펴보자.
#include <string>
#include <iostream>
class Person
{
std::string name;
int age;
public:
Person(const std::string& name, int age) : name(name), age(age){}
};
class Student : public Person
{
int id;
public:
Student(const std::string& name, int age, int id) :Person(name, age), id(id){}
};
int main()
{
Student s("kim", 28, 15);
Person p1("kim", 28);
}
Class Person은 string name과, int age 2가지의 멤버 변수를 가진다.
Person(const std::string& name, int age) : name(name), age(age){} 해당 line으로 멤버 변수를 초기화 해주는 생성자 line이다.
여기서 name(name) 에서 앞에 name은 멤버 변수 name을 나타내고, (name)은 생성자 함수에서 전달받은 const std::string& name을 나타낸다.
즉 멤버 변수 name에 const std::string& name를 입력해주는 것이다.
c++을 공부한지 얼마 되지 않아서 나는 student를 초기화 할때에는 id 값만 주면 되는 줄 알았는데,
부모 클래스(기반 클래스) 의 멤버 변수들 또한 초기화 해주어야 하는 것이다.
그리고 또 하나의 호기심이 있었는데,
Student(const std::string& name, int age, int id) :Person(name, age), id(id){} 해당 line이다.
여기서 왜 const std::string& name ? &얘는 왜 쓰는 것이지 라고 생각을 했는데
&를 해주지 않으면, name을 복사 한 뒤에 해당하는 값을 입력해주는 것이라고 한다.
복사를 한다 -> 결국 불필요한 Memory를 낭비하는 것이라고 이해할 수 있다.
다음 Student s와 Person p1을 생성해줬는데, 만약 생성자 함수를 사용하지않고 Person p1 이렇게 정의한다면
age와 name에는 초기화되지 않은 객체가 생성된 것이다. -> 안정성이 많이 떨어지는 코드
class에서는 접근 제어 지시자는 대략적으로 public, private, protected가 있다.
class에서 딱히 public이나 protected로 접근 제어 지시자를 지정해주지 않으면 Default로 private으로 사용한다.
- Private
해당 클래스 내부에서만 접근이 가능, 외부에서는 접근 할 수 없음.
주로 class의 세부 구현 사항들을 감추고, 외부에서 접근하지 못하게 하기위해 사용 -> 안정성 - Public
Private과 반대로 외부에서 class 멤버 변수로 접근이 가능하다. - Protected
파생 class 들은 접근이 가능하지만, 외부에서는 접근할 수 없다.
주로 상속 관계에서 기반 class의 일부 멤버를 파생 class에서 사용할 수 있도록 하는데 사용된다.
'Programming > c++ Design Pattern' 카테고리의 다른 글
[c++ Design Pattern] Template Method (0) | 2023.11.29 |
---|---|
[C++] OCP Code 예제 (1) | 2023.11.29 |
[C++] 추상 클래스 (0) | 2023.11.29 |
[C++] 가상 함수 (1) | 2023.11.28 |
[c++] Upcasting (0) | 2023.11.28 |