기반지식/C/C++2010. 6. 15. 22:20
☆ 함수의 중복선언

#include <stdio.h>

void disp(char a)
{
printf("char : %c\n",a);
}

void disp(double a)
{
printf("double : %1lf\n",a);
}


void main()
{
disp('A');
disp('5.6');
}

  - 위 소스는 C에서는 에러가 나지만 C++에서는 에러가 나지 않는다. 
  - error C2084: function 'void __cdecl disp(char )' already has a body 라는 에러가 나는데 이것을 함수의 중복선언이라고 한다.

#include <stdio.h>

void disp(char a)
{
printf("char : %c\n",a);
}

void disp(double a)
{
printf("double : %1lf\n",a);
}

void disp(char *str)
{
printf("string : %s\n",str);
}


void main()
{
disp('A');
disp(5.6);
disp("Choongang Computer");
}

 - 같은 disp라는 이름으로 문자, 숫자, 문자열 함수를 선언해 사용하는 예.

☆ 함수 선언시에 초기값을 주는 예

// 함수의 초기값을 주는 예제. 이것 역시 C++에서만 가능.
// 매개변수 중의 하나에 초기값이 들어갔다면 나머지도 모두 들어가야 한다.


void test(int a, int b=3, int c=5)  <--- 요부분
{
printf("a=%d, b=%d, c=%d\n",a,b,c);
}

void main()
{
test(5);
test(8,9);
test(10,20,30);
}

  - 이것 역시 C에서는 에러가 나지만 C++에서는 가능한 예이다.
  - C++에서는 위와 같은 기능으로 중복선언이 가능하지만, 이 경우 매개변수의 선언 내용이 달라야 한다.

void test(int a, int b, int c=5)
{
printf("a=%d, b=%d, c=%d\n",a,b,c);
}

void test(int s=3)
{
printf("s=%d\n",s);
}

void main()
{
test();
test(5);
test(8,9);
test(10,20,30);
}

  - 이 경우는 test 함수가 2번 정의되어 선언되는데, 첫번째 선언에서는 (초기값 없음, 없음, 초기값 5)로 선언되고 있고, 두번째에서는 (초기값 3)으로 선언되기 때문에 다른 함수로 판단되어 에러가 발생하지 않는다.

void test(int a, int b, int c=5)
{
printf("a=%d, b=%d, c=%d\n",a,b,c);
}

void test(int s=3)
{
printf("s=%d\n",s);
}

void main()
{
test();
test(5);
test(8,9);
test(10,20,30);
}

 - 다만 첫번째의 test 함수 선언에서 초기값이 3인 것이 하나라도 들어간다면 '애매한 중복선언' 에러가 발생한다.

☆ 함수의 선언위치

void main()
{
int sum=0;
for(int i=1;i<=100;i++)
{
sum+=i;
}

printf("sum=%d\n",sum);
}

위 소스는 for 문에서 i를 int로 선언해주고 있는데, 이것 역시 C++에서만 허용되는 형식이다(C에서는 에러가 발생한다).

☆ 열거문(enum)

#include <stdio.h>
#include <conio.h>

void main()
{
// 초기값을 지정하지 않으면 0부터 1씩 증가
// 중간에 값이 없을 경우는 앞의 값 + 1이 됨
enum key{ENTER=13, ESC=27, SPACE=32};
while(1)
{
printf("아무 키나 누르세요 : ");
char a=getch();
if(a==ESC)
printf("\n\tESC 키를 누르셨네요\n");
else if(a==SPACE)
printf("\n\t스페이스 키를 누르셨네요\n");
else if(a==ENTER)
printf("\n\t엔터 키를 누르셨네요\n");
else
printf("\n\t그 이외의 키를 누르셨네요\n");
}
}

  - enum {...} 형식으로, 대괄호 안에 들어간 케이스를 여러 가지 값으로 나열해 갖게 된다.
  - 초기값을 지정해 주었을 때에는 지정된 값으로, 값이 없을 경우는 0부터 시작해 1씩 증가하는 값을 갖게 된다.
  - 위 예제에서는 13, 27, 32가 값이 된다

enum Num{ONE=1, THREE=3, FOUR, FIVE, TEN=10};

  - 값이 들어가다 말았을 경우는 마지막으로 지정된 값에서 1씩 증가하게 된다.
  - 위 예제에서는 1, 3, 4, 5, 10이 된다

☆ typedef

typedef double silsu;
typedef unsigned int jungsu;
typedef char munja;

void main()
{
jungsu a=20;
silsu b=1.2;
munja s[]="apple";

printf("a=%d\n",a);
printf("b=%1lf\n",b);
printf("s=%s\n",s);
}

  - 원래 정해져 있는 자료형 등의 타입을 원하는 이름으로 바꿀 수 있도록 해 주는 것

☆ 배열

#include <stdio.h>
#define N 5

void main()
{
// int a[5]={4,6,7,2,3}; // 예 1) 숫자 생략하면 갯수만큼 자동으로 값을 할당해버린다
// int a[N]; // 예 2) 이렇게 아무것도 주지 않으면 쓰레기 값이 들어간다
// int a[N]={4,6,7,2,3}; // 예 3) 위쪽의 define에서 정해진 10을 다 넣고 모자라는 나머지는 0으로 넣는다
int a[N]; // 예 4)
a[0]=10;
a[1]=13;
a[2]=56;
a[3]=60;
a[4]=70;
printf("a=%d Byte\n",sizeof(a));

for(int i=0;i<N;i++)
{
printf("a[%d]=%d\n",i,a[i]);
}

}

  - 일반 변수 선언하듯이 할 수 있지만 뒤쪽에 []를 붙여 크기를 지정한다(베이직과 비슷함).
  - 예 1) 처럼 뒤쪽에 배열 크기에 맞춰서 일일이 값을 지정해줄 수도 있다. 다만 거의 실제로는 사용되지 않는 방식일듯...
  - 예 4)번이 가장 많이 사용되는 방식일 듯. int a[N]; 과 같은 형식으로 선언한 뒤 식을 통해 배열에 값을 넣는다. (아마 이 부분에 제어문이나 반복문 등을 사용할 수 있을 듯...)
Posted by windship