달력

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. 19. 21:48

[10일차-2]Dictionary Objective-C2010. 5. 19. 21:48

Dictionary
  • Key와 Value로 구성되는 컬렉션
  • Key 값으로 Value를 빠르게 검색합니다.
  • Key와 연결된 Value는 nil 일 수 없습니다.
  • Key는 유일해야하며 일반적으로 NSString 입니다.

1. NSDictionary
+(id)dictionary
+(id)dictionaryWithObject:(id)anObject forKey:(id)aKey
-(id)initWithObjects:(NSArry *)Objects forKeys:(NSArray *)Keys
-(id)initWithObjects:(id *)Objects forKeys:(id*)Keys count:(NSUInteger)count
-(id)initWithObjectsAndKeys:(id)Object,(id)Key,... nil
-(NUInteger)count
-(id)objectForKey:(id)aKey
-(NSArray*)allKeys
-(NSArray*)allValues
-(NSEnumerator *)keyEnumerator
-(NSEnumerator *)objectEnumerator
-(NSArray *)allKeysForObject:(id)anObject

배열을 데이터롤 사용하는 dictionary와 dictionary를 배열로 저장
ex)


2. NSMutableDictionary

  • 삽입과 삭제가 가능한 Dictionary

+(id)DictionaryWithCapacity:size
-(id)initWithCapacity:size
-(void)setObject:(id)anObject forKey:(id)aKey
-(void)removeAllObjects
-(void)removeObjectForKey:key
-(NSArray*)keysSortedByValueUsingSelector:@selector(비교메서드:)

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

[10일차]Set 클래스 Objective-C2010. 5. 19. 19:10

Set 클래스
  • 모든 멤버가 순서에 상관없이 저장되고 중복된 데이터는 삽입되지 않는 컬렉션

종류
NSSet
NSMutableSet  // NSSet을 상속
NSCountedSet // NSMutableSet을 상속
                     : 인스턴스와 저장된 개수를 가지고 있는 Set (참조회수 조회시 유용)

1. NSSet 클래스
메서드
+(id)set
// 요소가 포함되지 않는 임시 인스턴스 생성
+(id)setWithObjects:obj1,obj2... ,nil // 중복데이터 배제
// 오브젝트 들을 이용해서 set을 생성
-(id)setWithObjects:obj1,obj2... ,nil // 중복데이터 배제
// 오브젝트 들을 이용해서 set을 초기화
-(id)initWithArray:(NSArray*)array // 중복데이터 배제
-(NSArray *)allObjects; //
-(NSUInteger)count; // 개수를 리턴
-(NSEnumberator *)objectEnumerator; //
--------------------------------------------------------------------------------
#import <foundation/NSSet.h>
#import <foundation/NSString.h>
#import <foundation/NSEnumerator.h>

int main(int argc, const char * argv[])
{
    NSEnumerator * it;
    NSString * element;
    NSSet * setString = [NSSet setWithObjects:@"One",@"Two",@"Three",@"One",nil];

    NSLog(@"setString: ");
    it = [setString objectEnumerator];
    while((element=[it nextObject])!=nil)
    NSLog(@"%@",element);

    NSArray * ar = [NSArray arrayWithObjects:@"One",@"Two",@"Three",@"One",nil];
    setString = [setString initWithArray:ar];
   
    NSLog(@"ar: ");
    it = [ar objectEnumerator];
    while((element = [it nextObject])!=nil)
    NSLog(@"%@",element);
   
    NSLog(@"setString: ");
    it = [setString objectEnumerator];
    while((element =[it nextObject])!=nil)
    NSLog(@"%@",element);
   
    system("pause");
    return 0;
}
--------------------------------------------------------------------------------

2) 멤버의 포함여부와 동일성 여부
-(BOOL)containsObject : obj
-(BOOL)isSubsetOfSet : nsset => nsset에 모든 멤버가 있으면 YES
-(BOOL)intersectsSet : nsset => 공통요소가 있으면 YES
-(BOOL)isEqualToSet : nsset  => 동일한 경우

2. NSMutableSet : 변경가능한 SET
-(id)setWithCapacity:size =>size 만큼 저장할 수 있는 초기 용량으로 새로 생성
-(id)initWithCapacity:size
-(void)addObject:obj
-(void)removeObject:obj
-(void)unionSet:nsset
-(void)minusSet:nsset
-(void)intersectSet:nsset =>공통되지 않은 요소를 제거

3. NSCountSet

  • 중복된 데이터의 경우 count 값을 증가시키는 set
  • obj가 추가된 개수 리턴
:
Posted by 에너지발전소
2010. 5. 19. 09:36

장자 21세기와 소통하다 책 읽는 사람2010. 5. 19. 09:36



안희진 지음 | 시그마북스
출간일 : 2009년 08월 13일
도서분야 : 인문학 > 동양철학 > 동양철학일반

책소개
우리는 무엇을 위해 사는가. 더 풍요롭고 행복하게 살기 위해서라는 단순한 논리는 참으로 공허하다. 우리의 인생에는 이 보잘것없어 보이면서도 의미 가득한 존재의 진정한 가치를 구현할 책무가 있다. 그것은 드러난 필연을 꿰뚫고 그 보이지 않는 섭리를 체득해서 기쁨과 슬픔, 삶과 죽음이라는 허망한 굴레를 벗어나는 일이다. 굴레를 벗어나 대자유에 이르는 일의 중요한 관건은 맑은 영혼의 눈을 뜨는 일이다......

저자소개
1986년 단국대학교 인문대학 중문과를 졸업하고, 1990년 홍콩 주해대학 문학연구소에서 문학석사, 1996년 북경대학에서 중문고전문학으로 문학박사학위를 받았다. 2006년에는 방문학자의 신분으로 미국 오레곤대학에 있었으며, 현재 단국대학교 인문대학 중국어과 교수로 재직하고 있다. 송대 소동파를 중심으로 당송시기의 문학을 연구하면서, 중국어 관련 컴퓨터 활용과 고전문학을 가르치고 있다. 저서로「소동파에게 시를 묻다」와「한자어의 이해」등이 있고, 고전문학과 관련된 여러 편의 논문이 있다

목차
서문

1부 무엇이 문제인가_장자의 지적
1장 거짓이 되기 쉬운 가치관
1 진정한 깨끗함
2 강조할수록 거짓
3 인위적인 조작들
2장 버려야 할 이욕과 집착
4 껍데기들
5 이욕의 덫
6 우물 안 지식
7 작은 쓸모
8 헛된 명분

2부 어떻게 할 것인가_장자의 해법
3장 있는 그대로 둠
9 멋진 불구자들
10 있는 그대로
11 쓸모없는 나무의 쓸모
4장 맑은 영혼의 회복
12 텅빔
13 자연스러움
14 돌아감
5장 창조적인 삶
15 하나됨
16 '기술'과 '도'
:
Posted by 에너지발전소
2010. 5. 18. 21:11

[9일차-2]배열 Objective-C2010. 5. 18. 21:11

배열
1. 배열 객체의 종류
    NSArray : 수정이 불가능한 배열 => 확장과 삽입 삭제등이 불가능
    - 자기가 할당받은 공간을 늘이거나 줄이거나 불가능
    - 인스턴스 변수만 생성가능     
    - 타입이 달라도 생성가능
    NSMutableArray : 수정이 가능한 배열 => 확장이 가능

   전부 NSArray.h에 정의되어 있음

2. NSArray의 생성과 요소접근
   1)생성
      NSArray * 배열명 = [NSArray arrayWithObjects:인스턴스 나열,..... nil];
      -(id)initWithArray:(NSArray*)anArray
   2)C 배열에 복사
      -(void)getObjects:(id*)aBuffer;
   3)요소접근
      [배열명 count]:요소개수 리턴
      [배열이름 objectAtIndex:인덱스]
      [배열이름 indexOfObject:(id)anObject]
       -(id)lastObject

ex)배열의 생성과 접근
--------------------------------------------------------
#import <foundation/foundation.h>
#import <foundation/NSArray.h>
#import <foundation/NSString.h>
#import <foundation/NSValue.h>

int main (int argc, char * argv[])
{
    int i;
    NSNumber * intNumber = [NSNumber numberWithInteger:100];
    NSArray * month = [NSArray arrayWithObjects:@"Janurary",@"Feburary",@"March",@"April",@"May",
                      @"June",@"July",@"August",@"September",@"October",@"November",@"December",intNumber,nil];
                                                                                             // nil은 저장안됨
    NSLog(@"한글         영문");
    NSLog(@"=====        ====");
    for (i = 0;i < [month count]; ++i) // 배열의 요소개수를 리턴
        NSLog(@" %2i월       %@", i+1, [month objectAtIndex:i]);
/*
    for (id T in month)
        NSLog(@"%2i월  %@",i+1,T);
    // 다른 언어의 foreach구문
*/    
    system("pause");
    return 0;
}
/*
for (변수 in 배열)
==> 배열의 모든 요소를 변수에 대입해서 사용
==> dev-C 에서는 인식하지 않음
*/
--------------------------------------------------------
Objective-C에는 기본적으로 다차원 배열이 없음
NSArray를 C스타일의 배열 형태로 변경
--------------------------------------------------------
#import <foundation/NSobject.h>
#import <foundation/NSArray.h>
#import <foundation/NSString.h>

int main(int argc, char *argv[])
{

    NSArray * month = [NSArray arrayWithObjects:@"Janurary",@"Feburary",@"March",@"April",@"May",
                      @"June",@"July",@"August",@"September",@"October",@"November",@"December",nil];
                      // month : NSString * []
    NSString** cArray = malloc(sizeOf(NSString *) * [month count]); // NSString * cArray[12];
    //                         NSString * 타입의 메모리 * 12
    int i;
    for(i=0; i<[month count]; ++i)
    {
       cArray[i] = [month objectAtIndex:i];
    }
   
    free(cArray);
    system("pause");
    return 0 ;
}
--------------------------------------------------------
3. NSArray의 기타 메서드

-(BOOL)isEqualToArray:(id)anObject
  : 배열의 요소 개수와 모든 멤버가 동일하면 YES 아니면 No를 리턴

-(id)firstObjectCommonWithArray:(NSArray*)otherArray
  : 일치하는것 찾으면 첫번째 인스턴스 리턴

-(NSArray*)arrayByAddingObject:(id)anObject
  : 인스턴스를 추가해서 만들어진 배열을 리턴

-(NSArray*)arrayByAddingObjectsFromArray:(NSArray*)anArray
  : 배열을 추가해서 만들어진 배열을 리턴

-(NSArray*)sortedArrayUsingSelector:(SEL)comparator // => 메서드 이름
  : comparator에 지정된 메서드를 기준으로 오름차순 정렬하여 리턴
--------------------------------------------------------
#import <foundation/NSObject.h>
#import <foundation/NSArray.h>
#import <foundation/NSString.h>

int main(int argc, char *argv[])
{
    NSArray * ar = [NSArray arrayWithObjects:@"D", @"F", @"E", nil];

    int i;
    for(i=0; i<[ar count]; ++i)
    {
       NSLog(@"%@",[ar objectAtIndex:i]);
    }

    ar = [ar arrayByAddingObject:@"C"];
    for(i=0; i<[ar count]; ++i)
    {
       NSLog(@"%@",[ar objectAtIndex:i]);
    }
   
    NSArray * ar1 = [NSArray arrayWithObjects:@"A", @"X", @"Y", nil];
    ar = [ar arrayByAddingObjectsFromArray:ar1];
    for(i=0; i<[ar count]; ++i)
    {
       NSLog(@"%@",[ar objectAtIndex:i]);
    }

    NSArray *sortedArray = [ar sortedArrayUsingSelector:@selector(compare:)];
    for(i=0; i<[sortedArray count]; ++i)
   
    {
       NSLog(@"%@",[sortedArray objectAtIndex:i]);
    }
    system("pause");
    return 0;
}
--------------------------------------------------------   

4. NSArray에 메시지 전송

  • 배열의 모든 요소가 특정한 메서드를 수행하게 하고자 하는 경우 사용

-(void)makeObjectsPerform:(SEL)aSelector
  ==> 리시버(메서드를 호출하는 인스턴스)의 모든 요소들에게 aSelector를 수행

-(void)makeObjectsPerform:(SEL)aSelector withObject:(id)anObj
                                                                    매개변수가 있음
--------------------------------------------------------   
#import <foundation/NSObject.h>
#import <foundation/NSArray.h>
#import <foundation/NSString.h>

@interface Test:NSObject
{int val;}
-(id)init:(int) v;
-(void)disp;
@end

@implementation Test
-(id)init:(int) v
{
   self = [super init];
   if(self != nil)
      val = v;
   return self;
}
-(void)disp
{
   NSLog(@"val:%d",val);
}
@end

int main(int argc, char *argv[])
{
   Test * Obj[3]; // 반드시 포인터 배열이어야 함
   // Test ** obj = malloc(sizeOf(Test*)*3); ==> 변수 사용가능, 동적할당 시 활용
   Obj[0] = [[Test alloc]init : 10];
   Obj[1] = [[Test alloc]init : 20];
   Obj[2] = [[Test alloc]init : 30];
  
   NSArray * ar = [NSArray arrayWithObjects:Obj count:3]; //C타입에서는 포인터배열명이거나 이중포인터명이어야함.
   [ar makeObjectsPerform:@selector(disp)];

   Test *temp[3]; // Test ** Temp; temp=malloc(sizeOf(Test*)*[ar count]);
   // sorting을 하고 싶으면 어떻게하지? 여기에는 compare이 없다.
   // compare를 재정의해서 사용
   /* -(int)compare:(Test *)obj
   {
      if(self->val < obj->val)
         return NSOrderedAscending;
   }
   */
   [ar getObjects:temp];
   int i;
   for(i=0; i<3; i++)
   [temp[i] disp];
   system("pause");
   return 0;
}
--------------------------------------------------------    
5. NSMutableArray

  • 배열의 요소인 객체를 제거하거나 삽입할 수 있는 메서드가 제공되는 NSArray의 하위 클래스

메서드
-(id)initWithCapacity:(NSUinteger)numItems // 매개변수 개수만큼 생성
-(void)addObject:(id)anObject
  // numItems의 개수를 가진 배열을 생성
-(void)addObjectFromArray:(NSArray*)otherArray
  // anObject를 마지막에 추가
  // 이 인수의 값이 nil이면 안됨
-(void)insertObject:(id)anObject atIndex:(NSUinteger)index
  // index 번째에 anObject추가
-(void)replace ObjectAtIndex:(NSUinteger)index withObject:(id)anObject
  // index 번째에 object를 anObject로 변경
-(void)setArray:(NSArray*)otherArray
  // 기존내용을 삭제하고 otherArray로 변경
-(void)removeAllObjects
  // 모든요소 제거
-(void)removeLastObjects
  // 마지막 요소 제거
-(void)removeObjectAtIndex:(NSUinteger)index
  // index번째 제거
-(void)removeObject:(id)anObject
  // anObject와 동일한 오브젝트 찾아서 제거 (메모리 주소가 같은)

6. 열거자(Enumerator)

  • C언어의 포인터 변수나 C++의 STL의 iterator처럼 컬렉션(데이터의모임)의 멤버들을 순서대로 접근할 수 있도록 제공해주는 개념

C 언어의 iterator
int ar[4];
int * it = ar;  // 배열 타입과 동일한 Data타입을 써야함.
 it++; // 자신의 데이터 타입 만큼 진행

  • C언어의 포인터와 다른점은 데이터타입에 상관없이 사용할 수 있다는 것입니다.
  • 모든 컬렉션의 데이터타입이 id타입이므로 실제 데이터타입을 지정하지 않아도 됩니다.
  • C++에서는 템플릿을 지정하는 경우가 일반적이지만 이 역시 필요없습니다.

사용방법
NSEnumerator * 인스턴스명 = [컬렉션명 objectEnumerator] // 앞에서부터 리턴
                                                         reverseObjectEnumerator //뒤에서부터 리턴
[인스턴스명 nextObject] => 다음 오브젝트로 진행. 다음이 없으면 nil 리턴

ex)Enumerator를 이용한 Mutable Array의 멤버접근 //insert, remove가 가능한 클래스
------------------------------------------------------------------------
#import <foundation/NSObject.h>
#import <foundation/NSArray.h>
#import <foundation/NSValue.h>
#import <foundation/NSEnumerator.h>
// 위의 클래스 호출은 #import <foundation/foundation.h> 로 대체가능

int main(int argc, char * argv[])
{
    NSMutableArray * mAr = [NSMutableArray arrayWithCapacity:10];
    //arrayWithCapacity 는 NSMutableArray에서만 받을 수 있음
    [mAr addObject : [NSNumber numberWithInteger:1]];
    [mAr addObject : [NSNumber numberWithInteger:3]];
    [mAr addObject : [NSNumber numberWithInteger:5]];
   
    NSEnumerator * it;
    NSNumber * obj;
    it = [mAr objectEnumerator];
    // mAr의 시작 바로위를 가리킴 (BOF)
    int i = 1;
    while((obj = [it nextObject])!=nil)
    {
       NSLog(@"%i 번째:%i",i++,[obj intValue]);
       //  NSLog(@"%i 번째:%@",i++,obj);
    }
    NSLog(@"역순으로 접근하기");
    it = [mAr reverseObjectEnumerator];
    i=1;
    while((obj=[it nextObject])!=nil)
    {
       NSLog(@"%i번째:%i",i++,[obj intValue]);
    }
    system("pause");
    return 0;
}
------------------------------------------------------------------------

:
Posted by 에너지발전소
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 에너지발전소