<출처 : http://wwwww.kr/30792>
- ID
- Objective-C 언어는 runtime 시에 객체나 메서드가 변할 수 있으므로 기존의 static typing 이외의 방법이 필요합니다.
- Objective-C 에는 모든 객체를 전부 포인팅할 수 있는 타입을 새로 정의해 놓았는데 id 입니다.
- C언어의 주소의 개념과 id는 유사합니다.
- id타입을 사용하기 위해 Objective-C에서는 모든 객체에게 isa 라는 instance variable을 멤버로 소유하게 했습니다.
- 실제 그 객체가 사용할 클래스 객체의 id를 저장하고 있는데 이것을 이용해서 runtime 시에 데이터 타입을 알아낼 수 있게 됩니다.
- C언어의 void *과 유사하지만 void *과는 조금 다릅니다.
- void * 은 실제 사용을 하고자 하는 경우 형 변환을 해서 사용해야 하지만 id는 형 변환 없이도 자유 자재로 사용할 수 있습니다.
- id에 클래스를 자료형으로 갖는 데이터가 아닌 데이터의 주소를 대입할 수 있지만 Warning이 발생합니다.
오브젝티브c에서 모든 데이터타입의 주소(참조형)를 대입할 수 있는 자료형 => 형 변환 수행 없이 사용이 가능
int n=10;
id temp=&n;
NSLog(@"%d %d", *temp, temp); // 여기서 10이 n의 주소값
int * np //static typing,
= id np //dynamic typing //이렇게 쳐도 되지만 가독성이 떨어지고 속도가 느려짐
오브젝티브씨는 주소 라는 표현보다 아이디라고 표현한다.
01.
// idtest.m
02.
#import <Foundation/Foundation.h>
03.
int
main (
int
argc,
const
char
* argv[])
04.
{
05.
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
06.
07.
//id라는 데이터 타입은 모든 데이터 타입의 주소를 저장할 수 있는 타입입니다.
08.
//isa라는 인스턴스 변수를 통해 자신의 원래 데이터 타입을 찾을 수 있으므로
09.
//형변환없이 바로 사용합니다.
10.
int
n = 10;
11.
id temp = &n;
12.
NSLog(@
"temp가 가리키는 주소 : %d temp가 가리키는 값:%d"
, temp, *temp);
13.
//void 포인터는 모든 데이터 타입의 주소를 대입할 수 는 있지만
14.
//사용을 할 때는 형변환을 해서 원래의 타입을 찾아서 사용해야 합니다.
15.
void
*vp = &n;
16.
NSLog(@
" vp가 가리키는 주소 : %d vp가 가리키는 값:%d"
, vp, *((
int
*)vp));
17.
18.
[pool drain];
19.
return
0;
20.
}
01.
//OperatorTest.m 연산자 테스트
02.
#import <Foundation/Foundation.h>
03.
int
main(
int
argc,
char
*argv[])
04.
{
05.
int
n = 10;
06.
//정수의 메모리 사이즈는 4바이트
07.
NSLog(@
"정수의 메모리 크기 : %d 바이트"
,
sizeof
n);
08.
float
f = 10.7;
09.
n = f;
10.
//실수를 정수에 대입해서 출력하므로 10 - 소수 버림
11.
NSLog(@
"n의 값: %d"
,n);
12.
13.
//실수에 0.5를 더해서 정수에 대입하므로 11 - 소수 첫째 자리 반올림
14.
n = (f+0.5);
15.
NSLog(@
"n의 값: %d"
,n);
16.
//11을 왼쪽으로 2번 shift 하므로 44
17.
n = n << 2;
18.
NSLog(@
"n의 값: %d"
,n);
19.
return
0;
20.
}
=================================================================================================
연산자
=================================================================================================
(): 연산의 우선 순위 변경
[]:배열의 첨자 또는 메서드 호출
->:구조체의 멤버 필드 참조
. :구조체의 멤버나 객체의 프로퍼티 호출
- : 2의 보수
+:양수
++:1증가
–:1감소
!: NOT
~:1의 보수
*:포인터 변수의 데이터 참조
&: 일반 변수의 주소
sizeof: 메모리 크기
(자료형): 강제 형 변환
*:곱셈
/:나눗셈
%:나머지
+: 덧셈
-: 뺄셈
<<:왼쪽 시프트
>>:오른쪽 시프트
<: 작다
<=: 작거나 같다
>: 크다
>=: 크거나 같다
==: 같다
!=: 다르다
&: 비트 AND
^: 비트 XOR
|: 비트 OR
&&: 논리 AND
||: 논리 OR
?: : 삼항 연산자
=: 할당 연산자
*=, /=, %=, +=
-=, &=, ^=, |=
<<=, >>=
,: 컴마 연산자
01.
#import <Foundation/Foundation.h>
02.
int
main(
int
argc,
char
*argv[])
03.
{
04.
int
n = 10;
05.
NSLog(@
"정수의 메모리 크기 : %d 바이트"
,
sizeof
n);
06.
float
f = 10.7;
07.
n = f;
08.
NSLog(@
"n의 값: %d"
,n);
09.
n = (f+0.5);
10.
NSLog(@
"n의 값: %d"
,n);
11.
n = n << 2;
12.
NSLog(@
"n의 값: %d"
,n);
13.
return
0;
14.
}
=================================================================================================
파일의 구조
=================================================================================================
//classTest.m
1.objective-c의 클래스
- 반드시 선언부와 구현부가 분리되어야 함
.h 파일과 .m 파일
- 반드시 NSObject 또는 NSProxy로부터 상속받아야 함
cocoa touch
NSObject -> isa때문.
2.클래스 선언(.h)
형식 :
================================
@ interface 클래스이름 : 상속하는 클래스 <프로토콜>
{
인스턴스 변수선언;
}
프로퍼티 지정;
메서드 선언;
@end
================================
3.클래스 구현(.m)
================================
@implementation 클래스명
Synthesize 구현
메서드 구현
================================
3-1. 보조설명
프로퍼티지정 ->
Synthesize 구현
메서드선언 -> 메서드 구현
4. 객체 생성
클래스이름 * 변수명 = [[클래스명 alloc]init]; // alloc:할당, init:초기화
(id) [클래스명 new]; // 여기부턴 위의 [클래스명 alloc] 에 해당
[클래스명 allocWithZone:zone];
[클래스명 클래스이름withO:O]; //O는 방식, ex)url. 메모리 해제는 오토릴리즈풀이 해주므로 해주지 않아도 됨.
[객체명 copy]; // 메모리 해제 직접
[객체명 method]; //메모리 해제는 오토릴리즈풀이 해주므로 해주지 않아도 됨.
//1,2 방식은 메모리해제를 사용자가 직접 해줘야 함
5.메서드(클래스안의 멤버) 선언
1)매개변수가 없는경우
- (결과형) 메서드명;
+
// - : 멤버메서드
// + : static(class)
2)매개변수가 1개 있는 경우
-(결과형) 메서드명 매개변수의미 : (매개변수자료형기재) 매개변수;
+
3)매개변수가 2개 이상 있는 경우
-(결과형) 메서드명 매개변수의미 : (자료형)매개변수1 : (자료형)매개변수2 : ……;
+
//아래처럼 의미부여를 따로 할 수 있음
-(결과형) 메서드명 매개변수의미 : (자료형)매개변수1 매개변수의미 : (자료형)매개변수2 : ……;
+
6. 메서드 구현
1)매개변수가 없는 경우
- (결과형) 메서드명
+
{
내용;
}
7. 메서드 호출
1)매개변수가 없는 경우
[객체 메서드명];
클래스
//객체와 클래스는 receiver
프로젝트에서 마우스오른쪽-애드-뉴파일-코코아터치클래스-NSobject 클래스
//test.h
@interface Test : NSObject
{
}
8. getter와 setter : 멤버변수에 접근할 수 있도록 해주는 메서드들
Objective-C는 멤버변수를 호출하는 방법과 메서드를 호출하는 방법이 다르기때문에
메서드 이름과 변수명이 같아도 된다.
일반적으로 getter의 이름을 변수명과 동일하게 만들지만 BOOL타입인 경우만 앞에 is를 붙이며
setter 의 이름은 set변수명 으로 한다.
01.
//Source / ClassTest.m
02.
#import <Foundation/Foundation.h>
03.
//다른 파일에 있는 선언문을 사용하고자 하는 경우에는 헤더파일이 import되어야 합니다.
04.
//Test 라는 클래스의 사용을 위해서 import
05.
//SDK가 제공해주는 클래스를 사용할 때는 < > 안에 헤더파일 이름을 기재해야 하고
06.
//자신이 만든 클래스를 사용하고자 할 경우에는 " " 안에 기재해야 합니다.
07.
#import "test.h"
08.
int
main (
int
argc,
const
char
* argv[]) {
09.
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
10.
//alloc과 init으로 생성 - 정적 타이핑(변수 선언할 때 자료형을 기재)
11.
Test * Obj1 = [[Test alloc]init];
12.
NSLog(@
"%@"
, Obj1);
13.
14.
//Obj1 이 print라는 메서드를 호출
15.
[Obj1 print];
// -가 붙어있으므로 [Test print]; 라고 하면 안됨.
16.
17.
//클래스 메서드이므로 Obj1이 호출할 수 없다.
18.
[Test disp];
//+가 붙어있으므로 오른쪽처럼 하면 안된다. //[Obj1 disp];
19.
20.
//정수 매개변수 1개를 갖는 printWithInt를 호출
21.
[Obj1 printWithInt : 10];
22.
23.
//호출 시 의미까지 호출해야 함
24.
int
n;
25.
[Obj1 add:10 :20 :n];
26.
[Obj1 addWithFirst:10 withSecond:20 saveWithResult:n];
27.
28.
[Obj1 setValue:50];
29.
NSLog(@
"value : %d"
, [Obj1 value]);
30.
31.
//new 로 생성 - 동적 타이핑(변수 선언할 때 자료형을 기재하지 않음)
32.
/*
33.
id Obj2 = [Test new];
34.
NSLog(@"%@", Obj2);
35.
*/
36.
37.
[pool drain];
38.
return
0;
39.
}
01.
//
02.
// Test.h
03.
// ClassTest
04.
//
05.
// Created by iMac_23 on 10. 11. 5..
06.
// Copyright 2010 __MyCompanyName__. All rights reserved.
07.
//
08.
#import <Foundation/Foundation.h>
09.
//NSObject로 부터 상속받는 Test라는 클래스 선언
10.
@interface Test : NSObject {
11.
//접근지정자를 입력하지 않으면 기본 protected:로 지정됨
12.
//이때는 자신의 클래스 내부와 상속받은 클래스에서만 사용 가능.
13.
int
value;
14.
}
15.
//value에 대한 getter 선언 - 리턴타입이 변수의 자료형과 동일하고 이름은 변수명으로 생성
16.
//예외적으로 이름앞에 is가 붙을 수 있다 - 타입이 BOOL인 경우
17.
- (
int
)value;
18.
//value에 대한 setter 선언 - 셋터는 리턴타입 무조건 void, 이름은 set변수명 으로 하고
19.
//매개변수는 변수의 자료형과 일치하는 1개
20.
- (
void
)setValue : (
int
)temp;
21.
//매개변수가 없는 static메서드(disp)와 member메서드(print)를 선언
22.
- (
void
)print;
// -는 멤버,객체
23.
+ (
void
)disp;
// +는 클래스
24.
//매개변수가 1개 있는 경우는 일반적으로 매개a변수의 의미를 메서드명에 포함한다.
25.
//정수 1개를 매개변수로 받아서 출력하는 매개변수가 1개인 member메서드를 선언.
26.
- (
void
)printWithInt:(
int
)n;
27.
//정수 3개를 매개변수로 받아서 첫번째와 두번째를 더한 후 세번째에 저장하는 메서드 선언
28.
- (
void
)add:(
int
)first:(
int
)second:(
int
)result;
29.
- (
void
)addWithFirst:(
int
)first withSecond:(
int
)second saveWithResult:(
int
)result;
30.
@end
01.
//
02.
// Test.m
03.
// ClassTest
04.
//
05.
// Created by iMac_23 on 10. 11. 5..
06.
// Copyright 2010 __MyCompanyName__. All rights reserved.
07.
//#import "Test.h"
08.
@implementation Test
09.
- (
void
) print
10.
{
11.
NSLog(@
"Hello"
);
12.
}
13.
+ (
void
) disp
14.
{
15.
NSLog(@
"Hi"
);
16.
}
17.
- (
void
) printWithInt:(
int
)n
18.
{
19.
NSLog(@
"n:%d"
,n);
20.
}
21.
- (
void
)add:(
int
)first:(
int
)second:(
int
)result
22.
{
23.
result = first + second;
24.
NSLog(@
"%d"
, result);
25.
}
26.
- (
void
)addWithFirst:(
int
)first withSecond:(
int
)second saveWithResult:(
int
)result
27.
{
28.
result = first + second;
29.
NSLog(@
"%d"
, result);
30.
}
31.
//변수의 getter는 변수만 리턴하면 됨
32.
- (
int
)value
33.
{
34.
return
value;
35.
}
36.
//변수의 setter는 매개변수를 변수에 대입하면 됨
37.
- (
void
)setValue:(
int
)temp
38.
{
39.
value = temp;
40.
}
41.
@end
실행결과
Running…
2010-11-05 12:26:11.105 ClassTest[8316:a0f] <Test: 0x10010c980>
2010-11-05 12:26:11.107 ClassTest[8316:a0f] Hello
2010-11-05 12:26:11.108 ClassTest[8316:a0f] Hi
2010-11-05 12:26:11.108 ClassTest[8316:a0f] n:10
2010-11-05 12:26:11.109 ClassTest[8316:a0f] 30
2010-11-05 12:26:11.109 ClassTest[8316:a0f] 30
2010-11-05 12:26:11.109 ClassTest[8316:a0f] value : 50
'iOS' 카테고리의 다른 글
Chap3-2. property,synthesize,atomic,setter,getter,assign,readonly,.(dot),const,extern,상속,self,super,다형성,동적바인딩,nil포인터,지역메서드 (0) | 2012.03.21 |
---|---|
Chap3-1. property와 synthesize (0) | 2012.03.20 |
Chap1. objective-c의 기초, 맥OS와 iOS, 기본자료형, id타입, 포인터 타입, 제어문 (0) | 2012.03.16 |
iOS, hitTest 메서드를 통한 Touch Event 처리 (0) | 2011.07.26 |
iOS, ScrollView Paging기법 (0) | 2011.07.26 |