글 작성자: HEROHJK

요새는 파이썬, 자바로 프로그래밍을 접하시는분들도 많아졌습니다.


하지만 저는 C언어로 프로그래밍을 처음 접했습니다.


(좀 더 정확히 어렸을때 GTA에 Pawno라는 스크립터가 있었는데, 뭐 그것도 C언어 기반이었습니다)


보통 컴퓨터 언어 책을 사면 제일 먼저 해보는게 뭘까요?


바로 화면에 Hello World를 출력하는 프로그램을 만들어보는것입니다.


(개인적으로 이런책은 별로 안좋아합니다. 눈에 확 띄는걸 좋아해서 대부분 바로바로 GUI먼저 익히고, 그 후에 본격적으로 언어공부를 하는 스타일입니다)


C언어에서 Hello World를 출력하는 코드는 다음과 같습니다.


#include <stdio.h>

int main(int argc, char *argv[]){
    printf("Hello World!");
    return 0;
}


여기서 주목해야 할것은 printf라는 함수인데요,


저 코드에서는


"Hello World!" 라는 char *를 인자값으로 넣어줬습니다.


하지만 printf는 얼마든지 인자값이 늘어날 수가 있습니다


printf("number = %d", 30);


이렇게 인자값이 늘어나는것을 보통 가변인자라고 하는데요, 


C나 CPP에서는 이렇게 사용이 가능합니다.


#include <stdarg.h>
void DebugLog(const char* format, ...){
	va_list argptr;
	char debugString[1024];

	va_start(argptr, format);
	vsprintf(debugString, format, argptr);
	va_end(argptr);

	OutputDebugString(debugString);
}


위 예제는 제가 디버그 로그를 확인하려고 제가 전에 간단하게 만들었던 것입니다.


저런식으로 pirntf같이 구현이 가능 해 집니다.


va_list가 저 두번째 매개변수(가변인자 부분)의 "..." 키워드에 대응합니다.


그리고 그 형식은 맨 처음 인자인 format이 되겠죠?


va_start, va_end는 인자를 제어하는 함수이고,


vsprintf가 debugString이라는 문자배열에 형식에 맞춰 출력을 해주는 함수입니다.


그후 OutputDebugString으로 디버그용 문자를 출력하는것이구요.


C#은 이렇게 구현이 가능합니다.


void DebugLog(string format, params object[] values)
{
	System.Diagonostics.Trace.WriteLine(string.format(format,values)));
}


C#은 params라는 키워드로 가변인자를 받습니다.


가변이니 배열의 표시로 [] 를 붙여줍니다.


object는 형태는 모든 자료형을 담을 수 있는 형태이죠.


그 후로는 단순합니다.

System.Diagonostics.Trace.WriteLine이라는 메서드가 C에서 OutputDebugString함수와 같은 기능을 가지고 있습니다.


그대로 출력해주면 끝납니다.


제가 C++ / MFC로 입사하였지만, 요즘은 C#으로만 개발하고있습니다.


이런부분에서 확실히 생산성이 많이 올라간것을 느끼네요

반응형