달력

1

« 2025/1 »

  • 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. 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. 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. 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 에너지발전소
2010. 3. 16. 15:53

[개발환경 구축] Mac OS X 설치기 - Step 5 아이폰2010. 3. 16. 15:53

확인을 해보니 제 CPU는 가상화 지원하는 모델입니다.
그런데 왜 안될까요?
vmware7 으로  snow leopard 돌릴 때 분명히 virtualization 가능한 intel cpu 임에도
mac os x is not supported with software virtual .. 이거 뜰 때 해결법은

"bios 설정가서 cpu 가 virtualization 이 enable 로 되어 있는지 확인하고
컴퓨터를 "완전히" 종료시킨뒤 다시 켜면 된다"고 하더군요.. ㅋㅋ.. 드디어.. 찾았군.. ^^

그러나 노트북 리부팅하여 CMOS에 들어간 결과 Virtualizaion 설정 메뉴자체가 없네요.. ㅠㅠ
또 구글신, 네이년을 미친듯이 뒤졌습니다.
참, 그전에 삼성 펌웨어 업데이트를 먼저했습니다.
이렇게 펌웨어가 있더군요.. 다운 받아 설치하였습니다.

그래도 못찾네요.. ㅠ

그런 와중에 희망을 찾습니다.
How to Enable Intel VT and AHCI on a Napa/Santa Rosa platform Phoenix BIOS Vaio laptop

설명은 이렇습니다.(나름 각색하였습니다.)

1. symcmos 및 dos text editor를 다운로드 받는다.
2. 부팅제작프로그램으로 간단한 DOS부팅 미디어를 만든다 (USB)
3. 부팅시 F2를 눌러 CMOS에 진입하고 External devices옵션을 enable 한다. (디폴트 세팅을 로드한다)
4. vaio 로고뜰때 ESC를 눌러 부팅디바이스를 골라 DOS 부팅한다.
5. "symcmos -v2 -lDefault.txt" 라고 명령어를 입력하여 Bios 정보를 추출한다.
6. 리부팅하고 도스모드로 들어간다.
7. DOS text editor 로 default.txt를 편집한다. ex. ed defalut.txt (여기서 ed 는 editor 실행파일입니다.)
For Napa SZs - R0112N0
AHCI: (015C) [0000] ---> (015C) [0001]
VT-x: (0354) [0000] ---> (0354) [0001]

For Santa Rosa SZs - R0122S5
AHCI: (0189) [0000] ---> (0189) [0001]
VT-x: (02F1) [0000] ---> (02F1) [0001]
8. 변경된 파일을 다른이름으로 저장합니다. ex.mod.txt
8. "symcmos -v2 -umod.txt" 을 실행하여 바이오스 업데이트를 실시합니다.

와~~ 이런게 있었구나.. 반가움도 잠시.. 이건 소니 노트북에 한정되어 있습니다. -_-;;
그럼 혹시 삼성노트북도 이런게 있지 않을까요?
또 구글신과 네이년을 뒤집니다.
저와 비슷한 어려움을 겪은 사람들이 많군요..
삼성 센스노트북 사용자모임을 찾아보니 삼성에서 VT 업데이트를 위해 펌웨어 업데이트를 결정했다고 합니다.
ㅎㅎ.. 다행이다 생각도 잠시.. 제 노트북 R21은 해당 펌웨어 업데이트에서 제외되었답니다.

제 M/B 모델은 R20/P400 인데 해당 메인보드의 바이오스 업데이트는 계획이 없다고 합니다.

이런 말도안되는.. .CPU는 VT-x를 지원하는데 메인보드는 지원하지 않는다?
그런데 해당 바이오스 업데이트에서 제외되었다.. 삼성서비스센터에 전화 및 메일 문의로 항의해 보았습니다.
바보 되었습니다. -_-;; 메일은 답변없고 전화답변은 원론만 이야기 합니다.

여기서 주저 앉고 싶습니다. 그러나 포기하지 않습니다.
지들이 안만들어주면 내가 만든다.. 또 찾습니다.

How-To unlock and enable hardware accelerated Virtualization Technology (VT) on a Sony VAIO laptop
(and possibly others)
와~~~ 소니에서만 가능하던 토큰 Index number를 찾아 줄 수 있는 방법을 찾았습니다.
이제 제 CMOS의 토큰 index number만 찾으면 symcmos로 CMOS 변경가능합니다.

대략 번역해보니

1. CMOS 롬을 읽어드려서
2. decompress 하고
3. decompress 된 파일을 읽어드려서
4. 이걸 찾고
BIOSCOD6.asm-18542-0000CB57  66B93A000000      mov ecx,0x3a
BIOSCOD6.asm:18543:0000CB5D  0F32              rdmsr
5. call word 0xf000:0x48db 을 찾고
6. 정확히 한줄위에 등록값이 다른 명령어를 찾으면
mov ax, 0x363
call word 0xf000:0x48db
7. mov ax, 0x363 <== 이건데.. 
   여기서 숫자 "363" 이 내 VT 바이오스 토큰 인덱스번호 라는 겁니다.

ㅋㅋㅋ 이건 봉 잡았습니다.
그런데 어떻게 롬을 읽어들이고 decompress  를 하고 해당 값을 찾죠? ㅠㅠ
또 삽질 들어갑니다. ㅎㅎ
이제 본격적으로 바이오스 크랙 들어갑니다.

1. 삼성펌웨어를 먼저 받아 놓습니다. (20081001144743500_12SP_WIN.exe)


2. Samsung Firmware Modules extractor 다운받아 unpack 합니다. (find_gz.exe)


3. phoenix BIOS Editor 2.13  다운받아 설치한 다음 unpack 시킨폴더로 가서
    phoenix BIOS Editor 이용하여 원본바이오스를 열어둡니다 (저의 경우는 12SP.WPH 입니다.)

4. phoenix BIOS 설치폴더로 이동하면 TEMP폴더가 생겼습니다. 여기서 decompress를 해주어야 합니니다.
ndisasm 을 다운로드 받고 설치합니다.
TEMP 폴더로 이동해서
"ndisasm 바이오스롬파일명"을 실행합니다. 여러개 있을 경우 여러개 모두 실행합니다.


그럼 아래와 같이 롬파일옆에 asm 파일이 생성됩니다.

5. 이제 디어셈블링된 asm 파일을 하나씩 열어서 다음 문자열을 찾습니다. 
    "mov ecx,0x3a"를 찾습니다. 제경우 아래와 같습니다.
0000C5EF  66B93A000000      mov ecx,0x3a
0000C5F5  0F32              rdmsr
6. 4번째 파일에서 드디어 찾았습니다.


7. rdmsr 다음 처음 나오는 "call word 0xf000:0x58df"를 확인합니다.
주의. 숫자는 각자의 시스템마다 다릅니다. 정확히 한줄위에 등록값이 다른 명령을 볼 수 있습니다.
0000C5FD  B87806            mov ax,0x678
0000C600  9ADF5800F0        call word 0xf000:0x58df
8. 이제 제 노트북의 VT Bios 토큰 색인을 찾았습니다.
    바로 위에 있는 숫자 "678"이 제 노트북 Sens R21Plus 의 색인번호입니다.

9. 이제 위에 있는 BIOS 업데이트 방식대로 업데이트 하면 됩니다.

10. BOOT 제작을 하기 위해 아래의 프로그램을 설치합니다.

11. SYMCMOS와 DOS text Editor을 준비합니다. (해당파일은 다운로드 받아 압축을 풀어놓습니다.)

12. BOOT USB 제작합니다.

다운로드 받아 압축 해제한 Boot.zip 경로를 지정합니다.

13. 리부팅시 F2를 눌러 CMOS에 진입하고 설정을 디폴트세팅 후 부팅 우선순위를 USB 로 지정합니다.

14. SYMCMOS -v2 -ldefault.txt 를 실행하면 default.txt에 BIOS 정보가 들어갑니다.

15. 리부팅하고 도스모드 들어갑니다.

16. 다운로드 한 에디터를 실행합니다. ex. ed default.txt

17. 678번째를 찾습니다. 0000 을 0001 로 변경합니다.

18. 다른이름으로 저장 합니다. ex. mod.txt

19. SYMCMOS -v2 -umod.txt 를 실행합니다. 바이오스가 업데이트 됩니다.

ㅋㅋㅋ.. 드디어 바이오스 업데이트 끝냈습니다.
그럼 리부팅 후 재 VT가 활성화 되었는지 확인합니다.



ㅎㅎ Locked ON 되었습니다.

마지막으로 VMware에서 OSX 실행되는지 확인합니다.

어렵고 긴 세팅과정이었네요..
간단하게 한글세팅하고 DOCK 변경하였습니다.

다음에는 개발환경 세팅 들어갑니다.
:
Posted by 에너지발전소