* 오브젝티브 C의 클래스
- NSObject 클래스로부터 상속받는다
- 선언부와 구현부가 분리되어 있다
* 선언부
- static이나 const를 내부에서 선언할 수 없다. 오로지 멤버 변수만 가능.
* 구현부
* 클래스 선언과 사용
- 클래스는 무조건 포인터로 받는다
- 클래스명 * 객체명; <-- 객체 선언이지만 이 상태에서는 사용할 수 없다.
- 객체명 = 다른 객체; <-- Assign
- 객체명 = [다른 객체 retain]; <-- Retain. Assign과 동작결과는 같지만 복사 구문이 아니다. 참조 카운터만 1 감소시키며,
할당된 메모리는 그대로 남아 있다. 참조 카운터가 0이 되었을 때 비로소 메모리가 해제
된다. 메모리 누수의 주된 원인 중의 하나이므로 반드시 메모리 해제를 해 줄것. 특히
인터페이스 빌더 등을 사용할 때 빈번하게 일어난다.
- NSObject 클래스로부터 상속받는다
- 선언부와 구현부가 분리되어 있다
* 선언부
@interface 클래스명 : 상위클래스명 // 클래스는 일종의 Template
{
멤버변수 선언;
}
+- 메소드 선언;
@end
{
멤버변수 선언;
}
+- 메소드 선언;
@end
- static이나 const를 내부에서 선언할 수 없다. 오로지 멤버 변수만 가능.
* 구현부
@implements 클래스명
+- 메소드 구현
@end
+- 메소드 구현
@end
@class NSObject
#import <Foundation / Foundation.h>
#import <Foundation / Foundation.h>
* 클래스 선언과 사용
- 클래스는 무조건 포인터로 받는다
- 클래스명 * 객체명; <-- 객체 선언이지만 이 상태에서는 사용할 수 없다.
- 객체명 = 다른 객체; <-- Assign
- 객체명 = [다른 객체 retain]; <-- Retain. Assign과 동작결과는 같지만 복사 구문이 아니다. 참조 카운터만 1 감소시키며,
할당된 메모리는 그대로 남아 있다. 참조 카운터가 0이 되었을 때 비로소 메모리가 해제
된다. 메모리 누수의 주된 원인 중의 하나이므로 반드시 메모리 해제를 해 줄것. 특히
인터페이스 빌더 등을 사용할 때 빈번하게 일어난다.
- 객체명 = [다른 객체 copy];
- 객체명 = [클래스명 alloc]; <-- 순수하게 메모리 할당만 받는다
- 객체명 = [클래스명 new]; <-- 메모리 할당을 받고 초기화까지 해준다
- 객체명 = [클래스명 allocWithZone : (NSZone *)zone]; <-- 하나의 Heap을 생성한다. 아이폰4의 멀티태스킹 작업에
유리하게 사용될 것이다.
- 객체명 = [클래스명 ? with ?]; <-- with라는 단어가 나오면 무조건 생성자나 초기화 역할을 하는 것. 앞에 무엇이 붙는가가 중요하다. 앞에 init가 붙지 않으면 생성자이며, init가 붙으면 초기화이다.
* 같은 기능을 하는 메소드지만 여러가지 종류가 있을 수 있다. 예를 들면
awakeFromNib
loadview
viewDidLoad
와 같은 것들인데, 결과는 같지만 실행 우선순위와 메모리 해제 시점이 다르기 때문에 이에 따라서 먼저 실행되는 부분이 결과가 나타나지 않는 경우가 많이 발생한다. 이 경우에는 retain 이 사용된 부분을 가장 우선적으로 검토하는 것이 좋다.
* 클래스 추가
- XCode > File > New File > iPhone OS/Mac OS X > Cocoa Touch Class > Objective-C Class > NSObject를 선택.
- 이름을 결정하면 class.h와 class.m이 바로 만들어진다.
- 그러나 대개는 XCode의 왼쪽 구조창 중 class부분에서 오른쪽 클릭을 눌러 추가하는 방식이 일반적이다.
* 함수와 메소드의 차이
- 함수 : C 스타일 함수, 또는 매크로 함수
- 메소드 : 클래스 안에 선언된 함수
- 오브젝티브 C에서는 기본적으로 C 스타일의 함수는 만들지 않는다. 만든다면 거의 매크로임.
* 메소드 선언
- 메소드 이름 부분은 대개 "누구", "어디" 라는 타겟, 장소를 의미하게 된다.
- 별명 부분은 대개 "동작"을 의미한다.
- " - "나 " + "를 붙인다.
- " - "를 붙일 경우 의미가 인스턴스라는 뜻. 즉 멤버라는 뜻이 된다.
- " + "가 붙을 경우 클래스라는 뜻.
- 오버라이딩은 있지만 오버로딩은 없다.
* 변수
- 인스턴스(멤버) 변수 : 클래스 내에서 선언되는 변수. 이 인스턴스 변수에만 접근 지정자 선언이 가능하다. (메소드나 클래스에는 사용 불가. 메소드나 클래스는 무조건 public이다)
- 지역(Auto)변수 : 메소드 내에서 선언되어 그 안에서만 사용된다. Auto 키워드는 쓰거나 안쓰거나 자유지만 가능한 한 안쓰는 게 좋다.
- static 변수
- const 변수
- static과 const는 File의 개념이므로 큰 의미가 없다
- extern은 자료 교환을 위한 타입이지만 없어지지 않으므로 위험하다. (윈도우 모바일의 DLL과 비슷함. 한번 로드하면 메모리 해제를 해도 사용만 못하게 될 뿐 계속 남아있으므로 문제가 크다. 거의 사용할 필요가 없음.)
* getter와 setter의 개념
- 멤버 변수와 메소드의 이름이 같아도 된다(오브젝티브 C만의 특성).
- getter는 멤버 변수의 이름과 동일하게 사용하는 것을 권장한다.
- setter는 set 변수명 으로 사용하는 것을 권장한다. 변수명의 첫 글자는 대문자.
* 프로퍼티
- 위 방식은 메소드 갯수가 너무 많아지는 단점이 있기 때문에 도입된 것이 프로퍼티이다
- setter와 getter 를 대신해서 사용할 수 있는 개념
- 선언 :
이렇게 씀으로서 setter와 getter의 선언이 완료된다.
예 : @property int result;
이것은 스레드 관련 권한의 처리도 겸하기 있기 때문에 권장되는 기능이다.
- 구현 :
property문을 보고 구현해주는 역할만을 함.
예 : @synthersize result;
* 프로퍼티의 특성
- non atomic : 멀티 스레드를 제어하지 않는다. (속도를 빠르게 함) 지금까지는 아이폰에서 멀티태스킹을 할 필요가 없었기 때문에 거의 대부분이 이것을 사용해 퍼포먼스를 좋게 했었지만 앞으로는 이것을 지양해야 할 것이다.
- setter, getter : 특성은 존재하지만 거의 안쓴다
- assign, retain, copy : 객체에만 적용된다. 일반 value형 변수들은 값만을 사용하므로 의미가 없고 heap 메모리를 사용할 때에만 필요하다. copy는 "얕은 복사"라고 많이 표현하는데, 배열의 마지막 데이터가 아니라 첫번째 데이터만을 복사한다. 전체를 다 복사하는 "깊은 복사"는 archiving이라고 구분하여 표현한다.
- read only, read//write : 읽기 전용 속성과 읽기/쓰기 속성. 이런 것이 있기 때문에 const를 사용하지 않는다. 읽기/쓰기 속성은 디폴트 값으로서, 따로 지정해 주지 않으면 이 속성이 되므로 거의 쓰지 않는다.
- 위 속성들은 " , " 기호로 함께 사용할 수 있다. 다만 그 특성상 함께 쓸 수 없는 것들도 있다.
- " . " 기호를 이용해서 접근 가능. " = " 기호(assign, 즉 할당 연산자)의 왼쪽에 " . " 기호가 사용되면 자동적으로 set이 호출된다.
즉,
[Obj setResult : 10];
위 구문은
Obj.result = 10;
이렇게도 사용할 수 있다.
- @synthersize _result = result; <-- C에서 많이 사용되는 관습적 문법. 가능은 하지만 오브젝티브 C에서는 일반적인 문법은 아니다.
* Static 변수
- 클래스 내부에 생성해서 모든 객체가 공유하기 위한 변수
- 근본적으로 객체가 사용하게 된다.
- 객체들 간의 통신에 사용한다.
- 객체명 = [클래스명 alloc]; <-- 순수하게 메모리 할당만 받는다
- 객체명 = [클래스명 new]; <-- 메모리 할당을 받고 초기화까지 해준다
- 객체명 = [클래스명 allocWithZone : (NSZone *)zone]; <-- 하나의 Heap을 생성한다. 아이폰4의 멀티태스킹 작업에
유리하게 사용될 것이다.
- 객체명 = [클래스명 ? with ?]; <-- with라는 단어가 나오면 무조건 생성자나 초기화 역할을 하는 것. 앞에 무엇이 붙는가가 중요하다. 앞에 init가 붙지 않으면 생성자이며, init가 붙으면 초기화이다.
* 같은 기능을 하는 메소드지만 여러가지 종류가 있을 수 있다. 예를 들면
awakeFromNib
loadview
viewDidLoad
와 같은 것들인데, 결과는 같지만 실행 우선순위와 메모리 해제 시점이 다르기 때문에 이에 따라서 먼저 실행되는 부분이 결과가 나타나지 않는 경우가 많이 발생한다. 이 경우에는 retain 이 사용된 부분을 가장 우선적으로 검토하는 것이 좋다.
* 클래스 추가
- XCode > File > New File > iPhone OS/Mac OS X > Cocoa Touch Class > Objective-C Class > NSObject를 선택.
- 이름을 결정하면 class.h와 class.m이 바로 만들어진다.
- 그러나 대개는 XCode의 왼쪽 구조창 중 class부분에서 오른쪽 클릭을 눌러 추가하는 방식이 일반적이다.
* 함수와 메소드의 차이
- 함수 : C 스타일 함수, 또는 매크로 함수
- 메소드 : 클래스 안에 선언된 함수
- 오브젝티브 C에서는 기본적으로 C 스타일의 함수는 만들지 않는다. 만든다면 거의 매크로임.
* 메소드 선언
(결과형) 메소드 이름 : (자료형) 매개변수 이름 별명 : (자료형) 매개변수 이름
예) -(void) UIApplication : int XXX Section int YYY
예) -(void) UIApplication : int XXX Section int YYY
- 메소드 이름 부분은 대개 "누구", "어디" 라는 타겟, 장소를 의미하게 된다.
- 별명 부분은 대개 "동작"을 의미한다.
- " - "나 " + "를 붙인다.
- " - "를 붙일 경우 의미가 인스턴스라는 뜻. 즉 멤버라는 뜻이 된다.
- " + "가 붙을 경우 클래스라는 뜻.
- 오버라이딩은 있지만 오버로딩은 없다.
* 변수
- 인스턴스(멤버) 변수 : 클래스 내에서 선언되는 변수. 이 인스턴스 변수에만 접근 지정자 선언이 가능하다. (메소드나 클래스에는 사용 불가. 메소드나 클래스는 무조건 public이다)
@private : 클래스 내부에서만 사용가능
@protected : 클래스 내부에서, 그리고 상속받은 클래스에서도 사용가능
@public : 클래스 내부, 상속받은 클래스, 객체에서 사용가능
@protected : 클래스 내부에서, 그리고 상속받은 클래스에서도 사용가능
@public : 클래스 내부, 상속받은 클래스, 객체에서 사용가능
- 지역(Auto)변수 : 메소드 내에서 선언되어 그 안에서만 사용된다. Auto 키워드는 쓰거나 안쓰거나 자유지만 가능한 한 안쓰는 게 좋다.
- static 변수
- const 변수
- static과 const는 File의 개념이므로 큰 의미가 없다
- extern은 자료 교환을 위한 타입이지만 없어지지 않으므로 위험하다. (윈도우 모바일의 DLL과 비슷함. 한번 로드하면 메모리 해제를 해도 사용만 못하게 될 뿐 계속 남아있으므로 문제가 크다. 거의 사용할 필요가 없음.)
* getter와 setter의 개념
- 멤버 변수와 메소드의 이름이 같아도 된다(오브젝티브 C만의 특성).
- getter는 멤버 변수의 이름과 동일하게 사용하는 것을 권장한다.
- setter는 set 변수명 으로 사용하는 것을 권장한다. 변수명의 첫 글자는 대문자.
{
int result;
}
-(int) result; // <-- getter
-(void) setResult : (int) temp; // <-- setter
int result;
}
-(int) result; // <-- getter
-(void) setResult : (int) temp; // <-- setter
-(int) result {return result;} // <-- getter
-(void) setResult : (int) temp {result = temp;} // <-- setter
-(void) setResult : (int) temp {result = temp;} // <-- setter
[Obj setResult : 10];
NSLog(@"%d", [Obj result]);
NSLog(@"%d", [Obj result]);
* 프로퍼티
- 위 방식은 메소드 갯수가 너무 많아지는 단점이 있기 때문에 도입된 것이 프로퍼티이다
- setter와 getter 를 대신해서 사용할 수 있는 개념
- 선언 :
@property (특성) 자료형 변수명;
이렇게 씀으로서 setter와 getter의 선언이 완료된다.
예 : @property int result;
이것은 스레드 관련 권한의 처리도 겸하기 있기 때문에 권장되는 기능이다.
- 구현 :
@synthersize 변수명;
property문을 보고 구현해주는 역할만을 함.
예 : @synthersize result;
* 프로퍼티의 특성
- non atomic : 멀티 스레드를 제어하지 않는다. (속도를 빠르게 함) 지금까지는 아이폰에서 멀티태스킹을 할 필요가 없었기 때문에 거의 대부분이 이것을 사용해 퍼포먼스를 좋게 했었지만 앞으로는 이것을 지양해야 할 것이다.
- setter, getter : 특성은 존재하지만 거의 안쓴다
- assign, retain, copy : 객체에만 적용된다. 일반 value형 변수들은 값만을 사용하므로 의미가 없고 heap 메모리를 사용할 때에만 필요하다. copy는 "얕은 복사"라고 많이 표현하는데, 배열의 마지막 데이터가 아니라 첫번째 데이터만을 복사한다. 전체를 다 복사하는 "깊은 복사"는 archiving이라고 구분하여 표현한다.
- read only, read//write : 읽기 전용 속성과 읽기/쓰기 속성. 이런 것이 있기 때문에 const를 사용하지 않는다. 읽기/쓰기 속성은 디폴트 값으로서, 따로 지정해 주지 않으면 이 속성이 되므로 거의 쓰지 않는다.
- 위 속성들은 " , " 기호로 함께 사용할 수 있다. 다만 그 특성상 함께 쓸 수 없는 것들도 있다.
- " . " 기호를 이용해서 접근 가능. " = " 기호(assign, 즉 할당 연산자)의 왼쪽에 " . " 기호가 사용되면 자동적으로 set이 호출된다.
즉,
[Obj setResult : 10];
위 구문은
Obj.result = 10;
이렇게도 사용할 수 있다.
- @synthersize _result = result; <-- C에서 많이 사용되는 관습적 문법. 가능은 하지만 오브젝티브 C에서는 일반적인 문법은 아니다.
* Static 변수
- 클래스 내부에 생성해서 모든 객체가 공유하기 위한 변수
- 근본적으로 객체가 사용하게 된다.
- 객체들 간의 통신에 사용한다.
static int sequence = 1;
-(id) init
{
self = [super init];
if(self != nil) // 메모리를 제대로 받았는가 검사
{
result = sequence++;
{
return self;
}
{
self = [super init];
if(self != nil) // 메모리를 제대로 받았는가 검사
{
result = sequence++;
{
return self;
}
'프로그래밍 > Objective-C' 카테고리의 다른 글
중앙정보학원 아이폰과정 4일차 - 2010년 7월 8일 (0) | 2010.07.08 |
---|---|
중앙정보학원 아이폰과정 3일차 - 2010년 7월 7일 (0) | 2010.07.07 |
중앙정보학원 아이폰과정 1일차 - 2010년 7월 5일 (0) | 2010.07.05 |
한글 인코딩 변경과 구글날씨 RSS (0) | 2010.06.25 |
아이폰 흔들기(shaking) 검사 (0) | 2010.06.25 |