[7일차]전처리기 & 조건부 컴파일 Objective-C2010. 5. 14. 21:48
전처리기
1. #define
상수값에 심벌 명을 부여하는 구문
ex) #define 심벌값
#define TRUE 1 -> TRUE 는 이제부터 1,
1을 입력해야 하는 자리에 TRUE 입력가능
2. #import
1)뒤에 나오는 파일을 포함시켜 컴파일 하자는구문
"파일명" : 현재 프로젝트의 디렉토리에서 포함
<파일명> : 시스템 헤더파일디렉토리에서 포함
import 구문이 동일하게 여러번 작성되도 1번만 import 함
3. 조건부 컴파일
1)조건을 만족하는 경우에만 컴파일을 수행
가)#ifdef, 매크로가 있으면 수행
#endif, 종료
#else, 매크로가 없으면 수행
#ifndef
나)#if 와 #elseif
=>조건이 참일때만 컴파일
#ifdef MAC_OS_X // 이 매크로가 있으면
#define DATADIR "/uxn1/data"
#else
#define DATADIR "\usr\data"
#endif
------------------------------------------------
#if OS_API_VERSION(GS_API_MACOSX, GS_API_LATEST)
@class NSError;
@class NSLocale;
@class NSNSURL;
#endif
다) #undef : 매크로 삭제
배열(array)
동일한 크기를 사용하는 멤버들의 집합으로 연속해서 할당 됨.
cocoa에서는 배열을 추천하지 않음.
objective-C에서는 배열은 일반 Stack(변수)으로 취급됨.
메모리 할당이 없음
동적으로 할당할 수 없음. 한번할당하면 크기는 고정
동적할당을 위해서는 포인터를 사용해야 함. ex) int *p;
length 가 없음
1. 선언
자료형 배열명[크기];
자료형 배열명[]={값을나열;}
2. 사용
배열명 : 배열의 시작주소
배열명[인덱스]:요소
3. 개수
sizeof(배열명)/sizeof(배열명[0]) ==> sizeof 는 메모리 크기를 return
4. 문자배열
char 배열명[크기];
char 배열명[] = {'H','E'}; => 2개, %s로는 출력할 수 없음(why? null이 없어서 값을 예측할 수 없음)
char 배열명[] = "He"; =>3개 , 빈공간 하나가 더 있는것으로 인식, 빈공간(null)도 인식
%c : 각 문자 출력
%s : 주소부터 null을 만날때까지 byte 단위로 읽어서 출력
char str1[]={'H','E'};
char str2[]={'1','1','0'};
NSLog(@"%s",str2); 는 출력하지 못함. %c 로 출력하거나 배열의 개수를 지정해서 출력해야 함.
------------------------------------------------
#import <foundation/foundation.h>
int main()
{
int a=10;
char word[] = {'H','e','1','1','0','!'};
char message[] = "Hello!";
int i;
for(i=0; i<6; i++) // -> 좋지 않은 구문, 배열의경계를 숫자로 지정하는건 좋지 않다.
for(i=0; i<sizeof(word); i++) // sizeof(word[0])
{
NSLog(@"%c",word[i]); //문자 출력
}
NSLog(@"%s",word);
NSLog(@"%s",message);
NSLog(@"word의 사이즈 : %d",sizeof(word));
NSLog(@"message의 사이즈 : %d",sizeof(message));
system("pause");
return 0 ;
}
------------------------------------------------
C언어 처럼 함수(전역함수)를 작성해서 사용해도 됨
------------------------------------------------
//test.h
#import <foundation/foundation.h>
//인스턴스는 자신의 맴버만을 호출할 수 있다. ?
//void printMessage()
//{
// NSLog (@"C 언어의 함수");
//}
//int main()
//{
// pintMessage();
// system("pause");
// return 0;
//}
void PrintMessage()
{
NSLog(@"함수호출");
}
@interface Test : NSObject
-(void) Disp;
@end
------------------------------------------------
//test.m
#import "test.h"
@implementation Test
-(void) Disp
{
PrintMessage(); //내 클래스에 있던 NSObject에 있던 있어야 호출이 가능함.
}
@end
------------------------------------------------
//main.m
#import "test.h"
int main ()
{
Test *obj = [Test new];
[obj Disp];
system("pause");
return 0;
}
구조체(Struct)
1. 여러 멤버들을 하나로 묶을수 있는것
2. 멤버들의 사이즈가 달라도 됨
3. 인스턴스 멤버들은 실제로 구조체 형태로 저장됨.
이때 NSObject 으로부터 상속받은 isa라는 멤버를 이용해서 접근제어등을 하게됨
@interface Test :NSObject
{
int a;
double b;
}
@end
가) 선언
Struct 구조체이름
{
자료형 멤버명;
..
}
나) 변수생성
Struct 이름 변수명
다) 멤버 접근
. 을 이용해서 접근. 최우선 연산자이므로 조심해서 사용
->를 이용해서 접근(포인터 변수)
공용체(union)
1. 선언과 사용은 구조체와 거의 동일(예약어가 union)
2. union의 모든 멤버는 메모리를 공유
3. 멤버중 가장 큰 메모리 공간을 사용하는 멤버의 크기가 union의 크기
main 함수의 인수
ansi C 의 main함수원형
ex) int main(int argc, char * argv[])
매개변수 개수 매개변수를 String으로 가지고 있음
argv[0] : 실행파일명
ex) ipconfig -> ipconfig /all : "/all"은 main 함수의 매개변수임
==> cmd 창에서 본인의 프로젝트가 있는 경로로 이동
==> 프로젝트명 매개변수 ... .. ..
------------------------------------------------
#import <foundation/foundation.h>
int main (int argc, char * argv[])
{
NSLog(@"%s", argv[0]);
NSLog(@"%s", argv[1]);
system("pause");
return 0;
}
------------------------------------------------