C로 Class 억지로 만들기

과연 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