C++ 은 객체지향 프로그램으로 클래스를 사용해서 프로그래밍을 한다.
객체지향프로그래밍의 대표인 자바와 닮은 점도 있고 다른 점도 있다.
자바와 C++ 어떤 것을 먼저 접했느냐에 따라서 C++의 클래스를 대하는 방식에 차이가 있을 수 있는데, 필자는 꽤 오래전에 자바를 먼저 시작했기 때문에 C++의 class 문법이 낯설었던 경험이 있다.
예를 들어 자바에서 인스턴스는 지역변수로 선언할 수 없는데 C++에서는 가능하다. 자바의 프로그램은 클래스 단위로 실행되는데 모든 객체는 Object 클래스로 부터 상속을 받고 시작하니 모든 프로세스가 말 그대로 객체를 지향한다. static 메서드를 사용할 수 있긴 하지만 클래스 자체를 동적 메모리에 할당하지 않고 사용할 수가 없다.
반면 C++의 클래스는 C언어의 구조체와 구조체를 사용하는 함수를 묶어놓은 것 같다. 원래 구조체가 동적 할당이 없어도 사용가능했던 것 처럼 바로 지역변수에서 사용이 가능하고 심지어 전역변수에서 생성자가 호출된다.
클래스는 개념이 어렵기 때문에 전문 강좌를 듣는 편이 좋다고 생각한다. 객체지향의 개념 자체는 자바나 C++ 이나 유사하니까 어느 쪽을 들어둬도 상관은 없다. 유튜브에는 자바의 정석 남궁성 님이나 생활코딩이라던지 퀄리티가 좋은 무료 강좌가 많으니까 충분히 활용을 할 수 있을 것이다.
아니면 대학 공개 강의 사이트를 이용해도 좋다. 좀 시간이 지난 강의가 올라오지만 C++의 클래스 강의는 변할게 없다.
대학 공개 강의 사이트 이용하기 KOCW | 무료 대학교 프로그래밍 강의 추천 (tistory.com)
그럼 C++의 클래스를 작성해보자.
파일을 하나로 작성하려면 main 함수 위에다가 작성해야 하는데 웬만하면 헤더파일에 분리해서 작업하는게 좋다.
#include<iostream>
class Cat
{
public:
unsigned int Age;
unsigned int Weight;
void Play();
};
void Cat::Play(){
std::cout << "MEOW~\n";
}
새로운 문법을 보면 막막할 수 있는데 하나씩 뜯어보면 어려울게 없다.
클래스를 선언하는 키워드는 class 이다. public: 아래에 있는 것은 외부에서 이 클래스 안의 정보에 접근이 가능하다는 표시다. 이를 접근제어자라고 한다.
{ } 중괄호가 없어도 이 아래 있는 것들은 public의 속성을 갖는다. { } 코드블록 처럼 하나의 블록안에 들어가 있는 것이다. public 과 반대 속성을 가진 private 이 있기 때문에 서로 구분이 된다.
void Play(); 는 함수처럼 생겼다. 맞다. 클래스의 함수를 메소드라고 한다. 이 클래스의 인스턴스만 사용할 수 있기 때문에 메소드라고 한다. 메소드를 클래스 안에 선언만 하고 바깥에서 저렇게 Cat::Play 라는 방식으로 정의할 수가 있다. Cat 은 클래스이고 Play 는 Cat의 메소드이다.
클래스의 개념을 설명하면 매우 길어지고 장황해지지만 문법을 보면 구체적으로 알 수 있다.
누가봐도 Cat 고양이를 하나의 데이터로 정의한 모습이다. 고양이의 나이와 몸무게를 넣었고 Play 라는 메소드는 그 고양이가 하는 행동(기능)을 넣은 것이다.
C언어라면
typedef struct myCat {
unsigned int Age;
unsinged int Weight;
} Cat;
void CatPlay();
이렇게 되어 있었을 것이다. 이 둘을 하나로 묶은 것이 클래스이다.
다음은 메인 함수에서 실행시켜본다.
* 예제 코드
#include "Cat.h"
using namespace std;
#define Line cout << "\n-------------------------------" << endl;
int main(int argc, char const *argv[])
{
Cat Nyang2;
Line;
Nyang2.Age = 5;
Nyang2.Weight = 7;
cout << "Age : " << Nyang2.Age << endl;
cout << "Weight : " << Nyang2.Weight << endl;
Nyang2.Play();
return 0;
}
Cat 은 class이다. 클래스는 사용자 정의 타입(type)이다. C의 구조체에서 사용했던 것 처럼 프로그래머가 정의해서 사용한다.
. 도트 연산자를 사용해서 클래스의 변수와 함수에 접근할 수 있다. main 함수는 Cat 클래스에게 외부이다. public을 사용하면 외부에서 Cat에게 접근이 가능하다는 것이다.
클래스 안에 들어있는 변수를 멤버 변수, 함수를 메소드라고 부른다. 데이터와 동작코드 이 두 개로 클래스는 생성된다. 정말 간단하지만 이게 또 나중에 가면 다형성이라던가 추상 클래스라던가 많이 복잡해진다.
이 문서에서는 클래스의 선언에 대하여 알아봤다.