C와 C#의 가변인자
요새는 파이썬, 자바로 프로그래밍을 접하시는분들도 많아졌습니다.
하지만 저는 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#으로만 개발하고있습니다.
이런부분에서 확실히 생산성이 많이 올라간것을 느끼네요
댓글
이 글 공유하기
다른 글
-
.gitginore 갱신하기
.gitginore 갱신하기
2020.11.13 -
[웹 명함 구축기] 0. 웹 명함 구축 계획
[웹 명함 구축기] 0. 웹 명함 구축 계획
2018.05.30 -
코딩 스타일
코딩 스타일
2018.02.13 -
메서드 체이닝?
메서드 체이닝?
2017.11.19