본문 바로가기
모바일개발(Mobile Dev)/IOS개발(ObjectC)

멀티태스킹 관련 & C++ basic

by 테크한스 2015. 1. 14.
반응형

from 

http://kapps.co.kr/bbs/board.php?bo_table=m52&wr_id=8&page=2

---------------------------------------------------------------------



가장 큰 변경사항은 멀티태스킹입니다. 이로인해 어플리케이션이 백그라운드로 실행될 수 있기때문에 이와 관련된 메소드들이 많이 추가되었습니다. 백그라운드로 전환되어 대기상태가 될때는 OpenGL ES 메소드를 호출한다거나 네트워크을 사용하지 말아야하며 주소록 같은 시스템 리소스도 해제해야합니다. 많은 메모리를 사용하고 있다면 이역시 해제해야합니다.

만약 메모리와 같은 시스템 리소스가 부족하면 백그라운드에서 실행중인 어플리케이션이 먼저 제거대상이됩니다. 또한 시스템이 어플리케이션이 백그라운드로 전환될 때 메인윈도우를 캡쳐해 놓고 전환시 사용하기 때문에 패스워드같이 민감한 정보는 해당윈도우에서 삭제하길 권장하고 있습니다. 그리고 사용자 설정이 변경될 때 어플이 대응할 수 있도록 필요하다면 관련 통보 메시지를 처리해야 합니다. 이와함께 백그라운드에서 실행되는 어플들이 알려야할 내용이 있을때 사용할 수 있도록 위해 로컬 노티피케이션도 추가되었습니다. 

-----

잘 봤습니다. 저도 멀티테스킹 부분에 관련해서 이것저것 기술문서를 봤는데 아직 좀더 자료를 애플측에서 공개해줄 필요하 있을것 같습니다. 네트워킹 관련해서는 VoIP 형태의 경우에는 HTTPURLRequest가 백그라운드에서 먹는것 같은데... 그보다 더 부하가 적은 패킷통신을 왜 막아 둔지 모르겠내요;; 머 좀더 두고 봐야하겠지만...

-----

iPhoneAppProgrammingGuide, p55에 Begin a Resonsible 에 "When your application moves to the background, and before it is suspended, it should unregister from Bonjour and close listening sockets associated with any network services." 이란 내용이 있는데... 이미 연결되어 있는 소켓에 대한건 된다는 소리 같기도 한데... 본문중에... 

"네트워크을 사용하지 말아야하며 " 

란 구문은 어디에 나와 있는 내용인가요??? 저 구문이 기존의 연결된 네트웍도 안된단 소리인지??? 아 넘 모호한게 많네요...

-----

리스닝 소켓은 포트가 충돌할 수 있으니 닫아야 할 것 같고 제가 저 글을 보고 그렇게 쓴건지 모르겠습니다. ^^;

나중에 찬찬히 다시 문서를 보고 4.0을 설치하게 되면 확인해 보고 수정하겠습니다. 네트워크 전체를 사용하지 못할 것 같지는 않다는 생각은 듭니다.


저작자 표시 비영리 변경 금지

'프로그래밍 > iOS4 추가/변경점' 카테고리의 다른 글

멀티태스킹 관련  (0)2010/06/25
Posted by windship
기반지식/C/C++2010/06/24 21:31
☆ 구조체

  - 배열은 같은 타입의 자료들의 묶음
  - 구조체는 다른 타입의 자료들의 묶음


☆ 구조체 예제 1

#include <stdio.h>
#include <string.h>

/*
struct Student
{
char name[10];
int age;
int score;
};
*/

typedef struct Student
{
char name[10];
int age;
int score;
}ST;

void display(ST s)
{
printf("Name : %s\n",s.name);
printf("Age : %d\n",s.age);
printf("Score : %d\n",s.score);
}

void datain(ST *sp)   // #1. 아래에서 datain(&t); 로 사용되고 있으므로 sp부분에 포인터라는 것을 명시한다.
                              // 값을 return하지 않아도 포인터이므로 변수에 접근할 수 있다.
{
strcpy(sp->name,"송혜교");
sp->age=30;
sp->score=67;
}

void main0()
{
//struct Student s={"이미연",23,98};
ST s={"이미연",23,98};
ST t;
/*
strcpy(t.name,"한은정");
t.age=11;
t.score=90;
*/

datain(&t);     // t는 주소임. 그러므로 포인터로 받아야 한다 (위쪽 #1)


//printf("Student = \%d Byte\n",sizeof(Student));

//출력
/*
printf("Name : %s\n",s.name);
printf("Age : %d\n",s.age);
printf("Score : %d\n",s.score);
*/
display(s);

puts("==============================");

/*
printf("Name : %s\n",t.name);
printf("Age : %d\n",t.age);
printf("Score : %d\n",t.score);
*/
display(t);
}


☆ 구조체 예제 2

#include <stdio.h>

//레퍼런스 변수 : 같은 기억장소에 붙는 또 하나의 이름(별명). C++에만 있다.
//선언 : 데이터형 &변수명

void main()
{
int a=5;
int &b=a;
int *c=&a;
int d=a;

puts("주소 알아보기");
printf("a의 주소 = %d, b의 주소 = %d, d의 주소 = %d\n",&a,&b,&d);

printf("a=%d,b=%d,*c=%d,d=%d\n",a,b,*c,d);

a=3;

printf("a=%d,b=%d,*c=%d,d=%d\n",a,b,*c,d);

b=1;

printf("a=%d,b=%d,*c=%d,d=%d\n",a,b,*c,d);

d=100;

printf("a=%d,b=%d,*c=%d,d=%d\n",a,b,*c,d);

*c=7;

printf("a=%d,b=%d,*c=%d,d=%d\n",a,b,*c,d);
}


☆ 구조체 예제 3

#include <stdio.h>

void change(int &a)      // call by reference<-- a가 레퍼런스이다. 
{
printf("change a의 주소 : %d\n",&a);
a=5;
}

void change2(int a)     // call by value. 값만 받는 것.
{
printf("change2 a의 주소 : %d\n",&a);
a=10;
}

void main()
{
int a=10;
printf("main a의 주소 : %d\n",&a);
change(a);
change2(a);
printf("a=%d\n",a);
}


☆ 구조체 예제 4

#include <stdio.h>
#include <malloc.h>

void write(int *p)
{
for(int i=0;i<3;i++)
{
printf("p+%d의 값 : %d\n",i,*(p+i));
}
}


void main()
{
// 포인터 변수는 자료형에 상관없이 무조건 4바이트이다.

int *p;

// 동적 메모리 할당
// 포인터 변수명 = (자료형 *)malloc(할당받을 바이트 수);
// 메모리 해제 : free(변수명)

// p = (int *)malloc(sizeof(int)*3);

p=new int[3];    // C++에서 동적 메모리 할당하는 방법. 문법은 new 자료형[갯수]
*p=10;
*(p+1)=15;
*(p+2)=20;

write(p);

// free(p); // 메모리 해제. C에서 하는 방식임(C++은 다름).

delete p; // C++의 메모리 해제. 

write(p);
}


☆ 구조체 예제 5

#include <stdio.h>
#include <malloc.h>
#include <string.h>

void main()
{
char *s;

// s=(char *)malloc(sizeof(char)*20);

s=new char[20];

strcpy(s,"Happy Virus!!!");

puts(s);

// free(s);

delete s;

puts(s);
}


☆ 구조체 예제 6 

#include <stdio.h>

#include <iostream.h>

typedef struct Sawon
{
int no;
char name[10];
int pay;
int bonus;
int total;
}SA;

/*
SA datain()       // return을 써서 값을 넘길 때에는 이런 식으로 함
{
SA s;
cout<<"사원번호 :";
cin>>s.no;
cout<<"사원이름 :";
cin>>s.name;  
cout<<"월급여 :";
cin>>s.pay;
cout<<"보너스 :";
cin>>s.bonus;

s.total = s.pay + s.bonus;
return s;
};
*/

void datain(SA &s)     // 변수명으로만 받을 경우 void 타입으로 선언하고 이렇게 매개변수를 정의함
{
cout<<"사원번호 :";
cin>>s.no;
cout<<"사원이름 :";
cin>>s.name; 
cout<<"월급여 :";
cin>>s.pay;
cout<<"보너스 :";
cin>>s.bonus;

s.total = s.pay + s.bonus;
}

void dataout(SA *s)
{
cout<<"사원번호 : "<<s->no<<endl;
cout<<"사원명 : "<<s->name<<endl;
cout<<"월급여 : "<<s->pay<<endl;
cout<<"보너스 : "<<s->bonus<<endl;
cout<<"월수령액 : "<<s->total<<endl;
};

void main()
{
SA s;
// s=datain();            // <-- 이렇게 '='로 받는 것은 return을 써서 값을 넘긴다는 뜻.

datain(s); // 변수명으로만 받고 있다. 

dataout(&s);
}


☆ 구조체 예제 7

#include <stdio.h>

typedef struct Sawon
{
int no;
char name[10];
int pay;
int bonus;
int total;
}SA;

// write() 함수를 사용할 때의 선언 및 정의

//void write(SA *sp)      // #1. 아래와 같이 선언할 수도 있다
void write(SA sp[])              // #2. 이렇게 선언할 수도 있다.
{
for(int i=0;i<3;i++)
{
//(sp+i)->total = (sp+i)->pay + (sp+i)->bonus;   // 위에서 #1처럼 했으면 이렇게 사용
sp[i].total = sp[i].pay + sp[i].bonus; // 위 식과 같은 결과를 가진다. #2처럼 하면 이렇게 사용함

printf("%5d%10s%8d%8d%10d\n",
(sp+i)->no, (sp+i)->name, (sp+i)->pay, (sp+i)->bonus, (sp+i)->total);
}
}

void main()
{
SA s[3]={{1,"송혜교",800000,120000},
      {2,"한은정",900000,50000},
      {3,"이승기",1200000,70000}};

/*  #3. 요 부분을 아래의 write()라는 함수로 대체할수도 있음.
for(int i=0;i<3;i++)
{
s[i].total = s[i].pay + s[i].bonus;

printf("%5d%10s%8d%8d%10d\n",
s[i].no, s[i].name, s[i].pay, s[i].bonus, s[i].total);
}
*/

write(s);        // #3 부분을 write()함수로 만들어서 사용하고 있다.
}


☆ 구조체 예제 8

#include <stdio.h>
#define MAX 5

struct record
{
char name[20], id[20];
float kor, eng, avg;
};

typedef struct record RECORD;

void data_in(RECORD st[ ], int size);
void data_out(RECORD st[ ], int size);
void find_avg(RECORD st[ ], int size);

float sum_k=0.0, sum_e=0.0;

void main()
{
RECORD st[MAX];

data_in(st, MAX);
find_avg(st, MAX);
data_out(st, MAX);
}

void data_in(RECORD st[ ], int size)
{
printf("학번|이름|국어|영어\n");
for(int i=0; i<size; i++)
{
scanf("%s", st[i].id);
scanf("%s", st[i].name);
scanf("%f", &st[i].kor);
scanf("%f", &st[i].eng);
}
}

void data_out(RECORD st[ ], int size)
{
printf("학번|이름|국어|영어\n");
for(int i=0; i<size; i++)
{
printf("%s\t", st[i].id);
printf("%s\t", st[i].name);
printf("%.2f\t", st[i].kor);
printf("%.2f\t", st[i].eng);
printf("%.2f\t", st[i].avg);
}

printf("학과 평균\n");
printf("학과 국어 평균 : %.2f\n", sum_k/MAX);
printf("학과 영어 평균 : %.2f\n", sum_e/MAX);
}

void find_avg(RECORD st[ ], int size)
{
for(int i=0; i<size; i++)
{
sum_k += st[i].kor;
sum_e += st[i].eng;
st[i].avg = (st[i].kor + st[i].eng)/2.0;
}
}


저작자 표시 비영리 변경 금지
Posted by windship
기반지식/C/C++2010/06/23 21:24
☆ 배열과 포인터 예제 1

#include <stdio.h>

void main()
{
int a[5]={3,10,25,30,40};
int *p;

p=a; // p=&a[0] 과 같음

*p=5;
*(p+1)=7;
p++; // p 시작주소를 1칸 이동
*(p+2)=15;
p+=2; // p 시작주소를 2칸 이동
*p=27;


for(int i=0;i<5;i++)
{
printf("a[%d] 의 주소 : %d,%d\n",i,&a[i],p+i);
}

for(i=0;i<5;i++)
{
printf("a[%d] 의 값 : %d,%d\n",i,a[i],*(p+i));
}

}


☆ 배열과 포인터 예제 2

#include <stdio.h>
#define MAX 5

void dataout(int *sp)
{
puts("점수 출력");
for(int i=0;i<MAX;i++)
{
//방법 1
//printf("점수 # %d : %d점\n",i+1,*(sp+i));

//방법 2
//printf("점수 # %d : %d점\n",i+1,*sp++);

//방법 3
printf("점수 # %d : %d점\n",i+1,sp[i]);
}
}

void datain(int *sp)
{
for(int i=0;i<MAX;i++)
{
printf("%d번째 점수 입력 : ",i+1);
scanf("%d",sp+i); // sp가 주소이므로 &는 안 쓴다
}
}

int getsum(int *sp)
{
int temp=0;
for(int i=0;i<MAX;i++)
{
temp+=*(sp+i); //포인터로 배열을 읽어 합계 구하기. sp[i]가 아님!
}
return temp; //값을 리턴하는 시점도 중요함. for문 안에 들어가면 안된다.
}

void main()
{
//int sc[MAX]={67,89,90,56,70};

int sc[MAX],sum;
datain(sc);
dataout(sc);

sum=getsum(sc);
printf("합계 : %d\n",sum);

}


☆ 배열과 포인터 예제 3

#include <stdio.h>

void write(char *s)
{
puts(s);
}


void strupr(char *s)
{
while(*s!='\0')
{
if(*s>='a' && *s<='z')
putchar(*s-32);
else
putchar(*s);
s++;
}
putchar('\n');
}


void strcat(char *a, char *b)
{
while(*a!='\0') // 문자열 a를 NULL문자가 나올 때까지 훑는다
a++;       // *a를 써서 포인터로 받은 문자열 이름은 바로 배열의 첫째칸 변수이기도 하므로 
                            바로 증가시킬 수 있다
while(*b!='\0')
{
*a=*b;
a++;
b++;
}
*a=NULL;
}


void main()
{
char str[]="Have a nice day!!";
char a[20]="apple";
char b[]="banana";

write(str);

strupr(str);
write(str);

strcat(a,b);
write(a);
}


☆ C++에서만 사용할 수 있는 출력양식 (cin, cout)

#include <iostream.h>
#include <iomanip.h>

void main()
{
/*
int age=12;
char name[]="이미자";
double avg=98.7;
*/

int age;
char name[10];
double avg;

cout<<"이름 :";
// cin>>name;
cin.getline(name,10); // <-- 줄단위 입력 가능, 공백도 포함 가능
cout<<"나이 :";
cin>>age;
cout<<"평균 :";
cin>>avg;


// cout<<"이름, 나이, 평균의 순서로 입력하시오\n";
// cin>>name>>age>>avg;

cout<<"이  름 : "<<name<<endl;
cout<<"나  이 : "<<age<<"\n";
cout<<"평  균 : "<<avg<<endl;

cout<<"---------------------------------------------------\n";
cout<<setw(10)<<"이름"<<setw(10)<<"나이"
<<setw(10)<<"평균"<<endl;
cout<<setw(10)<<name<<setw(10)<<age
<<setw(10)<<avg<<endl;
}

ㅇㅇ
저작자 표시 비영리 변경 금지
Posted by windship
기반지식/C/C++2010/06/22 20:20
☆ 배열과 난수를 사용한 예제

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main()
{
int rnd,su,cnt;
char ans;

srand((unsigned)time(NULL));
while(1)
{
cnt=0;
rnd=rand()%100+1; // 1~100 사이에서 난수 발생
while(1)
{
cnt++;
printf("%d회 : ",cnt);
scanf("%d",&su);

if(su>rnd)
printf("\t%d보다 작습니다\n",su);
else if(su<rnd)
printf("\t%d보다 큽니다\n",su);
else
{
printf("\t맞았습니다. 정답은 %d입니다\n",rnd);
printf("계속하시겠습니까? (Y/N):");
fflush(stdin); //바로 입력되어버리지 않게끔 키보드 버퍼의 엔터 입력을 무시
ans=getchar();
if(ans=='y' || ans=='Y')
break;
else
return;
}
if(cnt==10)
{
printf("\t횟수 초과! 맞추지 못했습니다\n");
printf("계속하시겠습니까? (Y/N):");
fflush(stdin);
ans=getchar();
if(ans=='y' || ans=='Y')
break;
else
return;
}
}
}
}

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main()
{
int money;
int lotto[6];
srand((unsigned)time(NULL));
printf("로또를 구입할 금액을 입력하세요 : ");
scanf("%d",&money);
for(int n=0;n<money/1000;n++) // 로또는 1회에 천원이므로 1000으로 나누어 몇 회를 뽑을 것인지 계산한다.
{
printf(" %2d 회 : ",n+1);

//로또 1~45 숫자 구하기
for(int i=0;i<6;i++)
{
lotto[i]=rand()%45+1;
//중복체크
for(int j=0;j<i;j++)
{
if(lotto[i]==lotto[j])
{
i--;
break;
}
}
}

//셀렉션 소트로 정렬
int temp=0;
for(i=0;i<5;i++)
{
for(int j=i+1;j<6;j++)
{
if(lotto[i]>lotto[j])
{
temp=lotto[i];
lotto[i]=lotto[j];
lotto[j]=temp;
}

}
}

//출력
for(int a=0;a<6;a++)
{
printf("%4d",lotto[a]);
}
printf("\n");
}
}

☆ 전역변수와 지역변수
#include <stdio.h>

void write()
{
int a=10;
static int b=10;
printf("auto a=%d,static b=%d\n",a,b);
a+=2;
b+=2;
}

void main()
{
for(int i=0;i<5;i++)
write();
}

  - a는 write() 함수 내에서만 사용되는 지역변수이므로 함수 종료시에 함께 소멸된다. 함수 내에 2씩 누적시키는 처리가 있지만 매번 소멸되어 버리기 때문에 값이 누적되지 않는다.
  - b는 프로그램 시작시에 생성되어 프로그램 종료시에 소멸되는 전역변수이다. 따라서 값이 계속 누적된다.

☆ 포인터와 콜바이 어드레스
#include <stdio.h>

void set(int a)
{
printf("set a의 주소 : %d\n",&a);
printf("함수 a의 값 : %d\n",a);
a=20;
}

// call by address의 예

void set2(int *bp)
{
printf("set2 bp의 주소 : %d\n",&bp);
printf("set2에서 *bp의 값 : %d\n",*bp);
*bp=40;
}

void main()
{
int a=10;
printf("main a의 주소 : %d\n",&a);
set(a);
printf("a=%d\n",a);
puts("======================================");
int b=20;
printf("main b의 주소 : %d\n",&b);
set2(&b);
printf("b=%d\n",b);
printf("main에서 b:%d\n",b);
}

#include <stdio.h>

void getsum(int a,int b,int c,int *s) // ※1
{
*s=a+b+c;
}

void main()
{
int sum,kor,eng,mat;  // ※2
kor=25;
eng=100;
mat=70;
getsum(kor,eng,mat,&sum);
printf("세 과목의 합 : %d\n",sum);
}

  - ※1 부분은 함수의 파라미터이므로 ※2 부분의 변수 선언과는 다르다. 변수 선언은 한번에 모두 자료형을 선언할 수 있지만 함수 선언에서는 일일이 자료형을 붙여 줘야 한다.
저작자 표시 비영리 변경 금지
Posted by windship
기반지식/C/C++2010/06/21 22:20
☆ 문자열 관련 함수

#include <stdio.h>
#include <string.h>
#define pr(x) printf("%d\n",x)
#define prs(x) printf("%s\n",x)

void main()
{

//strcmp(a,b):a==b-> 0, a<b: -1, a>b:1
char s1[10]="apple",s2[10]="banana";
char s3[20];

int a;
a=strcmp(s1,s2);
pr(a);
a=strcmp(s2,s1);
pr(a);
a=strcmp("computer","command"); //p와 m이 비교되어 -1이 나옴
pr(a);
a=strcmp("computer","comp"); //u와 NULL문자가 비교되어 1이 나옴
pr(a);
a=strcmp("apple","apple"); // 마지막 NULL문자까지 비교되어 같으므로 0이 나옴
pr(a);

strcpy(s3,s1); //s1의 내용을 s3에 복사
prs(s3);

strcat(s3,s2); //s3에다 s2의 내용을 덧붙임
prs(s3);

a=strlen(s3); //문자열 s3의 길이를 구함
pr(a);

prs(strupr(s3));
prs(strlwr(s3));
prs(strrev(s3));
}

  - STRCMP : 문자열의 비교
  - STRCPY : 문자열의 복사
  - STRCAT : 문자열의 추가
  - STRLEN : 문자열 길이 구하기
  - STRUPR : 문자열 대문자로 만들기
저작자 표시 비영리 변경 금지
Posted by windship
기반지식/C/C++2010/06/16 22:19
☆ 문자열과 배열

#include <stdio.h>

void main()
{
char s[30]={'O','r','a','n','g','e','\0'};
char s2[]="Apple";
printf("s=%s\n",s);
printf("s2=%s\n",s2);
}

s=Orange
s2=Apple
Press any key to continue

 - char형으로 선언한 30개짜리 배열 s[30]에 문자를 1개씩 넣어서, 그냥 s를 출력하는 것만으로도 문자열을 취급할 수 있다
   (다만 이 경우 30개짜리인데 지정된 문자는 6개 뿐이므로, 마지막에 '\0'을 넣어 문자입력이 끝났음, 즉 문자열의 끝을 알려주어야 에러가 나지 않는다)
 - s2[]의 경우 크기를 정하지 않은 문자열 배열이므로 char s2[]="Apple"; 와 같이 직접 문자열을 넣을 수 있다

☆ 배열을 이용한 문자열의 취급

#include <stdio.h>

void main()
{
char msg[50];
int alpha[26]={0}; //50개짜리 배열 중 26개를 제외한 나머지를 0으로 초기화시킴
int i=0;
puts("영어 문장을 입력하세요");
gets(msg);
while(msg[i]!=NULL)
{
if(msg[i]>=65 && msg[i]<=90) // 소문자라면
alpha[msg[i]-65]++;
else if(msg[i]>=97 && msg[i]<=122) // 대문자라면
alpha[msg[i]-97]++;
i++;
}

puts("== 알파벳의 갯수 ==");

for(i=0;i<26;i++)
{
printf("%c:%d개\t",i+65,alpha[i]);
}
printf("\n");
}

  - 수식을 이용해 배열의 위치를 검사할 때 msg[i - 95]식으로 [] 안에 수식을 쓸 수는 없고, msg[i]-95 식으로 해 주어야 한다
  - 소문자/대문자를 구별할 때 C는 알아서 문자를 아스키 코드값으로 바꾼다(문자형 자료 자체가 내부적으로 아스키 코드값의 정수형으로 취급한다. 이 값을 수식으로 연산하는 것도 가능).


저작자 표시 비영리 변경 금지
Posted by windship
기반지식/C/C++2010/06/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
기반지식/C/C++2010/06/14 22:33
☆ scanf문에서 숫자 변수를 다룰 때에는 번지로 다루기 때문에 항상 숫자 변수 앞에 & 기호를 붙여야함
  - scanf("%d",&val);

☆ if, for, while, switch 등 제어문의 조건식 뒤에는 세미콜론을 붙이지 않는다
  - if(x == 0)
  - for(i=1;i<=100;i++)
  - while(x == 1)
  - switch(year % 12)
  - 붙일 시에는 결과가 달라지거나 오류가 발생한다

☆ 수식에서 나눗셈을 할 경우는 / 연산자를 사용한다. (% 연산자는 나눗셈을 하고 난 나머지를 구한다)

☆ 수식에서 "같다"를 판단할 때에는 = 연산자가 아니라 == 연산자를 사용한다.

☆ char을 이용해 문자열을 선언할 경우는 배열을 이용한다.
  - char ddi[10];  <-- 최대 10글자짜리 문자열변수 ddi를 선언
  - 선언된 문자열 변수에 문자열을 넣을 경우 = 연산자를 사용해 바로 넣을 수는 없다
    ( ddi = "원숭이"; <-- 이런 식으로는 불가능함. strcpy(ddi,"원숭이"); 와 같은 식으로 넣어야 한다)

☆ 함수의 선언에 대해 다시 한번 기억해 둘 것

void init()
{
puts("Shopping List: ");
puts("1. 사과");
        //return;
puts("2. 바나나");
puts("3. 수박");
}


void main()
{
init(); // 위에서 선언한 함수 init를 호출하여 실행
}

  - 함수의 종류
call by name : 매개변수 없이 호출
call by value : 값을 전달하는 함수
call by address : 주소를 전달하는 함수
call by reference : reference를 전달하는 함수(c++)
 ※ 레퍼런스 함수는 c++에만 있음

  - 함수의 문법
리턴타입, 함수명(매개변수1, 매개변수2...)

  - 리턴타입이 void일 경우는 매개변수 필요없음, 리턴값도 필요없음(함수 내에서 return을 써줄 때에도 값이 필요없다)

  - 리턴타입이 void가 아닐 경우는 매개변수가 필요해지며, return을 사용할 때에도 리턴값을 붙여 줘야 한다

  - C는 순차실행이므로, 위 예제에서 init 함수를 main() 다음에 선언해 버리면 에러가 발생한다(선언되지 않은 함수를 main() 내에서 호출했기 때문에). 이 경우는 다음과 같이 할 수 있다.

#include <stdio.h>

void init(); // 아래쪽에 정의된 함수 init를 먼저 선언한다   <-- ※ 중요!
char getalpha(); // 마찬가지로 아래쪽에 정의된 함수 getalpha를 먼저 선언한다

void main()
{
init(); // 위에서 선언한 함수 init를 호출하여 실행
printf("main함수에서 호출 : %c\n",getalpha());
putchar(getalpha());
printf("\n");
}

void init()
{
char s;
s=getalpha();
printf("init에서 호출 : %c\n",s);
puts("Shopping List: ");
puts("1. 사과");
puts("2. 바나나");
puts("3. 수박");
}

char getalpha()
{
puts("알파벳을 보내주마!!");
return 'A';
}

☆ 함수의 선언, 정의, 호출

char getgrade();

void main()
{
int sc;
char gr;
printf("점수?");
scanf("%d",&sc);
gr=getgrade(sc);
printf("%d 점은 %c 학점입니다.\n",sc,gr);
}

char getgrade(int s)
{
char gr;
gr = s <= 100 && s > 90 ? 'A' : s > 80 ? 'B' : s > 70 ? 'C' : s > 60 ? 'D' : 'F';
return gr;
}

 - 함수의 정의내용 중에서 return으로 돌려지는 값의 형태에 따라, 함수의 선언타입을 바꾼다. 위 예제에서는 getgrade의 결과로 돌려지는 gr값이 문자이므로, char로 선언하고 아래쪽 정의의 매개변수에서 (int s)로 정해준다. (색깔에 맞춰서 참조)

 - 사용자 함수가 정의되었을 때에 내부적으로 사용되는 변수는 타입만 같으면 이름은 달라도 상관없다. 값을 넘겨받고 넘겨주기 때문에.


저작자 표시 비영리 변경 금지
Posted by windship
기반지식/C/C++2010/06/10 22:27
☆ Bit 연산자
  - &(and)
  - |(or)
  - ~(not)
  - ^(exclusive or)
  - <<(L_shift)
  - >>(R_shift)
  - 무조건 내부적으로 2진수로 바꾸어서 계산을 한다

저작자 표시 비영리 변경 금지
Posted by windship
기반지식/C/C++2010/06/09 21:49

☆ 표준출력함수
  - putchar : 화면에 문자를 출력
  - puts : 화면에 문자열을 출력
  - printf : 화면에 숫자, 문자, 문자열을 출력

☆ 표준입력함수
  - getchar : 키보드 버퍼에서 문자를 입력받는다
  - getche : 키보드 버퍼를 거치지 않고 문자를 입력받는다(입력받는 문자를 보여줌)
  - getch : 키보드 버퍼를 거치지 않고 문자를 입력받는다(입력받는 문자를 보여주지 않음)
  - gets : 키보드 버퍼에서 문자열을 입력받는다
  - scanf : 키보드 버퍼에서 숫자, 문자, 문자열을 입력받는다

☆ scanf 함수의 특성
  - scanf는 입력받는 문자열에 공백이 들어가 있으면 인식하지 못한다.
  - 공백이 들어가야 할 경우는 gets 함수를 대신 사용하는데, 이 경우는 fflush(stdin); 명령으로 키보드 버퍼를 미리 비워주고 사용해야 한다. gets 함수를 한번 사용할 때마다 fflush도 한번씩 계속 나와줘야 함.

☆ getch, getche 함수는 stdio.h 헤더에 들어있지 않기 때문에 이 함수들을 사용하려면 conio.h 파일을 인클루드해야 한다.

☆ goto문
  - 실행위치를 점프하기 위해 사용(basic과 비슷)
  - 점프 위치를 지정하기 위해 레이블을 선언한다(끝에 :을 붙여서 구별)

☆ return();
  - 함수를 종료하기 위해 사용
  - 함수 안에서 반복이 되는 경우 빠져나오기 위해서 사용하기도 한다
  - int 함수인 경우 return 뒤에 종료값이 정수로 붙어야 한다
  - main 함수일 경우는 타입이 void이므로 종료값이 없어도 된다(그냥 return;으로 끝남)

☆ 증감연산자

        a=3;
printf("a=%d\n",a++); // 출력 후에 증가
printf("a=%d\n",a);
printf("a=%d\n",++a); // 증가 후에 출력

  - 연산우선순위와 방향이 중요함
  - printf() 명령 안에 들어 있지만 명령어와 상관 없이 변수의 연산자 순위대로 작동한다.

☆ 증감연산자
#include <stdio.h>
#define pr printf
//조건연산자(삼항연산자) : 조건문?참일때값:거짓일때값
//간단한 if문에 해당되지만 출력문에서도 사용가능하다는 점이 다르다.
void main()
{
int x,y,max;
printf("두 숫자를 입력하세요:");
scanf("%d%d",&x,&y);//엔터나 스페이스로 구분하여 x,y 2개를 동시 입력한다
max=x>y?x:y;

printf("큰 값은 %d입니다.",max);
pr("첫번째 수가 더 %s\n",x>y?"큽니다":"작습니다");
}


반응형