클래스
25-4-가.class
C++의 구조체는 멤버 함수를 포함할 수 있다는 면에서 C의 구조체에 비해 의미가 확장되었다. 이형 타입 변수의 집합인 구조체가 스스로의 동작을 정의할 수 있다는 것은 아주 중요한 의미가 있으며 객체 지향 구현을 위한 첫 걸음이라 할 수 있다. C++의 창시자인 스트로스트룹은 확장된 의미의 구조체에 뭔가 멋있고 새로운 이름을 붙여 주었는데 그것이 바로 클래스이다. 구조체라는 용어를 그냥 사용해도 별 문제는 없겠지만 C의 전통적인 구조체와 C++에서 확장된 구조체의 차이를 명확하게 구분하고 싶었고 그래서 이름을 바꾼 것이다.
별도의 이름을 붙였다는 것은 언어 창시자가 일종의 애정 표현을 한 것이다. 결국 OOP의 핵심이라고 할 수 있는 클래스는 "확장된 구조체"로 간단하게 정의할 수 있다. C의 전통적인 구조체는 타입이 다른 변수의 집합이며 C++의 확장된 구조체, 즉 클래스는 여기에 함수를 더 추가한 것이다. 구조체 선언문에서 struct 키워드를 class라는 새로운 키워드로 바꾸기만 하면 클래스가 된다. 앞 절에서 만들었던 확장된 구조체 Position을 클래스로 다시 선언해 보자. struct 키워드를 class로 바꾸고 선언문 선두에 public: 액세스 지정자만 추가하면 된다.
class Position
{
public:
int x;
int y;
char ch;
void OutPosition();
};
Pos2, Pos3의 예제를 이렇게 수정해도 잘 실행된다. 확장된 구조체와 클래스의 유일한 차이점은 멤버에 대한 디폴트 액세스 지정뿐이다. 구조체는 멤버 함수를 가질 수 없는 것으로 잘못 아는 사람들이 있는데 그렇지 않다. 구조체도 멤버 함수, 생성자, 파괴자를 가질 수 있고 상속도 가능하며 클래스가 쓰이는 모든 곳에 쓸 수 있다. 단지 아무런 액세스 지정없이 멤버를 선언할 때 이 멤버에 어떤 액세스 지정이 적용되는지만 다를 뿐이다. 다음 코드를 보자.
struct S { int x; .... }; S s; s.x=1234; // 가능 |
class C { int x; .... }; C c; c.x=1234; // 에러 |
아무런 액세스 지정없이 멤버 변수 x를 선언했다. 이 경우 구조체의 멤버 s.x는 public 속성을 가지며 외부에 공개되는데 비해 클래스의 멤버 c.x는 private 속성을 가져 외부로부터 숨겨진다. 구조체의 디폴트 액세스 지정은 public이고 클래스의 디폴트 액세스 지정은 private이다. 클래스는 객체의 안전성을 위해 외부에서 함부로 값을 건드리지 못하도록 멤버를 숨기는 경향이 있는데 비해 구조체는 가급적이면 멤버를 공개하는 경향이 있다. 구조체의 디폴트 액세스 지정이 public일 수밖에 없는 이유는 C언어와의 호환성을 유지해야 하기 때문이다. C에서 구조체의 멤버는 외부에서 자유롭게 액세스할 수 있으므로 C++의 구조체도 당연히 그렇게 해야 한다.
물론 디폴트가 그렇다뿐이지 양쪽 모두 명시적인 액세스 지정자로 멤버의 공개 여부를 변경할 수 있다. 다음 두 쌍의 선언문이 완전히 동일하다는 것을 확인하도록 하자. 디폴트 액세스 지정을 private로 바꾼 구조체는 클래스와 동일하며 반대로 디폴트 액세스 지정을 public으로 바꾼 클래스는 구조체와 동일하다. 이 외에 구조체와 클래스는 어떠한 차이점도 없다.
전통적인 구조체의 의미를 확장하면서 자연스럽게 클래스라는 새로운 개념을 소개하는데 이는 이미 알고 있는 구조체의 지식을 기반으로 클래스에 좀 더 쉽게 다가가도록 하기 위한 의도이다. 두 용어가 비록 의미는 같지만 지금부터는 멤버 함수를 가지는 확장된 구조체를 클래스로 부르기로 한다. 이미 습득한 구조체에 대한 문법, 예를 들어 .연산자, -> 연산자, 구조체 대입, 중첩 구조체 등도 클래스에 그대로 적용되며 이후 배우게 될 상속, 다형성, 연산자 오버로딩 등 클래스에 적용되는 모든 이론과 문법은 구조체에도 동일하게 적용된다.
클래스를 선언하는 문법은 다음과 같다. 구조체 선언문과 비슷하되 struct 키워드 대신 class 키워드를 사용하고 멤버 선언문 중간 중간에 액세스 지정이 온다는 것만 다르다. 구조체와 마찬가지로 선언문의 제일 끝에 세미콜론이 반드시 있어야 한다는 점을 주의하자. 문장 끝이 세미콜론으로 끝난다는 것은 C문법의 가장 기초에 해당하지만 숙련된 프로그래머도 실수하는 경우가 많다.
class 이름
{
액세스 지정:
멤버 변수;
멤버 함수;
....
}; // 여기 세미콜론을 빼 먹지 말자!
구조체와 마찬가지로 멤버 개수에는 제한이 없으며 필요한만큼 얼마든지 많은 변수와 함수를 멤버로 포함할 수 있다. 멤버의 타입에도 물론 제한이 없다. int, long, double 등의 기본형 변수는 물론이고 배열, 구조체 등의 유도형과 다른 클래스형의 변수까지도 멤버로 포함될 수 있다. 구조체끼리 중첩이 가능하듯이 클래스끼리도 중첩 가능하고 열거형, typedef 등의 타입 정의도 포함될 수 있다. 확장된 구조체와 클래스는 사실상 같지만 관행상 멤버 함수를 가지는 경우는 클래스로 선언하는 것이 일반적이다.
http://winapi.co.kr/
'WORK > Sotfware' 카테고리의 다른 글
#pragma comment ..........? (0) | 2008.06.08 |
---|---|
[통신]시리얼 통신 프로그램 관련.. (0) | 2008.06.08 |
다중 쓰레드와 C++ (0) | 2008.06.02 |
Serial Port - RS232C (0) | 2008.06.02 |
AfxBeginThread 사용하기 (0) | 2008.06.02 |
댓글