달력

10

« 2024/10 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2010. 5. 14. 21:48

[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;
}
------------------------------------------------

:
Posted by 에너지발전소
2010. 5. 13. 21:21

[6일차]매개변수가 있는 @selector Objective-C2010. 5. 13. 21:21


매개변수가 있는 경우의 @selector(메서드): 형태로 정의하고 매개변수를 받아서 실행할때는
performselector : @ selectro(메서드) : withobject : 매개변수의 형태로 호출합니다.
매개변수에 인스턴스가 아닌것을 대입하게 되면 실행시 에러가 발생합니다.

ex>----------------------------------------------------------------------------------------
#import <foundation/foundation.h>
#import <stdio.h>

@interface Test : NSObject
{
   @public
      int n;
}
-(id)init:(int) a;
-(void)Disp:(Test*)Temp;
-(void)Print:(Test*)Temp;
@end

@implementation Test
-(id)init:(int)a
{
   self = [super init];
   if(self !=nil)
      n=a; //return self
}
-(void)Disp:(Test*)Temp
{
   NSLog(@"%d",++(Temp->n));
}

-(void)Print:(Test*)Temp
{
   NSLog(@"%d",--(Temp->n));
}
@end

int main()
{
  Test *obj = [[Test alloc]init:5];
  int  sel;
  NSLog(@"숫자를 입력하세요 1.Disp 2:Print");
  scanf("%d",&sel);
  SEL dele; //SEL타입의 변수 선언
  if(sel==1)
     dele=@selector(Disp:);
  else
     dele=@selector(Print:);
 
  [obj performSelector:dele withObject:obj];
  system("pause");
  return 0 ;
}  
----------------------------------------------------------------------------------------

extern   
ex)
----------------------------------------------------------------------------------------
//test.h
#import <foundation/foundation.h>

@interface Test : NSObject
-(void)setGlobal:(int)val;
@end

----------------------------------------------------------------------------------------
//test.m
#import "test.h"

@implementation Test
-(void)setGlobal:(int)val
{
   extern g_value; //외부에 있는 g_value를 사용
   g_value = val;
}
@end
----------------------------------------------------------------------------------------
//main.m
#import "test.h"
int g_value = 10;

int main()
{
   Test *obj = [[Test alloc]init];
   NSLog(@"%d",g_value);
   [obj setGlobal :1000];
   NSLog(@"%d",g_value);
   system("pause");
   return 0;
}  
----------------------------------------------------------------------------------------

enum
1. 정수를 상수화해서 사용하는 개념
2. 열거형
선언방법
enum 이름 {멤버(=값)..... .. .. .. .}
                 ==> 초기값이 없으면 :0 부터 시작
                 ==> 초기값이 있으면 :그 숫자부터 시작
ex)
enum Month {Jan,Feb.. .. .. } ->진행중에 다시 초기화 가능
                      0    1
정수처럼 활용 가능 ex) Jan == 1 -> 가능
-----------------------------------------------------------------------------------------------
#import <foundation/foundation.h>
#include <stdio.h>

int main()
{
   enum month {janurary=1,february,march,april,may,june,july,august,september,october,november,december};
   enum month InputMonth;
   int days;
   BOOL flag;

   while(YES)  //무한반복
   {
      flag=YES;
      NSLog(@"월을 입력하세요");
      scanf("%i",&InputMonth);

      switch(InputMonth)
      {
      case janurary:
      case march:
      case may:
      case july:
      case august:
      case october:
      case december:
           days = 31;
           break;
          
      case april:
      case june:
      case september:
      case november:
           days = 30;
           break;
                     
      case february:                                                                                                        
           days = 28;
           break;
 
      default:
           NSLog(@"잘못 입력하셨습니다.");
           days=0;
           flag=NO;
           break;

      if(flag==YES)
         break;
      }
   }
      if(days!=0)
         NSLog(@"날짜 수 :%i",days);
         system("pause");
      return 0;
}                              
-----------------------------------------------------------------------------------------------

형변환
묵시적형변환 : 자동으로 수행되는 형변환
==>10/3 의 값은?
명시적형변환 : 강제 형변환

typedef
자료형의 이름에 별명 붙이는 것
ex) typedef int integer;
      typedef Test* T;
      SEL, id 의 경우는 * 없이 사용하는데 이미 typedef가 되어 있는 상태임.

NSNumber 클래스

1. NS자료형 클래스 : 일반 자료형의 클래스
                              이름 자체가 데이터 -> NSString a = @"Hello";
   ex)NSInteger, NSUInteger
        - isEqualToNumber : 비교(같은지 비교하여 BOOL 타입 리턴)
          compare : 비교(크기까지 비교) 리턴->
                          NSOrdered Ascending (앞의 결과가 작은 경우),
                          NSOrdered Descending (뒤의 결과가 작은 경우),
                          NSOrdered Same (동일한 경우)
2. NSNumber : 숫자에 관련된 클래스
                      numberWith자료형 - 값을 대입받는 메서드
                      자료형 value - 값을 리턴하는 메서드
                      initWith자료형 - 초기화
3. 자체메서드가 내장되어 있음

-----------------------------------------------------------------------------------------------
#import <foundation/foundation.h>

int main(int argc, char *argv[])
{
   NSNumber *myNumber, *floatNumber, *intNumber;
   // 포인터 타입
   NSInteger myInt; // *을 붙이지 않음

   intNumber = [NSNumber numberWithInt:100]; // 참조형
   myInt = [intNumber integerValue];         // value형

   NSLog(@"%li",(long)myInt);
  
   myNumber=[NSNumber numberWithLong:0xabcdef]; //16진수
   NSLog(@"%lx",[myNumber longValue]);
  
   myNumber=[NSNumber numberWithChar:'X'];
   NSLog(@"%c",[myNumber charValue]);
  
   myNumber=[NSNumber numberWithFloat:100.00];
   NSLog(@"%g",[myNumber floatValue]);
  
   myNumber=[NSNumber numberWithDouble:12345e+15]; // 지수형 - 12345 의 15배수
   NSLog(@"%lg",[myNumber doubleValue]);  
   NSLog(@"%i",[myNumber integerValue]);     
  
   if ([intNumber isEqualToNumber:floatNumber] == YES)
       NSLog(@"Numbers are equal");     
   else
       NSLog(@"Numbers are not equal");        

   if([intNumber compare:myNumber] == NSOrderedAscending) //오름차순
       NSLog(@"First number is less than second");     
   else
       NSLog(@"First number is not less than second");           
  
   system("pause");
   return 0 ;
}
-----------------------------------------------------------------------------------------------

:
Posted by 에너지발전소
2010. 5. 12. 19:18

[5일차]NSObject 클래스 Objective-C2010. 5. 12. 19:18


NSObject 클래스
1. objective-c의 최상위 클래스
2. 모든 클래스는 이 클래스로부터 반드시 상속받아야 함
1) 멤버변수
Class isa : 인스턴스 생성시 클래스 타입

2)인스턴스-클래스 관련 메서드
-(class)class ->인스턴스메서드
+(class)class ->클래스메서드
-(id)self : 자기 자신의 id를 리턴 -> 반드시 implementaion(구현부) 에서만 사용
-(BOOL)isMemberOfClass:(Class)aClass
-(BOOL)isKindOfClass:(Class)aClass

3)메모리 생성과 해제
+(id)alloc : 메모리 할당하고 retainCount 를 1로 초기화 - 재정의 안됨
-(void)dealloc : retaionCount에 상관없이 메모리 공간해제 -재정의 가능
-(id)retain : retaincount 1 증가시키고 자기자신의 id를 리턴
-(NSUinteger)retainCount : 인스턴스 참조 횟수
-(id)init  : 초기화하고 아이디 리턴
+(void)initialize : init이전에 호출. 0으로 채워줌 - 재정의 안됨
+(id)new : alloc 과 init 조합. init이 재정의 되어 있으면 문제가 됨 - 재정의 안됨
-(void)release : retainCount 1 감소. retainCount가 0이 되면 자동적으로 dealloc를 호출

4)객체의 비교
-(BOOL)isEqual : (id)Object
==>id를 비교해서 리턴
------------------------------------------------------------------------------------------------
#import <foundation/foundation.h>
@interface Test : NSObject
{int a;}
-(BOOL)isEqual:(Test*)Temp; //
@end

@implementation Test
-(BOOL)isEqual:(Test*)Temp
{
   if(a==Temp->a) // Temp의 매개변수를 비교할 경우 동일한 것으로 인식.
   {
      return YES;
   } else {
      return NO;
   }                          
}
@end

int main()
{
   Test * obj = [[Test alloc]init];
   Test *copyobj = obj;
   Test *Ins = [[Test alloc]init];
   if([obj isEqual : copyobj])
      NSLog(@"2개 인스턴스는 동일합니다");
   else
      NSLog(@"2개 인스턴스는 다릅니다");
     
   if([obj isEqual : Ins])
      NSLog(@"2개 인스턴스는 동일합니다");
   else
      NSLog(@"2개 인스턴스는 다릅니다"); // id를비교할 경우 주소가 다르기 때문에  다른것으로인식
   system("pause");
   return 0 ;
}
------------------------------------------------------------------------------------------------
5)클래스와 객체의 설명
+(NSString *)description : 클래스 이름을 문자열로 리턴
-(NSString *)description : 클래스 이름과 id리턴 ->결과값을 예측하면 안됨
                                     특정 클래스 타입의 인스턴스들은 다른 값을 리턴하기도 함 - 오버라이딩 되어 있음
 NSString 상수 : 인스턴스

@selector : 함수포인터, delegate
@selector(method_name) : 정의된 메소드 이름을 리턴해 준다.
아래와같이 똑같은 형태의 메서드일 경우

(void) A()

(void) B()

(void) C()

호출하기 위해서는 A(), B(), C() 와 같은 형태로 불러야 함.
오버라이딩 하기위해서는 메소드간에 상속관계에 있어야 함.

(void) A() : super
(void) B(): super
(void) A(): super
(void) C(): super
(void) A(): super

상위클래스의 인스턴스변수는 하위클래스의 인스턴스변수를 받을 수 있다.
super X = X->A()
------------------------------------------------------------------------------------------------
//ex>매개변수가 없는 selector의 사용
#import <foundation/foundation.h>
@interface Test : NSObject
-(void)Disp;
-(void)Print;
@end

@implementation Test
-(void)Disp
{
   NSLog(@"Disp 입니다");          
}

-(void) Print
{
   NSLog(@"Print 입니다");          
}
@end

int main()
{
   int x;
   Test * obj = [Test new];
   [obj Disp];
//   SEL T = @selector(Disp);
//   [obj performSelector:T]; //실행시 결정되기 때문에 약간 지연됨.
//   [obj performSelector :@selector(Disp)]; // SEL 타입으로 리턴, 이렇게 쓰는 경우는 거의없음
   NSLog(@"숫자를 입력하세요 1:disp,2:print");
   scanf("%d",&x);
   SEL T;
   if (x==1)
       T = @selector(Disp);
   else  
       T = @selector(Print);
      
   [obj performSelector :T];
   system("pause");
   return 0;
}
------------------------------------------------------------------------------------------------

:
Posted by 에너지발전소