달력

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

'학습'에 해당되는 글 13

  1. 2010.05.18 [9일차-2]배열
  2. 2010.05.10 [1일차]윈도우에서+Objective-C(1-2)
  3. 2010.05.07 [1일차]윈도우에서+Objective-C(1-1)
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. 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 에너지발전소