본문 바로가기
  • 그냥 하자
iOS

Chap2. id,연산자,파일의구조,클래스

by Mash 2012. 3. 19.
반응형
이 글은 아래의 출처를 수정하여 작성한 글 임을 밝힌다. 
<출처 : 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
{
}

@end

//test.m
@implementation 
Test

@end


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


반응형