달력

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. 18. 19:38

[9일차-1]8일차 이어서.. NSData 클래스 Objective-C2010. 5. 18. 19:38


NSData 클래스
  • 파일처리 등에 이용하는 바이트 배열 클래스
                                       1byte 기준

메서드
-(id)dataWithBytes : (const void *)bytes length:(NSVinteger)length
          생성자                배열           주소                     개수
-(id)initWithBytes : (const void *)bytes length:(NSUinteger)length
       초기화             어떤 타입의 포인터도 상관없음, integer를 넣으면 깨질 수 있음.
-(id)dataWithData:(NSData*)aData
          생성자
-(id)initWithData:(NSData*)aData
-(NSUinteger)length  //
-(void)getBytes:(const void*)bytes
                         bytes에게 주소를 리턴
-(NSString *)description

ex) NSString 과 NSData 와 char * 사이의 변환
---------------------------------------------------------------
#import <foundation/foundation.h>
/* 안써도 됨
#import <foundation/NSString.h>
#import <foundation/NSData.h>
*/
int main(int argc, char * argv[])
{
    unsigned char buf[20]; // 저장하기 위해 생성
    NSString * message = @"Test Conversion";
    const char * str = [message UTF8String]; // 일반 char type 으로 변환
    NSData * myData = [NSData dataWithBytes:str length:strlen(str)]; // 생성자이므로 메모리할당이 필요없음
    // NSString => NSData                           // 문자의 개수 리턴
    [myData getBytes:buf]; // char 배열로 변경
    int i;
    for (i=0; i<[myData length];i++)
    {
        NSLog(@"%c",buf[i]);
    }
    system("pause");
    return 0;
}
---------------------------------------------------------------
7. NSMutableData 클래스

  • 변경가능한 Data 클래스
  • 삽입, 삭제(remove로 시작), 갱신에 관련된 메서드가 존재
                                             인덱스 위치에 있는 인스턴스를 삭제하고 새로운 인스턴스를 삽입
  • NSData 로부터 상속됨

 add : 뒤에 삽입
insert : 위치에 삽입

:
Posted by 에너지발전소
2010. 5. 18. 11:15

[8일차]String Objective-C2010. 5. 18. 11:15

String
1. C언어의 문자열은 ASCII Code기반
2. Objective-C 언어의 문자열 클래스는 unicode 기반
                                                  멀티바이트 기반 (메서드들은 바이트 단위로 동작함)

3. String 클래스의 종류
   - NSString : 내용을 변경할 수 없는 문자열 클래스 (Char *)
   - NSConstantString : 문자열 상수로 주소를 변경할 수 없는 문자열 클래스 (Const char *)
   - NSMutableString : 내용을 변경할 수 있는 문자열 클래스 
     (NSString을 상속 + 메모리영역 추가(insert),삭제(delete)를 포함)

@"문자열" 이 NSConstantString
출력시에는 %s를 사용하기가 애매함
%@를 이용해서 인스턴스에게 Description 메서드를 수행한 리턴값을 출력하는 형태를 취함.
-----------------------------------------------------------------------------------
#import <foundation/NSObject.h>
// foundation.h
//  #import NSObject.h
#import <foundation/NSString.h>

int main(int argc, char * argv[])
{
    NSString * str = @"Programing is Fun";  // 자기에게 메모리를 할당하지 않았음. 포인터 변수
    // 상위클래스의 인스턴스는 하위클래서의 인스턴스에 대입가능.
    // alloc, 생성자, malloc 를 호출하지 않으면 자신의 메모리 공간은 없다.
    NSLog(@"%s",str); // %s는 C언어의 문자배열 출력용
    // 뒤에있는 주소부터 null을 만날때까지 1byte 단위로 읽어서 출력을 해라
    // NSString 는 MultiByte 임으로 1byte씩 끊어 읽을 경우 문자가 깨지는 현상발생

    NSLog(@"%@",str); // 문자열을 출력하는게 아니고
    // %@는 인스턴스에게 decription 메서드를 호출해서 문자열로 출력
    // str 을 출력하는게 아니라 str 의 decription 메서드 호출
    // NSObject
    // +(NSString *) description : 클래스 이름 리턴
    // -(NSString *) description : 클래스 이름과 id 리턴
    // NSString, NSNumber는 decription 을 재정의 해놓았음.

    // 값을 문자열로 리턴하도록 재정의됨.
    // ToString() 메서드를 재정의 하는것과 같이 Description 을 재정의하여 활용할 수 있음.
   
    system("pause");
    return 0 ;
}
-----------------------------------------------------------------------------------

%@을 이용해서 인스턴스 이름만으로 원하는 데이터를 출력하고자 하는 경우에는
description 메서드를 재정의(Overiding)해야 함

-----------------------------------------------------------------------------------
ex)
#import <foundation/NSObject.h>
#import <foundation/NSString.h>
#import <foundation/NSValue.h>

@interface Test : NSObject
// decription 메서드가 이미 존재
// decription : class 이름, id 를 리턴
@end

@implementation Test
@end

@interface Temp : NSObject
{
   NSNumber *number;
   // 숫자에 관련된 wrapper 클래스
}
-(id)init : (int)n; // 이건 over roading - 매개변수가 동일
-(NSString *) description; //이건  overriding
// -(id)init  <= 이렇게 사용하면 재정의
@end

@implementation Temp
-(id)init : (int)n
{
   self = [super init];  // 상위클래스 멤버 초기화
   if(self !=nil)
      number = [NSNumber numberWithInteger : n]; // 자신의 멤버 초기화
                // NSNumber가 할당받은 영역에 n을 대입
                // 정수로 저장해도 실수로 읽을 수 있음.
                // 부호 | 가수부 | 지수
   return self;
}

-(NSString *)description
{
   return [number stringValue]; // NSNumber 클래스가 소유한 값을 문자열로 리턴
}
@end

int main(int argc,char *argv[])
{
   NSNumber *intNumber = [NSNumber numberWithInteger : 100];
      NSLog(@"%@",intNumber); // 엄밀히 이야기하면 @"100" 이 출력
      // NSLog(@"%d",intNumber); // id
      // NSLog(@"%i",intNumber);
  
   Test *obj = [Test new];
      NSLog(@"%@",obj); // Test (클래스명) + 어떤숫자 (id)
     
      Temp *Ins = [[Temp alloc]init :100]; // Ins -> isa : Temp 주소
      NSLog(@"%@",Ins); // 100 <- 재정의된 문자열 
     
      system("pause");
   return 0;
}
-----------------------------------------------------------------------------------        

NSString의 인스턴스 생성과 문자 코드 변환
+(id)stringWithString:(NSString*)nsstring
-(id)initWithString:(NSString*)nsstring
-(NSUinteger)length // 문자수 리턴
-(id)initWhitUTF8String:(const char *)bytes
                                // C언어의 문자열 상수 data type
                                // 을 UTF8 문자열로 변환
-(const char *)UTF8String
  // 현재의 문자열을 C언어의 문자열 상수 data type(const char *) 으로 변경하기 위해 사용
  // ASCII Code 로 리턴, 파일처리, 메모장에서는 byte 단위 처리하고 있기 때문에 활용됨.

주의)
char *  // ? char 배열
const char * // ? 내용을 변경하지 못하는 char 배열
* char * 에서 const char * 로는 data를 줄 수 없음.
ex) cpy(char *, const char *) // 상수를 일반 변수에 대입하겠다는 의미
   heap에할당    전역에 할당(변경 불가능)


:
Posted by 에너지발전소
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 에너지발전소
2010. 5. 11. 20:54

[4일차]레퍼런스 카운트 Objective-C2010. 5. 11. 20:54


레퍼런스 카운트

1. 인스턴스의 참조 횟수
2. Objective-C 에서는 인스턴스 관리를 위해 레퍼런스 카운트(레퍼런스 참조횟수)를 저장하고 있는데
   alloc을 하는 순간 메모리를 할당하고 카운트 값을 1로 초기화 합니다.
3. retain 메서드는 이 카운트 값을 1 증가 시키고 자기 자신의 id를 리턴합니다.
4. release 메서드는 이 카운트 값을 1 감소 시킵니다.
5. dealloc은 이 참조 카운트 값을 무시하고 무조건 메모리 공간을 해제합니다.
6. objective-C 는 참조 카운트 값이 0인 인스턴스를 해제합니다.
7. retainCount 메서드를 호출하면 그 인스턴스의 참조횟수를 정수로 리턴합니다.
------------------------------------------------------------------------
#import <foundation/foundation.h>

int main()
{
   id obj = [[NSObject alloc] init];
   NSLog (@"Init : %d\n",[obj retainCount]);
   [obj retain];  
   NSLog (@"retain : %d\n",[obj retainCount]);
   [obj retain];  
   NSLog (@"retain : %d\n",[obj retainCount]);
   [obj release];  
   NSLog (@"release : %d\n",[obj retainCount]);      
   [obj release];  
   NSLog (@"release : %d\n",[obj retainCount]);         
   [obj release];  
   NSLog (@"release : %d\n",[obj retainCount]);            
   // retainCount : 0 이므로 가리키고 있는 객체가 없는 상태임. 따라서 런타임 오류가 발생
   system("pause");
   return 0;
}
------------------------------------------------------------------------

dealloc
dealloc을 호출하는 것은 에러가 아님
retainCount에 상관없이 해제를 하므로 약간 위험할 수 있음
------------------------------------------------------------------------
#import <foundation/foundation.h>
int main()
{
   id obj = [[NSObject alloc] init];
   NSLog (@"Init : %d\n",[obj retainCount]);
   [obj retain];  
   NSLog (@"retain : %d\n",[obj retainCount]);
   [obj dealloc];  
   NSLog (@"dealloc : %d\n",[obj retainCount]);
   // retainCount 런타임 오류가 발생하면 메모리 할당이 되어 있지 않다는것을 확인 할 수 있음
   system("pause");
   return 0;
}
------------------------------------------------------------------------
그러나 무턱대고 dealloc를 호출하면 위험함..
가령 위의 구문을 복사할 경우 문제가 발생
------------------------------------------------------------------------
#import <foundation/foundation.h>
int main()
{
   id obj = [[NSObject alloc] init];
   NSLog (@"Init : %d\n",[obj retainCount]);
   [obj retain];  
   NSLog (@"retain : %d\n",[obj retainCount]);
//   id obj1 = obj;  
   id obj1 = [obj retain];   // <= retainCount 증가를 통해 잘못된 메모리 해제를 방어
   if ([obj retainCount]==1)
   {
      [obj dealloc];
   }
// [obj dealloc];  
   NSLog (@"dealloc : %d\n",[obj1 retainCount]);
   // 참조복사를 한 경우 참조가 삭제되어 문제가 발생
   // c#의 경우 참조가 걸려 있으면 dealloc을 할 수 없음.
   // release 도 동일한 문제가 발생할 수 있으므로 retain 을 확인해야 함.
   // retain은복사를 하거나 매개변수로 사용되었다는것을 알려주기위해 만들어짐.  
   // 인스턴스가 매개변수로 사용될때 고민해야 함.
   // 함수생성시 매개변수에 포인터를 쓰는것은 위험한 발상이다.(중간에 하나만 끊겨도 많은 문제가 야기된다)
   // 멤버가 public 라면 init 생성시 매개변수로
   // @interface Test
   // -(id) init : (Test*) x   
   // { self = x }
   // [[Test alloc] init:x];

   system("pause");
   return 0;
}

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

안전하게 복사하는 방법
   // int a=10;
   // int *p = (int*) malloc(4);
   // *p = a;
   // free(p);


dealloc은 재정의 가능
1. 반드시 super dealloc을 호출해야 하고 release를 이용해서 사용하는것이 바람직하고 일반적으로 정리작업에 사용
------------------------------------------------------------------------
#import <foundation/foundation.h>
@interface Test : NSObject
{
   @public
   int a;
}
-(id)init :(Test*)obj;
@end

@implementation Test
-(id)init:(Test*)obj
{
   self = [super init];
   if(self !=nil)
   {
      self->a = obj->a;
   }          
   return self;
}
@end

Test obj=[Test alloc];
Test obj1=[[Test alloc]init:obj];
------------------------------------------------------------------------
NSString 상수
1. @"문자열"
2. 프로그램 종료시까지 해제되지 않는 인스턴스임.
3. retain, release 무시
4. retainCount 는 양의정수 최대값에서 불변입니다.

const
1. 변수를 상수화시켜주는 예약어
2. C 에서와 거의 동일하게 사용되지만 멤버로 선언하지 않는다는점이 다름.
3. # define과도 유사하지만 #define은 컴파일시 이미 변경이 된다는 점이 다름.
4. 클래스 구현부에서 선언하자마자 초기화하면 전역변수처럼 사용됨.
    * 일반 value형 변수에 사용되면 값을 변경할 수 없음. => * 안들어가는 id를 제외한 자료형
    * 포인터변수에 사용되면 주소(id)는 변경할 수 있지만 가리키는 데이터는 변경할 수 없다.
5. 인스턴스(멤버) 변수에 const를 지정하면 0으로 사용 - 초기화를 수행하고 난후 변경할 수 없음
------------------------------------------------------------------------
#import <foundation/foundation.h>
@interface Test : NSObject
{
   int a;
   const int b;
}
-(int)a;
-(int)b;
-(void)setA:(int)n;
-(void)setB:(int)n;
@end

@implementation Test
-(int)a {return a;}
-(void)setA:(int)n
{
   a=n;                
}
-(int)b {return b;}

-(void)setB:(int)n
{
//   b=n; // read-only member err
}
@end


int main()
{
   Test * obj= [[Test alloc]init]; // id를 리턴
   
   NSLog(@"%d",[obj a]);
   [obj setA:20];
   NSLog(@"%d",[obj b]);
   [obj setB:20];
   NSLog(@"%d",[obj b]);  
   system("pause");
   return 0;
//   int a=10;
//   const int c=10;
//   NSLog(@"%d",a);
//   NSLog(@"%d",c);
//   a=11;
//   c=11; // readonly , error
//   return 0 ;
}

자료명이름 * 변수명; <-포인터변수 정의

alloc
메모리를 할당하고 모든 멤버변수를 0로 초기화
initialize :
init : 재정의 가능




:
Posted by 에너지발전소
2010. 5. 10. 22:01

[3일차]nil 포인터(3-2) Objective-C2010. 5. 10. 22:01

1. 참조되는 대상이 없는 포인터
2. 메모리 할당에 실패했거나 메모리 할당을 아직 하지 않은 경우의 포인터
3. 0 이라고 하는 경우도 있음
4. 다른 언어의 null과 유사
   다른 점은 다른 언어는 null이 멤버를 참조하면 컴파일시 에러지만 objective-C는 실행 시 에러 (예외로 처리)
   웬만한 참조형 변수를 사용할때에는
   if ( obj !=nil) 
   {
      [obj Disp];
   } else {
      obj = [Test alloc];
      [obj Disp];
   }
 
헤더 파일 import 대신 사용할 수 있는 구문

@class 클래스명;


인스턴스의 멤버 변수접근
1. objective-C 에서는 기본적으로 인스턴스의 멤버변수에 접근할 수가 없습니다. - 정보은닉 (infomation Hiding)
2. 예외적으로 클래석 구현부내에서 Self를 이용한 접근은 허용하지만 큰 의미가 없으며 클래스의 인스턴스가 메서드의
    매개변수인 경우에도 가능 (-> 연산자 이용)

@interface Test : NSObject
{
    int a ;
}
-(void)Disp;
@end
Test * obj = [Test alloc];
NSLog (@"%d\n",obj->a); (X)
[obj Disp]; (O)
 
------------------------------------------------------------
#import <Foundation/Foundation.h>
@interface Test : NSObject
{@public
   int n;
}
-(id)init:(int)a;
------------------------
** public를 사용하지 않을 경우
-(int)n;   --> get method
-(void)setN:(int)a;  --> set method

------------------------
@end

@implementation Test
-(id)init:(int)a;
{
   n = a;
}
------------------------
** public를 사용하지 않을 경우
-(int)n {return n;}
-(void)setN:(int)a
{
   n = a;                
}
------------------------
@end

@interface TempTest : NSObject
{
   int value;
}
-(id)init:(int)a;
-(void)disp:(Test*)obj;
@end

@implementation TempTest
-(id)init:(int)a;
{
   value = a;
}
-(void)disp:(Test*)obj;
{
   NSLog(@"%d\n",value);                     
   NSLog(@"%d\n",obj->n);                     
}
@end

int main(void)
{
  Test *Ins = [[Test alloc]init:10];
  TempTest *var = [[TempTest alloc]init:20];
  [var disp :Ins];
  system("pause");
  return 0;
}
------------------------------------------------------------

접근 지정자

@private : 클래스 내에서만 접근가능
@protected : 클래스 내부에서 접근가능하고 상속한 경우 접근가능 (생략하면 Protected)
@public : 클래스와 인스턴스 모두 접근 가능 

클래스는 무조건 public (내포 클래스 지정불가능)
클래스 안에 클래스 지정하는것이 불가능.

Property(속성)

지역 메서드
1. 선언부(Interface)에는 없고 구현부(implementation)에만 있는 메서드


Static(클래스)
1. 클래스가 사용할 수 있는 또는 인스턴스들이 공유할  수 있는 멤버
1) Static 메서드 (클래스 메서드)
    가) 인스턴스 생성없이 사용할 수 있는 메서드
    나) - 대신에 +를 붙이면 Static 메서드
    다) 인스턴스가 호출 할 수 없다.
    라) 인스턴스 변수 사용 불가


    마) 굉장히 자주사용하거나 Static 변수 선언시에 사용.
    바) 코드,전역 영역    /     스텍      / Heap


2. Static 변수
    가) 동일한 클래스 타입으로 만들어진 인스턴스들이 공유할 목적으로 사용하는 변수
    나) 인스턴스가 호출해야 합니다. (Self 같은 애들이 사용)
    다) 일련번호를 만들때 적절히 사용

    라) 선언하고자할때 static를 기재하면 되고 구현부에서 생성하자마자 초기화해서 사용
    마)
------------------------------------------------------------
#import <Foundation/Foundation.h>
@interface Test : NSObject
-(void)Disp;   -> 인스턴스 메서드
+(void)Print;   -> 클래스 메서드
@end

@implementation Test
-(void)Disp
{
   NSLog(@"Instance 멤버");
}
+(void)Print
{
   NSLog(@"Class 멤버");
}
@end

int main(void)
{
  [Test Print];
  Test *obj = [[Test alloc] init];
  [Test Print];
  [obj Disp];
  system("pause");
  return 0;   
}
------------------------------------------------------------
// 일련번호 만들기
#import <Foundation/Foundation.h>
@interface Test : NSObject
{
  int bunho;
}
- (id) init;
- (void) Disp;
@end


@implementation Test : NSObject
static int n = 1; // test 타입은 전부 공유
-(id) init
{
   self -> bunho = n++; return self;
}
-(void)Disp
{
   NSLog(@"%d\n",bunho);
}
@end


int main(void)
{
  Test *obj1 = [[Test alloc] init];
  Test *obj2 = [[Test alloc] init];
  [obj1 Disp]; //1
  [obj2 Disp]; //2
  system("pause");
  return 0;   
}

:
Posted by 에너지발전소
2010. 5. 10. 19:48

[3일차]Dynamic Binding(3-1) Objective-C2010. 5. 10. 19:48


음.. 2일차 정리되지 않은 관계로 3일차 먼저 정리하고.. 2일차는 다음에 다시 정리하도록 하겠습니다.

Dynamic Binding

1. Objective-C 에서는 모든 참조형 변수는 Dynamic Binding (실행시 타입을 결정)을 수행합니다.
2. 컴파일시에는 어떠한 타입체크도 수행하지 않습니다.
3. 단, 상위클래서 타입의 변수에 하위타입의 클래스로 메모리를 할당하는 경우 메모리 할당도 가능하고
   하위 클래스 타입의 메서드도 호출가능하지만 하위클래스 타입의 메서드를 호출하면 Warning이 발생한다.
   이때는 가급적 형변환을 해주는것이 좋다.

  상위 클래스의 변수는 하위 클래스타입의 변수 대입가능
 
 
Test *obj = [Test alloc];
  SubTest *obj = [SubTest alloc];
  Test *obj = [SubTest alloc]; ==> Warning 발생 : 형변환을 하면 Warning가 발생하지 않음
                                                 [(Subtest*)obj b] ==> (변경하고자하는자료형)데이터
  SubTest *obj = [Test alloc]; (X) ==> 일반적으로는 불가능하나 Objective-C는 가능

----------------------------------------------------
#import <Foundation/Foundation.h>
@interface Test : NSObject
-(void)Disp;
@end

@implementation Test
-(void)Disp;
{
  NSLog(@"상위 클래스의 메서드입니다"); }
@end

@interface SubTest : Test
-(void)Print;
@end

@implementation SubTest
-(void)Print;
{
  NSLog(@"하위 클래스의 메서드입니다");
}
@end
 
int main(void)
{
  Test * obj;
  obj = [[SubTest alloc] init];
  [obj Disp];
  [(SubTest*)obj Print];  => (SubTest*) 는 생략가능
  system("pause");
  return 0;
}
----------------------------------------------------
  

 

:
Posted by 에너지발전소
2010. 5. 10. 19:08

[1일차]윈도우에서+Objective-C(1-2) Objective-C2010. 5. 10. 19:08

gcc 컴파일러를 세팅하기 위해서 세가지가 필요합니다.

1. GNUstep를 다운로드 받습니다
      gnustep.org에서 다운로드 받으면 됩니다
    gnustep-core-0.23.1-setup.exe

       gnustep-system-0.24.2-setup.exe

2. DEV-C++ 를 다운로드 받습니다.
  

3. 환경설정.
   1) 위의 파일을 순서대로 설치합니다.
   2) DEV-C++ 을 실행하고 메뉴의 Tools > Compiler Options > Compiler 탭에 아래의 내용을 등록합니다
     


      -lobjc -lgnustep-base -fconstant-string-class=NSConstantString -enable-auto-import
      -lobjc -lgnustep-base -fconstant-string-class=NSConstantString -enable-auto-import


   3) 메뉴의 Tools > Compiler Options > Directories 에서 각각의 탭에 다음을 등록합니다.




    Binarites

      C:\GNUstep\mingw\bin
      C:\GNUstep\bin

    Libraries

      C:\GNUstep\mingw\lib
      C:\GNUstep\GNUstep\System\Library\Libraries

   C Includes

      C:\GNUstep\mingw\include
      C:\GNUstep\GNUstep\System\Library\Headers

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

아래와 같이 소스를 입력하고 컴파일하고 실행시켜 봅니다.

--선언부

#import <Foundation/Foundation.h>

@interface HelloWorld : NSObject

- (void) hello;

@end

 

--구현부

@implementation HelloWorld

- (void) hello

{

         NSLog(@"안녕하세요 반갑습니다");

}

@end

 

--실행부

int main(void)

{

    HelloWorld *hw = [[HelloWorld alloc] init];

    [hw hello];

    [hw release];

    system("PAUSE");

    return 0;

}



:
Posted by 에너지발전소
2010. 5. 7. 19:07

[1일차]윈도우에서+Objective-C(1-1) Objective-C2010. 5. 7. 19:07


드디어 Objective-C 학습을 시작합니다.
개발 손놓은지가 언젠데.. -_- ;; 막상 다시 하려니 걱정이 반입니다.

어떻게 학습을 해야할까요? 음.. 그냥 순서대로 해보렵니다.

먼저 학습을 위한 환경을 만들어야겠네요.. 어차피 아이폰 개발을 위해 Objective-C를 공부하는거니 Xcode에서 개발해도 되겠지만.. 순서대로 차근차근히 해보겠습니다.

Objective-C의 기원은 어디일까요? 혹자는 C, C++이라고합니다.
정말 그럴까요? 어떻게 Objective-C가 만들어졌을까요?

Objective-C는 Brad j. Cox가 Smalltalk의 특징들을 C에 추가해서 만든언어입니다.
여기서 "Smalltalk"란 또 무엇일까요?

* Smalltalk *
간단히 말하면 객체지향언어입니다.
JAVA C++같은거요 그러나 C++같은거보다 더 객체지향적인 언어라고 알고있습니다

미국 제록스(XEROX)사의 Palo Alto 연구 센터(PARC)에서 개발한 객체 지향 프로그램 작성 언어와 개발 시스템.
제1판은 1972년에 개발된 Smalltalk-72이며, 그 후 개량이 계속되어 1980년에 완성된 Smalltalk-80이 처음으로 상품화되어 출시되었습니다.현재 널리 사용되고 있는 객체 지향 언어인 C++와 비교해 다음과 같은 장점이 있습니다.

㉠소프트웨어를 재이용하기가 쉽다.
C++보다 엄격하게 객체 지향적이어서, 프로그램은 반드시 논리와 데이터가 일체화된 객체의 형태로 실현된다.

㉡품질이 양호한 클래스 라이브러리(객체의 표본)가 풍부하다.
예를 들면, 대표적인 스몰토크 제품인 VisualWorks는 900종 이상의 클래스 라이브러리를 가지며, 이것들에 의해 응용 프로그램 개발 효율이 대폭 향상되었다.

㉢클래스를 검색하는 브라우저(browser)나 기억 장치의 비어 있는 영역을 자동적으로 확보하는 폐영역 회수(garbage collection) 등을 표준적으로 구비하고 있어서 개발 환경이 충실하게 되어 있다.

주요한 스몰토크 처리 시스템으로는 IBM사의 VisualAge, 스몰토크와 같은 Parkplace Digitalk사의 VisualSmalltalk 등이 있다. 최근 수년 간 기업용 클라이언트/서버 시스템 개발에 스몰토크가 이용되고 있으나, 객체 지향 언어로서 스몰토크와 비슷한 장점을 갖추고 있는 자바 언어가 등장하면서 자바 언어가 더 주목을 받고 있다.

StepStone이란 회사를 차려서 Objective-C 컴파일러를 만들었고 그것을 NeXT사에서 라이센스받아 NeXTSTEP에 넣음으로써 본격적으로 사용되어졌습니다. 그후 Dennis Glatting과 Richard Stallman이 GCC에 Objective-C 런타임을 추가하였습니다.
현재 리눅스에 깔려있는 gcc에서 사용가능하게 되었고 애플에서도 이 gcc를 Mac OS X에서 사용중입니다.
XCode에서 사용하는 컴파일러도 gcc 입니다.

Mac OS X의 가장 핵심적인 개발 Framework - Carbon과 Cocoa
- Carbon
C로 이루어진 API로 윈도우의 Win32 API와 상당히 유사하고
예전 Toolbox API셋으로부터 발전한 것입니다.
매킨토시의 레거시 코드의 재활용을 위해 만들어 졌다고 합니다.

- Cocoa
NeXTSTEP으로 부터 온 것으로 Objective-C로 만들어진 Framework
예전 NeXTSTEP API를 상당히 그대로보존하고 있습니다.
Mac OS X는 NeXTSTEP + Mac OS 로 이루어진 OS 입니다.

프로그래밍 언어로서 Objective-C는..?
- C 언어의 확장
C언어와 fully compatible 함.(C프로그램은 Objective-C 컴파일러로 컴파일되고 결과물도 똑같음)
하지만 Objective-C는 클래스, 메세지, 상속과 같은 객체지향 구조를 포함하고 있씁니다.. 
Objective-C가  Python, Ruby 와 더 유사하다는 주장하는 분도 계십니다.
Python, Ruby, Groovy 는 요즘 인기있는 스크립트 언어입니다.
Rails는 Ruby에서 사용하는 프레임워크로 Groovy는 Grails, Python에는 Django 등이 있습니다.
3개의 스크립트 언어 모두, 웹어플을 만드는데 주로 사용될 것 같습니다.

더 자세한 내용은 내공이 부족하여.. ㅠㅠ

- Objective-C의 객체모델.
Smalltalk-76의 객체모델(root class 구조, super class, 클래스, 메타클래스 관계구조)를 기반.
Smalltalk-80에서 사용된 메타클래스 구조는 Objective-C에서 사용되지 않습니다.

오늘은 여기까지... 오늘이 벌써 2일차인데.. 1일차도 다 정리를 못하네요..
1일차.. 계속 이어집니다.. 1일차에서.. 최소한 gcc 컴파일 환경까지는 세팅해야겠지요? ^^
:
Posted by 에너지발전소