class를 사전에 검색하면 수업, 강의, 계층, 등급을 뜻한다고 한다. 프로그래밍 언어에서 class는 뜻이 조금 다르다. 클래스를 배우기 앞서 구조체에 대해 공부해보자
구조체는 여러 개의 변수를 묶어서 관리하는 방법이다.
struct Person {
char name[20]; // 이름
int birth; // 생년월일
};
Person Momo = { "momo", 19961109 };
Person Sana = { "sana", 19961229 };
이런 식으로 사용할 수 있다.
이제 이 데이터를 받아 춤을 추는 함수를 구현해보자
void dance(Person person) {
cout << person.name << "가 춤을 춥니다" << endl;
}
dance(Momo);
dance(Sana);
근데 이 함수는 사실 이 Person 구조체에 관련된 함수이다. 이 함수 또한 묶을 수 없을까?
Person {
char name[20]; // 이름
int birth; // 생년월일
void dance() {
cout << name << "춤을 춥니다" << endl;
}
};
Person Momo = { "momo", 19961109 };
Person Sana = { "sana", 19961229 };
Momo.dance();
Sana .dance();
C언어에서는 불가능했지만 C++에서는 가능하다. 근데 여기서는 struct라는 의미가 좀 커져버렸다. 그래서 C++에서는 이러한 데이터와 함수의 집합을 stuct 대신 class라고 부르기로 했다. 그리고 C++에서는 struct로 구현, 선언하더라도 컴파일하는 동안 class로 변환시켜버린다.
오늘은 클래스의 필요성에 대해 간단히 설명해보겠다.
동일한 프로그램을 여러 개 실행시키면 여러 개의 프로세스가 되어 운영체제에서 실행 중인 상태가 된다. 각 프로세스는 다른 메모리 공간을 이용하며 같은 프로그램이지만 다른 용도로 사용된다. 하지만 분류로 따지면 같은 프로그램이다. 아래처럼 엑셀을 여러 개 실행시켜보자. 각 엑셀 프로세스는 다른 용도로 사용 중이지만 결국 엑셀은 엑셀이다. 하지만 지원하는 기능은 동일하다.
여기서 엑셀 프로그램은 클래스를 의미하고 실행 중인 프로세스는 객체를 의미한다.
지금까지 구현했던 프로그램은 위에서부터 아래로 코드를 실행했다. 이 프로그램을 우리가 사용하는 윈도우라는 운영체제라고 생각해보자. 운영체제는 여러 개의 프로그램을 실행시키고 관리한다. 만약 우리가 하나의 프로그램을 실행시킨다면 이전처럼 프로그램을 구현해도 문제가 없다. 하지만 우리가 엑셀 작업 중인데 실시간으로 인터넷에서 카카오톡 메시지를 받아오고 알림을 준다면 코드를 한 줄씩 실행할 수 없다. 하지만 이렇게는 구현할 수 있다. 실행 중인 엑셀, 카카오톡(프로세스)에게 어떻게 할지 지시만 하고 난 다른 작업을 할 수 있다.
1. 카카오톡에게는 실시간으로 카톡 메시지를 받으면 알림을 주고 디비에 저장해
2. 엑셀은 실행시킨 파일에 대해 1분 간격으로 작업 중인 데이터를 저장해 (여러 개 엑셀 파일을 실행시킬 경우 독립적으로 저장해야 한다)
객체지향 프로그래밍은 이처럼 클래스를 통해 객체를 만든 뒤 어떻게 할지만 구현해놓고 작업 명령만 던져 놓으면 된다. 절차 지향 프로그래밍은 메인코드 안에 1분마다 기다리다가 작업 중인 파일을 저장하고, 메시지가 오면 확인하여 알람을 주는 코드를 모두 구현해야 한다. 이러한 방식은 작업 중인 파일이 많아지면 코드가 매우 복잡해지고 여러 명이서 개발하기가 쉽지 않다. 모든 코드를 메인 함수에 모아서 순서대로 실행하도록 구현해야 하기 때문이다.
다른 장점을 알아보자
엑셀에 자주 쓰는 업무를 하는 사람이 필요할 때마다 엑셀 파일을 실행하고 데이터를 작성하고 저장하는 방법은 매우 느리고 비합리적이다. 컴퓨터를 종료하기 전까지 계속 켜놓고 필요할 때마다 데이터를 저장하고 읽는 것이 더 적합하다.
안드로이드 앱을 개발한다고 가정하자. 안드로이드는 기본적으로 sqlite라는 데이터베이스에 데이터를 저장하고 읽는다. 그런데 네트워크에서 메시지가 올 때마다 데이터베이스를 열고 받은 메시지를 저장하고 쓴다고 생각해보자. 그러면 우리는 코드를 다음과 같이 구현할 수 있다.
메시지를 받으면 -> 데이터베이스를 열고 -> 쓰고 -> 저장하고 -> 닫아
근데 데이터베이스를 열고 닫는 작업은 매우 느리다. 한 번만 열고 앱을 종료할 때까지 읽고 쓰고 싶다. 객체지향으로 구현하면 이 방법이 가능하다.
만약 다른 함수에서 디비를 사용하고 싶다면 함수 호출 시 인자로 dbManager를 건네주면 된다.