과연 C로 Class를 만들 수 있을까요?
완벽한 Class를 만들 수는 없지만, 비슷하게 만들 수 있으며 Class와 동일한 역할을 하게 할 수 있습니다. C에서 typedef와 structure 그리고 함수 포인터를 이용하면 class를 따라서 만들 수 있습니다.
여기서 왜 C로 그런 뻘짓을 하냐고 물어보신다면, 이번 챕터에서는 딱히 할말이 생각나지 않습니다. 하지만 분명한 것은 그 뻘짓은 자바를 이해하는데 도움을 주기도 하고 좀 더 효율적은 C프로그램을 가능하게 합니다.
여기서의 예제는 극단적인 C Class입니다. 실제로 이렇게 사용한는 예는 정신이 나간 프로그래머 이외에는 없을 것입니다. 그냥 이렇게 있구나 정도만 이해했으면 좋겠습니다. 이미 알고 있거나 더 좋은 방법이 있다며 댓글을 남겨주세요.
일단 Class 원형이 필요합니다. 보통 Class에는 멤버변수(프로퍼티)와 멤버메소드가 필요합니다. 그리고 접근지정자(protect, private, public)가 있는데, 이부분은 C에세 어떻게 하지는 모르겠습니다.
멤버변수 선언를 미리 해야합니다.
typedef void (*ExecuteSumFunction)(void);
typedef void (*PutNumberFunction)(int number);
typedef void (*PrintSumFunction)(void);
그리고 Class원형을 만듭니다.
typedef struct
{
int sumResult;
ExecuteSumFunction executeSum;
PutNumberFunction putNumber;
PrintSumFuntion printSum;
}Sum;
Class의 원형입니다.
실제 선언은 다음과 같이 할 수 있습니다.
Sum simpleSum;
자바 같으면
Sum simpleSum = new Sum();
위와 같은 방식으로 했을 것입니다.
선언만 하면 소용이 없습니다. 포인터에 주소를 지정해 줘야하며 멤버변수에는 초기화를 해줘야 합니다. 이것이 자바와의 결정적인 차이입니다. 자바에서는 생성자에서 다 해주지만 C에서는 일일히 다 해줘야 합니.
void SimpleSum(void) { ... }
void SimplePutNumber(int number) { ... }
void SimplePrintSum(void) { ... }
위와 같이 미리 메소드를 선언하고 다음과 같이 멤버변수 및 멤버메소드 하나씩 포인터를 지정해줍니다.
simpleSum.executeSum = SimpleSum;
simpleSum.putNumber = SimplePutNumber;
simpleSum.printSum = SimplePrintSum;
simpleSum.sumResult = 0;
실제 실행은 다음과 같이 할 수 있습니다.
simpleSum.putNumber(10);
simpleSum.putNumber(20);
simpleSum.putNumber(30);
simpleSum.putNumber(40);
simpleSum.executeSum();
simpleSum.printSum();
왜 이렇게까지 C로 뻘짓을 해서 Class를 만들까하는 의문은 잠시 접어두세요. ^^
'▶ 이전글 > C Pattern' 카테고리의 다른 글
Observer 패턴 (0) | 2014.10.02 |
---|---|
State 패턴 (4) | 2014.10.02 |
typedef의 활용 함수포인터 (0) | 2014.10.02 |
자바의 객체와 C의 구조체 (0) | 2014.10.02 |
C 패턴을 시작하며 (0) | 2014.10.01 |