오브젝트C2010. 10. 12. 13:05
[objective-c] 오브젝트 c에 대한 기본적인 개념 정리

2.1 오브젝티브-C, OOP를 위한 언어

2.1.1 역사

2.1.2 클래스와 인스턴스

2.1.3 메시징

  오브젝트-C의 함수 호출은 대괄호[]이며

 오브젝트가 앞에 오고 오브젝트의 메소드가 뒤에 붙는 형식

ex1) myView라는 뷰에서 aquaGradient라는 그러디언트를 그리는 오브젝트-C함수

[myView drawMyGradient:aquaGradient fromValue:0.0 toValue:1.0 opaque:YES];

 오브젝트     메소드이름         매개변수1       매개변수2      매개변수3   매개변수4

  

> 호출되는 함수의 형식? 예-

- (void)drawMyGradient:(CGGradientRef)gradient fromValue:(float)start toValue:(float)end opaque:(BOOL)opaque

  

ex2) 리턴값을 받는 함수 호출

destStr = [sourceStr subStringFrom:2 to:5];

  

sourceStr오브젝트의 클래스안에는 다음과 같은 메소드가 들어있을 것이다.

- (NSString*)subStringFrom:(int)from to:(int)to

  

ex3) 리턴되는 값이 코코아클래스의 인스턴스라면 대괄호를 다시 만들어서 또 다른 메소드를 호출해야함

hashValue = [[sourceStr subStringFrom:2 to:5] hash];

  

2.1.4 인스턴스 변수와 엑세서 메소드

  (클래스는 내부적으로 멤버변수(인스턴스변수)를 가질수 있고 외부에서 직접 멤버변수에 접근할수 없다)

  

접근하는 메소드 getter, setter

  

getter는 메소드 변수의 이름을 그대로 사용

Person이 클래스 이름, 인스턴스 변수 name, 인스턴스 오브젝트 me

ex) NSString *myName = [me name];

  

setter 메소드

- 변수 이름앞에 set을 붙이고 변수의 첫 문자를 문자로 바꿈

ex) [me setName:@"Yoon"];

  

2.1.5 코코아 클래스 만들기

  코코아 클래스 : 헤더파일 + 임플리먼트 파일

  

1. 헤더(.h)

  @interface, @end로 구성

  

@interface 클래스:슈퍼클래스(<프로토콜>)

(프로토콜은 생략가능)

{

    // 인스턴스 변수

}

//메소드 구현

@end

  

2. 임플리먼트 파일(.m)

  @implement 클래스이름

// 메소드 구현

  

@end

  

2.1.6 헤더포함

 : #import는 다른 클래스의 헤더를 불러오는 역할

 : #include와 비슷하지만 중복 포함 에러 예방

 : 큰따옴표""는 프로젝트 안에서 바로 찾을 수 있는 파일에 사용

 : <>는 경로를 이용해 찾아야 하는 헤더 파일에 사용

 : 하지만 <>는 교차 포함의 에러를 방지하지 못함, 이런경우 헤더파일에서는

   @class 클래스이름

   위 형식으로 클래스의 존재만 알리고 임플리먼트파일에서 실제 #import하는 것이 좋다.

 

2.2 메모리 관리

2.2.1 원칙

 : "만든곳에서 릴리즈한다"-> 이 원칙은 OOP(Object Oriented Programming)(Object-C책 보기ㅠ)

 : 어떤 인스턴스 오브젝트에 값을 넣을때 넣는 쪽에서 릴리즈하고 받은 쪽에서 보관해야함.;

 : 오브젝트의 라이프 사이클 관리는 구현의 측면에서 본다면 오브젝트의 리테인 카운트(retain count)를 관리하는 것

 : 오브젝트의 리테인 카운트가 1이상이면 오브젝트가 살아있는 것이며 리테인 카운드가 0이 되면 해당 메모리는 해제

 "이 오브젝트는 언제 리테인 카운트를 0으로 만들어야 하는가?"

 

2.2.2 alloc, retain, release

 : 모든 코코아 오브젝트가 사용할 수 있는 메소드

 : NSObject에 선언된 메소드

 

 > NSOjbect

 : 코코아의 루트 클래스

 : NSobject프로토콜은 NSObject가 준수하는 프로토콜

 

 

 +alloc 메소드를 받으면 특정 클래스의 인스턴스 오브젝트가 메모리에 전개되며 리테인 카운트는 1이 됨

 

- retain 메소드르 받은 오브젝트의 참조 카운트는 1 증가, 어떤 오브젝트를 확실하게 보호하고 싶을때 retain 호출

 

- release 메소드를 받은 오브젝트의 참조 카운트는 1감소, 오브젝트의 사용을 마치면 오브젝트에 release 메소드를 보냄으로써 오브젝트를 메모리에서 해제

 

2.2.3 +메소드와 -메소드

: +가 붙은 메소드는 클래스에서 바로 호출

: -가 붙은 메소드는 인스턴스 메소드

: 메모리와 관련해서 +메소드를 이용해 생성한 인스턴스 오브젝트는 +alloc, -init을 이용해 생성하고 초기화한 인스턴스 오브젝트와 달리 오브젝트의 라이프 사이클을 관리할 필요가 없음

 

> 런타임

 : 애플리케이션이 기동되면 애ㅡㄹ리케이션에 연결되어 있는 프레임워크의 모든 클래스들이 오브젝트화 됨

 ex)NSString이라는 클래스가 있다면 NSString이라고 하는 클래스 오브젝트가 애플리케이션 시동와 함께 생성, 클래스 오브젝트와 함께 함수 포인터의 테이블이 생성,

NSString을 서브클래스해서 MyString이라는 클래스를 만든다면 오버리아디한 메소드는 MyString의 함수 포인터를 가리킬 것이고 오버라이드하지 않은 메소드는 NSString의 함수 포인터를 가리킬 것이다.

 

2.2.4 addObject, addSubView

 : 코코아에는 몇가지의 컬렉션이 있다.

 : 오브젝트가 컬렉션에 더해지면 그 순간 리테인 카운트가 1증가, 그리고 컬렉션에서 제외되는 순간

   리테인 카운트가 1감소

   -> 컬렉션 바깥에서 리테인 카운트를 관리하면 됨

 

 

 

 >> 컬렉션(?)

 

 

ex) NSString *stringObject = [[NSString alloc] initWithString:@"Yoon"];

[mutableArray addObject:stringObject[; // array에 스트링 넣음

[stringObject release];

 

위의 코드는 stringObject의 주소값은 mutableArray에 살아있고

stringObject가 그 mutableArray 안에 있는 한 보호된다는 것.

 

* 뷰 오브젝트 또한 컬렉션과 유사한 방식으로 운용

뷰를 만들어서 다른 뷰에 서브 뷰로서 더하면 그 서브 뷰의 오브젝트 사이클은 슈퍼뷰가 관장하므로

서브 뷰는 슈퍼뷰의 외부에서는 리테인 카운트가 0이 되어야 함

 

2.2.5 autorelease pool

 : "곧 릴리즈 될 오브젝트들이 모여 있는 곳"

 : 코코아의 런타임은 매 이벤트 발생 시마다 오토릴리즈 풀에 있는 오브젝트를 메모리에서 제거

 : 어떤 오브젝트를 오토릴리즈로 선언하는 것은 이 메소드 내에서

   수명은 보장하되 이 메소드가 끝나면 언제 없어지든 상관하지 않겠다는것을 의미

 : 오토릴리즈로 선언하는 방법 -> +메소드를 이용하여 생성한 인스턴스 오브젝트

 ex)

 

 //NSString은 클래스 

NSString *stringObject;

//아래 두개 다 오토릴리즈...

//alloc, init, autorelease

stringObject = [[[NSSTring alloc] initWithString:@"Yoon"] autorelease];

//init with release

stringObejct = [NSString stringWithString:@"Yoon"];

 

(아- 잘 모르겠다;)

 

 : 오토릴리즈는 메소드 내에서 오브젝트를 만들어 리턴한 뒤 릴리즈 해야할 때도 사용됨

 

-(NSString *)fullName

{

   NSString *composedString = [[NSString alloc] initWithFormat:@"%@ %@,

                                                 firstName, lastName];

   [composedString release];

   return composedString;

}

 

 

성과 이름을 합쳐서 문자열을 만든 뒤 리턴하는 메소드

composedString은 메모리에 alloc되었으므로 release해야하는데

문제는 release되는 시점(;)

리턴 전에 릴리즈를 해야하는데 이 경우 이미 릴리즈된 포인터를 리턴하게 되는 문제가 생김

그러므로 일단 리턴한 뒤 약간의 시간차를 두고 릴리즈하는것이 필요

즉, 릴리즈를 예약^^

-(NSString *)fullName

{

   NSString *composedString = [[NSString alloc] initWithFormat:@"%@ %@,

                                                 firstName, lastName];

   [composedString autorelease];

   return composedString;

}

 

autorelease메소드는 모든 코코아 오브젝트에 대해 릴리즈를 예약하는 것

일단 리턴되는 시점까지는 메모리가 보호되며 안정적으로 리턴된 뒤 일정 시점이 지나면 릴리즈됨

 

2.3 Delegate, Subclass

2.3.1 Delegate

 : "그대로 위임한다"

 : 누가?

   - 델리게이트를 필요로 하는 오브젝트는 주로 View의 서브클래스들이나 Controller 오브젝트

 : 무엇을?

   - 이벤트에 대한 처리 권한을 위임

   - 자기 자신에게 일어난 문제를 자기가 직접 처리하지 않고 다른 오브젝트에 위임해서 처리하는 방식

 : 누구에게?

   - 기존의 클래스 중 해당 이벤트를 가장 잘 처리할 수 있는 클래스가 위임을 맏음

      (델리게이트를 처리하기 위해 별도의 클래스를 정의하기도 함)

ex) UIApplication클래스의 델리게이트 메소드는 -applicationDidFinishLaunching:메소드

 UIApplication클래스는 애플리케이션이 시동될 때 생성되고 종료되면 없어지는 싱글톤(애플리케이션 내에 유일한 오브젝트) 패턴의 오브젝트이다.

 

2.3.2 Subclass

 : 클래스를 상속받아 기능을 확장하거나 원래의 기능을 변경하는 것

 : 코코아는 단일상속 체계를 가진다.

   -> 모든클래스는 하나의 슈퍼 클래스만을 가지고 있다.

   -> 최상위 클래스인 root클래스로 NSObject가 존재

 

2.3.3 Subclass? Delegate?

  : 동일 목적 -> UI 요소 등에 발생한 이벤트를 처리하는 것

  ex) "사용자가 리턴키를 입력하면 특정한 반응을 하길 바란다"

 위 작업을 수행하기 위해서

키 입력과 관련된 메소드를 오버라이드해서 들어온 키가 리턴키인 경우를 얻어내려고 하지만;

서브클래싱은 작업이 만만치 않다.

이때 필요한것이 델리게이트 패턴

개발자가 복잡한 내부구조를 몰라도 이벤트 발생시에 델리게이트로 지정된 오브젝트에 양속된 메소드를 호출해 주는것

(잘- 모르겠다;)

 

2.3.4 프로토콜

 : "구현하기로 약속한 메소드"

 : 특정 프로토콜을 구현하는 클래스를 만든다면 프로토콜에 명시되어 있는 메소드를 전부 또는 일부 구현함으로써 프로토콜의 기능을 구현하게 됨

 

2.4 용어정리

2.4.1 IBOutlet & IBAction

  : 인터페이스 빌더 파일과 연결되는 인스턴스 변수와 액션 메소드임을 선언하는 예약어

  : IBAction값은 void형

 

2.4.2 id

 : id 타입으로 정의한 변수의 type은 컴파일 시가 아닌 런타임 시에 결정

 

2.4.3 SEL, @selector()

 : SEL은 함수에 대한 참조를 가짐

   -> 즉 함수 포인터임

   -> 컴파일된 오브젝트-C는 함수테이블을 만들고 구별자와 메소드를 적어둔 뒤 런타임 시에 매칭시키는 방식 사용

   -> 이때 컴파일된 셀렉터의 타입이 SEL이며, 메소드 이름을 이용해 SEL를 얻어내는 지시어가 @selector()

        임

 

 

 

Posted by 오늘마감

댓글을 달아 주세요