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을 내부적으로 호출