2022. 12. 22. 20:24ㆍ자료구조, 알고리즘
(해당 내용은 자료구조/알고리즘을 공부하기 위해 작성된 것이므로, 내용에 오류가 있을 수 있습니다.)
C++은 기존의 절차지향 언어인 C 언어가 각 물체 간의 상호작용 등 복잡한 관계를 표현하는데 한계가 있음을 인식하고,
이를 개선하기 위해 객체지향 언어라는 새로운 개념을 도입하면서 만들어진 언어입니다.
C++ 언어는 객체지향 언어로서 기존의 C 언어와는 다른 특성을 가집니다.
- 추상화(abstraction)
- 캡슐화(encapsulation)
- 다형성(polymorphism)
- 상속(inheritance)
- 코드의 재활용(resuability of code)
클래스는 위의 객체지향적인 특성을 구현하기 위한 가장 중요한 개념입니다.
클래스의 개념
클래스는 C의 구조체에서 확장된 개념이라고 볼 수 있습니다.
실제로 구조체와 클래스 모두 어떤 객체를 표현하기 위해 여러 자료형을 묶어 하나의 자료형으로 정의한 것을 뜻합니다.
그러므로 기본적인 구성은 구조체와 클래스 사이에 큰 차이는 없다고 볼 수 있습니다.
다만, 접근제어 지시자를 따로 지정하지 않는다면, 구조체는 public(클래스 외부에서 접근 가능), 클래스는 private(클래스 내에서만 접근 가능) 정도의 차이가 있습니다.
C++에서의 클래스는 객체를 정의하는 일종의 틀로서 생각하시면 편합니다.
에를 들어, 컴퓨터는 제품에 따라 사용한 부품 제조사나 운영체제 등의 차이는 있습니다만,CPU, 메모리 등 필요한 부품과 작동(연산, 제어)방식은 거의 같습니다.자동차의 경우에도 제조사 또는 차종에 따라 부품이나 사용하는 유류 등의 차이는 있지만,기본적으로 엔진이 필요하고, 배터리가 필요하고, 연료가 필요한 등 기본적으로 필요한 것이 같은 것과 같습니다.이 때 컴퓨터나 자동차에 기본적으로 필요한 것들(변수)을 틀(클래스)로 지정하고, 만들어진 틀에 제품 정보 등의 사항을 작성하여 컴퓨터나 자동차의 종류(객체)를 생성하는 방식입니다.자동차나 컴퓨터의 클래스를 그림으로 표현하면 아래와 같고, 여기에 특정 제품에 대한 내용을 변수에 삽입하면 해당 제품에 대한 객체를 생성할 수 있습니다.

C++ 클래스 문법
이제 객체 생성을 위한 클래스를 만들어봅시다. 여기에 자동차 속도를 조절하는 클래스 Car가 있다고 가정해 봅시다.
# (C++로 쉽게 풀어쓴 자료구조, 프로그램 2.4, p63)
# include <cstdio>
# include <cstring>
# define _CRT_SECURE_NO_WARNINGS
class Car {
protected:
int speed; // 속도(private)
char name[40]; // 이름(private)
public:
int gear; // 기어(public)
Car(){} // 기본 생성자
~Car(){} // 소멸자
Car(int s, char* n, int g) // 매개변수가 있는 생성자
: speed(s), gear(g) { // 멤버 초기화 리스트 (멤버번수 초기화)
strcpy_s(name, n); // 생성자 함수 몸체(name 멤버 초기화)
}
void changeGear(int g = 4) {// 기어 단수를 변경하는 멤버 함수
gear = g;
}
void speedUp() { // 속도를 5씩 증가 멤버 함수
speed += 5;
}
void display() { // 자동차의 정보를 화면에 출력
printf("[%s] : 기어 = %d단, 속도 = %d kmph\n", name, gear, speed);
}
void whereAmI() { printf("객체 주소 = %x\n", this); }
};
1) 클래스 선언
클래스 선언은 "class" 키워드 삽입 후 클래스 이름(Car)를 삽입해 줍니다.
이후 클래스 멤버를 "{ }" 안에 작성하고, 마지막에 ";"를 삽입하며 클래스 선언을 종료합니다.
class Car
{
# (클래스 멤버 삽입)
};
2) 멤버 접근 지정자
클래스의 모든 멤버들은 외부로부터의 접근 허용 여부가 선언되어 있습니다.
멤버 접근 지정자는 아래와 같은 3종류가 있습니다.
① private : 디폴트 값으로서, 클래스 내부의 멤버함수만 접근이 가능하고, 외부로부터의 접근은 불가능함.
② protected : 해당 클래스 및 그 자식 클래스의 멤버함수만이 접근 가능하고, 외부로부터의 접근은 불가능함.
③ public : 외부와의 통신을 위해 공개되어 있어 클래스 내외부에서 모두 접근 가능함.
그렇다면 위에서 자동차의 속도(speed)와 이름(name)은 private로 외부로 공개되지 않고, 기어(gear)는 public으로 공개된 상태라고 볼 수 있습니다.
3) 객체 함수
객체 함수는 객체가 멤버 변수를 이용하여 수행될 어떠한 연산 행위를 묘사한 부분이라고 할 수 있습니다.
멤버 함수로 선언된 객체 함수는 총 4개가 있습니다.
void changeGear(int g = 4) {gear = g;} // 기어 단수를 변경하는 멤버 함수
void speedUp() {speed += 5;} // 속도를 5씩 증가 멤버 함수
void display() { // 자동차의 정보를 화면에 출력
printf("[%s] : 기어 = %d단, 속도 = %d kmph\n", name, gear, speed);
}
void whereAmI() { printf("객체 주소 = %x\n", this); }
4) 생성자와 소멸자
클래스에는 생성자와 소멸자라는 특이한 함수가 존재합니다.
① 생성자(constructor)
생성자는 객체가 생성될 때 멤버 변수에게 초기값을 전달하는 등 초기 작업을 위해 사용됩니다.
위의 코드에서 생성자는 다음과 같습니다.
Car(){} // 기본 생성자
Car(int s, char* n, int g) // 매개변수가 있는 생성자
: speed(s), gear(g) { // 멤버 초기화 리스트 (멤버번수 초기화)
strcpy_s(name, n); // 생성자 함수 몸체(name 멤버 초기화)
생성자 함수의 이름은 클래스 이름과 같아야 합니다. 그래서 생성자의 함수명은 "Car"입니다.
여기서 우리는 "Car(){}"와 "Car(int s, char *n, int g)"이라는 두가지의 생성자를 보실 수 있습니다.
이 중 "Car(){}"를 기본 생성자라고 합니다.
기본 생성자는 클래스 내에 생성자가 하나라도 선언되지 않은 경우에는 컴파일러에 의해 자동으로 생성되지만,
클래스 내에 다른 생성자(ex, "Car(int s, char *n, int g)")가 하나라도 있으면 기본 생성자가 생성되지 않습니다.
이 외에도 필요한 매개변수에 따라 하나의 클래스 안에 여러 개의 생성자(ex, "Car(int s, char *n, int g)")가 공존할 수 있습니다.
② 소멸자(destructor)
소멸자는 생성자와는 반대로 객체가 사라질 때 실행되며, 객체가 소멸할 때 필요한 마무리 작업을 위해 사용됩니다.
사실 소멸자는 클래스 내에서 선언되지 않더라도 컴파일러에 의해 자동으로 생성되므로,
소멸자를 따로 선언하지 않더라도 함수가 종료되면 자동으로 소멸합니다.
소멸자는 하나의 클래스에 하나만 존재하며, 매개변수 또한 가지지 않아 아래와 같이 선언합니다.
~ Car() { cout << "소멸자 실행" << endl;}
참고자료
천인국, 최영규 저(2016), C++로 쉽게 풀어쓴 자료구조, 생능출판
황기태 저(2020), C++ Programming, 생능출판
'자료구조, 알고리즘' 카테고리의 다른 글
| 06. 동적 메모리 (7) | 2023.01.06 |
|---|---|
| 05. 포인터 (4) | 2022.12.30 |
| 03. 배열 (2) | 2022.12.03 |
| 02. 알고리즘 시간 복잡도 함수(2) (1) | 2022.11.24 |
| 02. 알고리즘 시간 복잡도 함수(1) (6) | 2022.11.16 |