'C++'에 해당되는 글 9건
- 2008/07/12
- 2007/12/08
- 2007/11/17
- 2007/11/10
- 2007/11/06
- 2007/11/04
- 2007/09/02
- 2007/08/29
- 2007/08/29
프로젝트명 : RAD Tool for Win32 API
수행 기간 : 2008.8~2009.12
군 기간 중 약 3번의 정기 휴가(총 30일) 간 수행할 예정
사용 언어 : C++/MFC
계획중인 기능
- Win32 API 코드를 읽고 그에 따른 디자인을 해 주는 기능
- 직접 GUI를 통한 직관적인 디자인을 하면 그에 따른 Win32 API 코드를 생성해주는 기능
- 윈도우 프로그래밍을 하는 방법은 여러 가지가 있지만 그 중 대표적인 방법으로 Win32 API 를 이용하는 방법이 있다. 그러나 그 방법이 직관적이지 않고 수많은 함수들을 사용해서 일일히 작성해야 하므로 그 강력함 만큼 불편한 점이 있다.
이를 극복하기 위하여 다양한 방식의 윈도우 프로그래밍 기술이 나왔는데 MFC 등의 방법도 생겼고, RAD(Rapid Application Development) Tool을 이용하는 방법도 있다.
특히 Visual Basic, Delphi 등으로 대표되는 RAD 툴의 경우, 직관적인 디자인 방식을 제공하기 때문에 높은 생산성을 보여주지만 그만큼 기능상의 한계도 가지고 있다.
그래서 이번 프로젝트에서 API 코드를 읽어서 그에 따른 디자인을 화면으로 보여 주고 또한 직접 디자인 하면 코드를 생성해 주는 방식의 프로그램을 만들어 보고자 한다.
Int Class에 이어 이번에 만들어 본 것은 String Class. C/C++에서의 문자열 처리를 보완하기 위하여 만들어 본 클래스이다. VB나 기타 다른 언어의 String형과 비슷하게 만들어 보았다.
구현한 것은 다음과 같다.
1. Constructors/Destructor
2. Adding Operator(+)
3. Equal Operator(==)
3. Assignment Operator(=)
4. Lenght Method
5. Standard IO Interface
이렇게 나열하고 보니 몇가지 구현해보고 싶은게 많이 생기네.. Mid,Left,Right Method나 != Operator 같은것들.. 뭐 다음 기회로 미루자.
int Class 만들때보다 연산자 오버로딩을 좀 더 익숙하게 다룬 것 같다. 다음에 만들어 볼 것은 Matrix Class.
String.cppClass_String
솔직히 말해서 C++은 공부를 거의 문법 스펙을 읽기만 하고 실제로 짜본건 거의 없었다. 한떄는 C보다 C++을 훨씬 많이 하곤 했었는데 지금은 거의 C로만하니 당연히 까먹을 수밖에.
거기다 이번에 하드디스크 데이터를 날려먹으면서 그동안 연습해왔던 C++코드까지 다 잃어버려서 새로 시작하자는 의미로 하나 하나 클래스 몇개를 만들어 보기로 했다.
그 첫번째로 우선 Integer Class를 구현해 보았다. 기본 데이터 타입인 int를 직접 만들어 본 것. 역시 많이 버벅대었다. 제대로 되었는지도 잘 모르겠고. 특히 멤버의 생성과 소멸 부분에서 많이 헤매었고 연산자 오버로딩 부분도 아직 잘 모르겠다.
구현한 것들은 다음과 같다.
1. Constructor//Destructor
2. Assignment Operator
3. Relationship Operator
4. Arithmetic Operator
5. Array Operator
뭐 대부분이 연산자와 관련된 부분이지만 실제 필요한 부분은 거의 넣은 것 같다. 많이 부족하지만 앞으로 많이 공부해 봐야지.
다음 구현할 것은 String Class. 힘내자.
Class_Int.cppInteger_class
#include <iostream>
using namespace std;
class Example
{
public:
Example()
{
x = 3;
}
friend void Show(Example &ex);
private:
int x;
};
void Show(Example &e)
{
cout << "x is : " << e.x << endl;
}
int main(void)
{
Example ex;
Show(ex);
return 0;
}
우선 Show라는 함수의 정의 부분을 보자. 일반 멤버 함수의 정의와는 달리 Example라는 클래스에 있음에도 Example :: 이런 식으로 스코프(Scope)를 해 주지 않았다. 그럼 위로 올라가 Example클래스의 Show함수의 선언을 보자. 특이한 키워드가 붙어 있을 것이다. friend 이 키워들를 붙이면 Show라는 함수는 이 클래스의 멤버 함수가 아니게 된다. 굳이 구분하자면 전역 함수쯤 될 것이다.
main함수 안에서 Show의 사용을 보자. ex.Show()가 아닌 그냥 Show()로 불러 들였다. 그리고 인자를 보면 ex라는 객체를 레퍼런스로 넣었다. 외부 함수라는 것이다. 그런데 실행을 해 보면 신기하게 ex라는 객체에 private로 선언되어 있는 멤버 변수 x의 값을 불러 온것을 알 수 있다. 즉 friend 함수는 예외적으로 클래스 내부의 멤버에 접근 할 수 있게 해 주는 역할을 한다.
우선 C에서 거짓은 0으로, 0이 아닌 값은 모두 참으로 인식한다. 0은 거짓이 확실하지만 참은 굳이 1이 아니어도 된다는 말. 1을 하는 이유는 그냥 보편적이기 때문이다. 단, 다른 언어에서는 종종 보이는 true와 false라는 것을 표현해주는 데이터형이 C에는 없다.
bool형은 이런 것을 보완하기 위해 C++에서 새로 나온 것이다.
bool ex = true; //ex에는 true가 대입
ex = !ex ; //ex에는 false(!true)가 대입
ex = (ex == false); //ex에는 true가 대입
물론 이런식으로도 가능하다.
bool ex = -123; // true 대입
bool ex = 0; //false 대입
다시 한번 체크하자. 참은 굳이 1일 필요가 없다. -123처럼 음수라도 0만 아니면 참이 된다.
하지만 bool을 출력한다고 하면 이야기는 달라진다. 다음 소스를 보자
bool ex = true;
cout << ex << ',';
ex = false;
cout << ex;
출력 : 1,0
즉 출력을 하면 false는 0, true는 1로 출력이 된다. 하지만 좀더 명확하게 true 또는 false로 표현해줄 필요가 있다. 그럴떄는 이렇게 하면 된다.
cout << boolalpha;
cout << true << endl;
cout << false << endl;
cout << boolalpha로 해주면 true 또는 false로 출력을 해준다.
참고로 C99에서는 bool형을 지원한다.
혹시 이런 생각 해본적 있는가? 보통 함수의 인자의 개수는 정해져 있는데, printf함수 같은 경우는 그 수가 제한이 없지 않은가?
예전에 이런 것과 관련해서 함수 하나를 구현할 일이 있었는데 미루다 미루다 이제야(한 일주일 된듯 -_-;;) 한번 찾아 보았다.
먼저 printf 함수 원형을 한번 보자
int printf(const char*,...);
이렇게 되어 있다. 사실.. 이거는 컴파일러가 'printf(' 여기까지만 치면 원형을 보여주는데 쓸데없이 stdio.h를 열어보는 뻘짓까지 했다 ㅋ
한번 분석해 보자.
우선 printf의 리턴 데이터 형식은 int형이였다. 이 함수의 리턴값은 출련한 변수의 갯수이다. 예를 들어 ("%d,"%d",a,b)했으면 리턴 값은 2.
그리고 첫 번째 인자는 우리가 "name %s\b"하는 이런 거고.. 중요한 것은 두 번째 인자 '...'이다. 인자를 생략한다는 표시인데, 이 표시를 통해서 함수 호출 시 인자를 얼마든지 넣을 수 있게 된다. 그것을 처리하는 것은 원형에서 해줄 몫이고.. 그리고 이것을 '가변 인수'라고 한다. 뭐 자세한 사용법은 알아서 공부해볼것, 이건 대충 사용법만 보고 거기에서 합계 구하는 예제 있길래 안보고 만들어 본 것. 이해 자체는 그리 어렵지 않은데.. 음 좀더 공부해 봐야지.
#include
#include
int GetSum(int Num,...)
{
va_list ap;
va_start(ap,Num);
int arg;
int i;
int Sum = 0;
for(i = 0 ; i < Num ; i++)
{
arg = va_arg(ap,int);
Sum+= arg;
}
va_end(ap);
return Sum;
}
void main()
{
printf("%d\n",GetSum(10,1,2,3,4,5,6,7,8,9,10));
}
참, 참고로 C#에서는 가변 인수를 사용하는 방법이 따로 지원한다. 이것보다 더 쉽게.. (맞나?) 그때는 이게 말 뜻 자체도 이해가 안되다가 아! printf! 해서 이해만 하고 그래서 뭘 만들어볼까할때 아이디어가 생각이 안나 넘어갔는데.. 이렇게 다시 해볼 기회가 생겨서 다행이다. 뭐 이거 찾다가 VB에서도 가변인수 쓸수 있다는거 알았고, VB,C# 둘다 연습해 봐야겠다 함.. 그리고 C/C++에서도 계속 공부하고..