Objective-C
[연산자 제어문]
* C, C++ : include
  Objective-C : #import <stdio.h>  여러번 나와도 한번만 import 됨
* Data Type
 - int(4), char(1), float(4), double(8)
 - Id : 객체 포인터 주소 저장 데이터 타입, 어떤 객체라도 저장가능
 - SEL : C언어의 함수 포인터, @selector의 값을 저장할 수 있는 데이터 타입
 
 
* Windows에서 개발 할때 Dev-C++ 툴 사용

* system("PAUSE"); //잠시 정지하기
 
[클래스]
* 클래스내 변수 : 멤버 변수 -> 인스턴스 변수 (Objective-C)
* 클래스내 함수 : 멤버 함수 -> 메서드 (Objective-C)
* @Interface : 메서드, 인스턴스 변수 선언, 상속 선언
  @implementation : 메서드의 기능 구현
  Main : @implementation의 메서드 실행
 
* -(void) print;
  -(void) setValue1:(int)d; //인자값을 넣지 않는다. 하나의 인자
  -(void) setValue1:(int)d Value2:(int)f; //첫번째는 인자값을 넣지 않는다.
  - : 인스턴스 메서드
  + : 클래스 메서드 : 객체생성과 관계없이 호출가능 static
  () : 리턴형
 
* 메서드 호출
  A.func() -> [A func]
 
  [] : 메서드 호출
 
* 포인트 변수 생성
  Calculate *myCalculate;
 
  객체 초기화
  myCalculate = [Calculate alloc];
  myCalculate = [myCalculate init];
 
 
  //인자있는 메서드 호출
  [myCalculate setValue1:12];
  [myCalculate totalSetValue:12 value2:24];
 
* Calculate *myCalculate = [[Calculate alloc] init];

 
* @private, @protected (기본), @public
 
[클래스 상속 - 초기화]
* 슈퍼클래스 메서드 호출
  [super value1];
  [super print];
 
* 자신의 클래스 메서드 호출, this
  [self value1];
 
* nil : 아무것도 없는 변수, null
  NIL : 아무것도 없는 객체
  nil = NIL 같이 씀

[클래스 확장 (카테고리)]
* 상속 : 수식적 개념
* 카테고리 : 수평적 클래스 확장
  기존(원래) 클래스 수정없이 다른 메소드를 사용 가능 메서드만 추가 가능

* 카테고리 구현 : 헤더, 구현 파일 따로 작성
  @interface 클래스명(카테고리명)
  @implementation 클래스명(카테고리명)
 

[클래스 확장 (포싱)]
* Posing[v] ~ as sb (남을 속이기 위해) ~인 체하다

* [CalculatePosing poseAs:[Calculate class]];
  Calculate 클래스는 CalculatePosing 클래스가 된다.
 
 
[클래스 확장 (프로토콜)]
* 블랙박스 개념, 내부구조는 관심없음

* 여러 클래스에서 공통적인 기능을 하는 메서드를 추려낸다. -> 프로토콜

* 자바의 인터페이스나 C++의 가상클래스와 비슷한 개념

* @protocol 프로토콜명
  @interface 클래스명:super클래스<프로토콜1,프로토콜2,...>
 
 
[다형성 다이나믹 바인딩]
* 다형성 : 같은 이름의 메서드가 서로 다른 기능을 한다.

* id 타입을 통한 동적 바인딩 : 모든 객체를 id타입의 변수로 받을 수 있다. -> 코딩량을 최대 1/10이상 줄여 줌

* 정적 바인딩 : 명확하게 자료형을 선언하는 것

* 동적 바인딩 : 실행파일 만들때 마지막까지 객체의 형에 대한 정보를 확정하지 않다가, 객체의 메서드가
  호출될었을때 비로서 컴파일러가 객체의 형에 대해서 알게 되는 구조

* Isa 변수 : 모든 객체는 Object로부터 상속받은 Isa라는 변수를 가지고 있다.
  단순하게 현재의 객체가 어떤 객체인지를 알려주는 정보를 담고 있는 변수
 
* selector를 통한 동적 메서드 호출
  객체의 메서드를 동적으로 호출 할수 있다.
  함수 포인터와 동일한 개념
  Selector는 Sel형 변수에 저장
 
  SEL sel1, sel2;
  sel1 = @selector(print);
  sel2 = @selector(print2);

  [obj perform:sel1];
  perform: Object에서 상속받은 메서드

 

[Foundation 프레임워크]

* Cocoa : MFC와 같은 기초 프레임워크

  Foundation Framework : Mac에서 쓰이는 Objective-C 라이브러리 프레임워크
  Application Framework : Cocoa 환경에서 GUI를 담당하는 프레임워크
  System Framework : Mac OS 커널 부분
 
* GNU step Dev-C++
  Windows : C:\GNUstep\GNUstep\System\Library\Headers\Foundation
  Mac : /System/Library/Frameworks/Foundation.framework

* #import<Foundation/NSObject.h>

* 읽기 전용 : NSArray, NSData, NSDictionary, NSSet, NSString -> 변환값 리턴
  자기 자신을 변화시킴 : NSMutableArray, NSMutableData, NSMutableDictionary, NSMutableSet, NSMutableString -> void형 리턴
 

* NSRange 구조체
  범위값을 가지고 있는 구조체, 보통 범위안에 있는 무언가를 변화시킬때 많이 쓰임
* NSPoint 구조체
  보통 x,y좌표 값을 객체에 넘길때 씀
* NSSize 구조체
  가로길이, 높이를 가지고 있는 구조체
 
* enum
  NSComparisonResult
 

[NSObject 클래스]

* Foundation 프레임워크 Root 클래스 : 대부분 클래스의 부모
  객체의 생성과 해제를 담당
  추상적인 Base클래스로 이해
 
* -(class) class
    현재 객체의 class를 리턴
  -(id) self
    객체 자체를 리턴
  -(BOOL) isMemberOfClass : (Class) aClass
    현재 객체가 인수 클래스의 인스턴스 인지 확인
  -(BOOL) isKindOfClass : (Class) aClass
    현재 객체가 인수 클래스의 인스턴스 인지, 인수 클래스의 서브클래스 인스턴스인지 확인
  -(class)superclass
    현재 객체가 상속한 슈퍼클래스 클래스 객체 리턴
  +(class)superclass
    클래스의 슈퍼클래스 객체를 리턴
  -(BOOL)isEqual:anObject;
    현재객체와 anObject가 같은 객체인 비교
* +(id)alloc
    지정된 클래스의 인스턴스 생성
  +(id)new
    Alloc+init 조합, 보통은 인스턴스 공유를 위해 쓰임
  +(void)initialize
    클래스의 초기화담당, 프로그램에서 직접 호출하면 안됨
  -(id)retain
    현재 객체의 레퍼런스 카운트 1증가, 객체 자체 리턴
  -(id)autorelease
    현재 객체를 자동 해제풀에 추가, 객체자체 리턴
  -(unsigned)retaincount
    현재 객체의 레퍼런스 카운트값 리턴
  -(oneway void)release
    현재의 객체를 해제, (oneway : 함수 끝날때까지 기다리지 말고 넘어가라. void와 함께만 쓰임)
  -(void)dealloc
    현재 객체들의 모두 release되었을때 실행됨


[NSString 클래스]

* #import<foundation/NSString.h>

* NSString *string = @"I'm happy";
  내부적으로 Unicode화 해서 사용하기 때문에 @사용
 
* -(id)initWithString:(NSString*)string;
    문자열대입을 통한 초기화
  -(unsgned int)length;
    객체의 문자열 길이 리턴
  -(const char*)cString;
    객체의 문자열 반환
  -(NSArray*)componentsSeparatedByString:(NSString*)separator;
    문자열을 separator로 나눈 후 NSArray형태로 반환
  -(NSString*)substringFromIndex:(unsigned int)index;
    Index부터 끝까지 문자 반환
  -(NSString*)substringFromRange:(NSRange)aRange;
    aRange범위의 문자열 반환
  -(NSString*)substringToIndex:(unsigend int)index;
    처음부터 index위치까지의 문자열반환
  -(BOOL)isEqualToString:(NSString*)aString;
    aString문자열과 동일한지 반환
  -(NSComparisonResult)compare
    string비교
  -(NSString*)capitalizedString
    각 단어의 첫글자만 대문자로, 나머지는 소문자로 변환
  -(NSString*)lowercaseString;
    소문자화
  -(NSString*)uppercaseString;
    대문자화
  -(NSRange)rangeOfString
    String이 포함된 범위 반환
  -(NSString*)stringByAppendingString
    현재 문자열의 뒤에 aString을 붙여서 반환
 
* NSMutableString : 객체의 문자열 내용을 바꾸려면 NSMutableString 클래스를 사용
  #import<foundation/NSString.h>
 
  -(id)initWithCapacity
    문자열길이로 초기화한다. 꼭 일치할 필요는 없다
  -(void)appendString
    현재 객체 문자열에 aString을 더한다.
  -(void)deleteCharactersInRange
    현재 객체 문자열에서 range 범위의 문자열을 지운다.
  -(void)insertString
    loc위치에 aString문자열 삽입
  -(void)replaceCharactersInRange
    Range범위의 문자열을 aString으로 바꿈
  -(void)setString
    aString으로 바꿈


[NSValue 클래스]

* wraper class

* 배열,사전,집합 객체는 객체형을 요소로 받음 (NSString, NSSet, NSArray,...)
  char,float,double,int등의 자료형을 Foundation 기반의 프로그램에서는 메서드나 자나 요소로 못 씀
  NSValue, NSNumber는 이런 문제점을 보완하기 위해 char,float,double,int등의 자료형을 객체로 만들어주는 클래스
 
* NSValue -> NSNumber 상속

* NSNull 클래스: nil도 foundation 의 인자,요소로 못 넘김, NSNull로 넘겨야 함

* +(NSNumber*)numberWithBool
    Boolen형을 NSNumber형으로
  +(NSNumber*)numberWithChar
  +(NSNumber*)numberWithDouble
  +(NSNumber*)numberWithFloat
  +(NSNumber*)numberWithInt
  -(BOOL)boolValue;
    Boolean자료 리턴
  -(signed char)charValue;
  -(double)doubleValue;
  -(float)floatValue;
  -(signed int)intValue;
 
[NSArray 클래스]

* #import<Foundation/NSArray.h>

* NSArray는 객체만 담을 수 있다.
  @"I'm happy" - (O) 문자열 객체
  NSValue, NSNull,
  nil은 못넣음
* 배열의 끝에는 nil을 넣는다.

* NSArray는 변경 불가능

* -(id)initWithArray
    array배열로 초기화
  -(id)initWithObjects
    객체들을 인자로 받아서 초기화
  -(id)lastObject;
    마지막 객체를 리턴
  -(BOOL)isEqualToArray
    비교 일치여부 리턴
  -(id)objectAtIndex
    index위치의 객체 리턴
  -(unsigned)count
  -(NSString*)componentsJoinedByString
    NSString요소만 배열로 담고 있는 경우 NSString 각 요소사이에 separator를 붙여서 NSString형으로 리턴
   
* NSMutalbArray
  #import<Foundation/NSArray.h>

  -(void)addObject
  -(void)addObjectsFromArray
  -(void)insertObject
  -(void)removeObjectAtIndex
  -(void)replaceObjectAtIndex
  -(void)replaceObjectsInRange
  -(void)setArray
  -(void)removeAllObjects
  -(void)removeLastObject
  -(void)removeObject
 
 
[NSEnumerator 클래스]

* #import<foundation/NSEnumerator.h>

* NSArray, NSSet, NSDictionary 객체에 순서대로 접근할 수 있는 기능 제공

* 프로그램 종료시 해제

* -(NSArray*)allObjects
    배열형태로 리턴
  -(id)nextObject
    다음객체 리턴
   

[NSSet 클래스]

* #import<foundation/NSSet.h>

* Unique한 객체들의 그룹, 순서 없음
  NSArray는 인덱스를 통해, NSDictionary는 키를 통해 접근
  NSSet는 NSEnumerator로 접근

* -(id)initWithArray
  -(id)initWithObjects
  +(id)setWithArray
  +(id)setWithObject
  +(id)setWithObjects
  +(BOOL)containsObject
    요소 중에 존재 여부 반환
  -(NSArray*)allObjects
  -(unsigned)count
  -(BOOL)isEqualToSet
    객체와 동일한지 확인
  -(BOOL)isSubsetOfSet
    객체가 있는 리턴
  -(NSEnumerator*)objectEnumerator
    현재 객체를 NSEnumerator형으로 리턴

* NSMutableSet
  #import<foundation/NSSet.h>
 
  -(void)addObject
  -(void)addObjectsFromArray
  -(void)intersectSet
    교집합 요소를 현재 객체에 대입
  -(void)unionSet
    합집합을 대입
  -(void)removeAllObjects
  -(void)removeObject


[NSDictionary 클래스]

* #import<foundation/NSDictionary.h>

* 키와 값의 집합을 데이터로 저장하는 객체

* -(id)initWithDictionary
  -(id)initWithObjects
    키,자료 배열의 크기 반드시 일치
  -(id)initWithObjectsAndKeys
    키,자료,키,자료 로 초기화 -> 짝수개가 와야 함
  -(BOOL)isEqualToDictionary
    현재 객체와 동일한지 리턴
  -(NSArry*)allKeys
  -(NSArry*)allValues
  -(unsigned)count
  -(NSEnumerator*)keyEnumerator
    key만 NSEnumertor형으로 리턴
  -(id)objectForKey
    key에 맞는 요소 리턴
 
* NSMutableDictionary
  #import<foundation/NSDictionary.h>
 
  -(id)initWithCapacity
  +(id)dictionaryWithCapacity
  -(void)addEntriesFromDictionary
  -(void)removeAllObjects
  -(void)removeObjectForKey
  -(void)removeObjectsForKeys
  -(void)setObject
  -(void)setDictionary
  -(void)
 

[NSFileManager 클래스]

* 파일, 디렉토리를 다루는 주 클래스
  생성,변경,이동,삭제,복사

* #import<Foundation/NSFileManager.h>

* 파일관련
  +(NSFileManager*)defaultManager
  -(BOOL)fileExistsAtPath
  -(BOOL)copyPath
  -(BOOL)contentsEqualAtPath
  -(BOOL)movePath
  -(BOOL)removeFileAtPath
 
* 디렉토리 관련
  -(NSString*)currentDirectoryPath
  -(BOOL)changeCurrentDirectoryPath
  -(BOOL)createDirectoryAtPath
  -(NSArray*)directoryContentsAtPath
  -(BOOL)removeFileAtPath
  -(BOOL)movePath
 

 
[Memory Management]

* 객체 생성, 소멸

  - 기존
    Calculate *mycalculate = [[Calculate alloc] init]; //생성
    ...
    [mycalculate free]; //해제
   
  - Foundation 클래스
    NSString* myName = [[NSString alloc] initWithString:@"테스트"]; //생성
    ...
    [myName release];//해제

* 자동으로 해제되는 객체들

  - 사용자가 만든 경우 : alloc -> release
 
  - 명시적으로 해제하지 않아도 되는 메서드들이 있음
    예를들어 NSString에서 stringWithFormat 메서드를 사용할 경우 alloc을 사용하지 않아도 객체가 생성됨
    autorelease pool이 이렇게 생성되는 메모리를 자동 해제해 준다.
    개발자는 autorelease pool만 만들어주면 됨

* NSAutoreleasePool (중요)
  프로그램이 끝나는 시점에 자동해제됨
  너무 많으면 해제될때 부하가 걸릴 수 있음

  여기에 넣으면 프로그램 중간에 해제하면 안된다.
  마지막까지 메모리를 잠기게 하는 기능이라고 보면 됨
  객체의 해제 시점을 마지막으로 미루는 것도 됨
 
  반드시 선언해야 하는 것
 
  int main(void)
  {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
    .,,
    [pool release];
    return 0;
  }
   
* 메모리 관리
  예) 코엑스 주차장 관리하기
  2천대 주차 가능, 들어갈때 번호표를 뽑음, 나올때 돈을 내고 번호표 반납
  문을 닫을때 차가 한대도 없어야 함
 
  경비원이 퇴근시 주차장 셔터를 내려야 하는데 주차장에 주차여부 쉽게 아는 방법?
  뽑아간 번호표 개수, 반납받은 번호표 개수를 세어봄
 
  번호표를 뽑는다 = 객체를 생성
  번호표 반납 = 객체 해제
  reference count로 관리
 
* reference count
  alloc, retain(보존), new, copy : 1증가
  release : 1감소
 
  autorelease를 했을때는 감소하지 않음
 
  retain : 객체의 소유권을 갖는다. call by reference 개념 때문에 나온 개념
 

* dealloc
  모든 객체가 release되면 마지막에 호출된다
  가장 마지막에 자동으로 호출됨


* 메서드안에서 객체를 생성해서 리턴하는 경우 autorelease로 리턴한다.
  -(NSString*)ReturnNSString {
    NSString *rec = [[NSString alloc] initWithString:@"I am happy"];
    [ret autorelease];
    return ret;
   }

 

[Copy, MutableCopy 메서드]

* 프로토콜이다.

* Foundation 프레임워크 클래스들은 <NSCopying>, <NSMutableCopying>을 모두 따름
  @interface NSString:NSObject<NSCoding, NSCoping, NSMutableCopying>
 
* Copy, MutableCopy 메서드
  retaincount가 1증가
 
* MutableCopy는 Mutable형을 카피할때 사용

* <NSCopying>프로토콜 선언
  @implementation 섹션에 copyWithZone를 구현한다.
  [객체 copy]로 호출
 
  copy가 copyWithZone을 내부적으로 호출
 

 

+ Recent posts