C++하면 가장 중요한 키워드가 하나 있다. 그건 바로 클래스(Class) 이다.
객체 지향 프로그래밍은 클래스에서 시작했다고 해도 과언이 아니며
오늘은 이 클래스란 것을 들여다볼 예정이다.
아시다시피 해당 내용은 다섯개 챕터로 나눠써도 부족한 만큼 크게크게 요약하여 작성하도록 하겠다.
1. 클래스(Class)?
클래스란 객체에서 불필요한 특성을 제거해 모델링해서 공통된 특성을 하나의 패키지안에 놓은 것이다.
맞다.. 이렇게 생각하면 어렵다. 쉽게 말해서 '구조체의 확장 버전'이라고 생각하면 편하다.
클래스는 구조체와 달리 각 타입별 변수의 집합 뿐만 아니라, 멤버 함수까지 포함되고
접근 제어 지정자를 선언하여 사용 가능하다.
여기서 클래스와 구조체에 차이점을 발견할 수 있는데 접근 제어 지정자를 따로 선언하지 않는다면
- 구조체(struct)는 멤버변수가 public으로 선언되며,
- 클래스(class)에선 멤버변수가 private으로 선언된다.
public과 private에 대해선 아래에서 설명하도록하겠다.
2. 클래스 선언
클래스 이용을 위해선 세가지 구역이 필요하다.
- 클래스 선언 구역
- 클래스 정의 구역
- 클래스 사용 구역
클래스 사용을 위해선 클래스 선언부터 해주어야 한다.
우선 예제 코드를 보자.
class Friend {
//멤버 변수
private: //내부에서만 접근 가능(default라 생략 가능)
int age;
char *name;
//멤버 함수
public: //외부에서 접근 가능
void printInfo(){};
void printInfo2(); //내부 클래스 정의, 외부 클래스 정의 모두가능
};
void Friend::printInfo2() {
}
클래스는 다음과 같이 선언하게 된다. class <클래스명>으로 선언해준다.
이후 접근제어 지정자와 함께 멤버 변수나 멤버 함수를 사용해주면 된다.
멤버 함수는 위와 같이 내부 클래스에서 정의 가능하며 외부에서도 정의 가능하다.
여기에서 꼭 선언한 이후 세미콜론을 붙여주도록 한다.
잠깐, 접근제어 지정자에 대해 짚고 넘어가자.
- public : 공개적 접근, 클래스 밖을 포함해 모든 곳에서 접근 가능하다.
- protected : 클래스가 속한 클래스 내부나 해당 클래스로부터 파생한 클래스 내부에서만 접근 가능하다.
- private (default) : 클래스가 속한 클래스의 내부만 접근 가능하며, 외부 접근 불가하다.
*모든 멤버 변수는 꼭 필요한 경우가 아니면 protected나 private으로 외부 공개 안하는게 원칙이다.
*일반적으로 멤버 변수는 private하며, 이에 안전하게 접근할 수 있는 멤버 함수는 public
3. 객체 생성
객체 생성을 위해선 다음과 같이 사용한다.
- <클래스이름> <객체이름>;
멤버 사용을 위해선 다음과 같은 형태로 사용한다.
- <객체이름>.<멤버변수>;
- <객체이름>.<멤버함수()>;
당연히 초기화도 가능하며 예제로 살펴보자.
int main(void) {
Friend kim;
kim.age = 21; //멤버 변수 초기화, 해당 멤버 변수가 public이여야 직접 변경 가능
kim.printInfo(); //멤버 함수 호출
return 0;
}
Frient 클래스로 kim이란 객체를 생성하고, 안에 age를 초기화해주었다.
해당 부분처럼 age를 직접 초기화하기 위해선 클래스에서 int age가 public이어야 한다.
일반적으로 private에 선언하고 멤버함수로 setInfo()와 같은 함수를 만들어 변경해주는 것이 좋으며
본 예제에선 이해를 위해 위와 같이 작성하였다.
4. 생성자와 소멸자
생성자란 객체가 인스턴스화 될 때 컴파일러에 의해 호출되는 특수 메소드 함수이다.
디폴트 생성자, 매개변수 생성자, 복사 생성자가 존재하며 상황에 맞게 사용하게 된다.
특징은 다음과 같다.
- 생성자는 클래스 이름과 반드시 같아야 함.
- 생성자는 return을 가질 수 없음.
소멸자는 이와 반대로 객체 사용을 마쳤을 때 컴파일러에 의해 호출되는 특수 멤버 함수이다.
특징은 다음과 같다.
- 객체가 유효 범위 벗어날 때 자동 호출
- 클래스 이름 앞에 ~를 붙인다.
여기서 디폴트 생성자와 소멸자는 기본적으로 생성되며,
일반적으로 클래스 내부에서 동적할당 메모리를 할당, 해제할 때 사용된다.
예제를 보며 사용해보자.
#include <iostream>
using namespace std;
class Friend {
//멤버 변수
private:
int age;
const char* fname;
//멤버 함수
public:
Friend(); //생성자
~Friend(); //소멸자
void printInfo(); //내부 클래스 정의, 외부 클래스 정의 모두가능
};
Friend::Friend() {
cout << "생성자 호출" << endl;
age = 24;
fname = "KimJaeHo";
}
Friend::~Friend() {
cout << "소멸자 호출" << endl;
}
void Friend::printInfo() {
cout << "나이 : " << age << ", 이름 : " << fname << endl;
}
int main(void) {
Friend kim;
kim.printInfo(); //멤버 함수 호출
return 0;
}
결과는 다음과 같다.
여기까지 클래스에 대한 공부를 마친다.
클래스에는 이외에도 오버로딩과 더불어 중요한 여러가지 개념들이 더 존재한다.
해당 포스팅에선 여기서 설명을 마치지만 함께 더 공부해봐야 할 것이다.
'Programming > Language' 카테고리의 다른 글
[Assembly] 파일 읽고 출력해보기 (0) | 2020.06.06 |
---|---|
[Assembly] 문자열 입력과 출력 (0) | 2020.06.05 |
[Assembly] 1부터 10까지의 합 계산 (0) | 2020.06.04 |
[C++] STL - multimap 공부 (0) | 2020.05.24 |
[C++] STL - map 공부 (0) | 2020.05.14 |