'Objective C/상속'에 해당되는 글 4건

  1. 2010.04.11 dealloc메서드와 super키워드
  2. 2010.04.11 메서드 재정의 하기
  3. 2010.04.11 @Class 지시어
  4. 2010.04.11 객체지향을 강력하게 만드는 상속
Objective C/상속2010. 4. 11. 22:44
앞서 얘기했지만 상위 클래스로 접근하기 위해서는 super키워드를 사용한다. 
super 키워드를 사용하여 메시지를 전달하면 상위 클래스를 검사하고 만약 상위클래스에서 메시지 수신자가 없으며 그 상위 클래스로 이동하여 수신자를 검사한다. 

보통 클래스를 구현하다가 보면 클래스 내부에 새로운 객체를 만들어 사용하는 경우가 많이 발생한다. 제때에 릴리스를 하면 상관없는데 해당 클래스가 종료될 때 까지 그 객체를 사용해야 하는 경우가 있다. 
그런 경우에는 클래스가 메모리에서 사라지기 직전에 사용한 객체를 릴리스하도록 한다.

release는 retain count값을 1씩 줄여 가며 최종적으로 0이 될 때 메모리에서 해제하는 dealloc메서드를 호출하게 된다. 
따라서 아래와 같이 dealloc메서드를 재정의 한다. 
-(void) dealloc
{
     if(새로만든 객체)
      {
[새로만든 객체 release];
       }
     [super release];
}

이렇게 수정하면 프로그램에서 클래스를 릴리스하고 그 클래스가 메모리에서 제거될 때 클래스 안에서 사용한 객체를 릴리스한다.

참고) release 프로세스
1) release 
if( RC == 0 ){
   dealloc
}else{
   RC--;
}

Posted by 버터백통
Objective C/상속2010. 4. 11. 22:02
ObjC에서는 메서드를 재정의 하기 위해 별다른 키워드를 없이 부모클래스의 원본 메서드를 그대로 사용하면 된다. 물론 메서드 형태는 동일하게 맞추어야 한다. 
가령 ClassA에 initVar의 실행문이 다음과 같다면,
-(void) initVar
{
      x=100;
      NSLog(@"%i",x);
}

이를 상속받은 ClassB에서 initVar를 다음과 같이 처리할 수 있다.
-(void) initVar
      x=500;
      NSLog(@"%i",x);
}

이처럼 메서드를 재정의하는 특별한 키워드가 필요하지 않다.

Posted by 버터백통
Objective C/상속2010. 4. 11. 21:53
@class를 사용하면 해당 클래스에서 @class의 대상 클래스의 변수를 사용할때 컴파일러에게 대상 변수가 누구의 것인지 알 수 있도록 한다.
가령 ClassA에 변수 x가 있고 이를 상속받지 않은 클래스 ClassB에서 x 값을 사용하고자 한다면 
ClassB의 인터페이스에서 @class ClassA; 라고 설정하면 ClassA의 변수를 활용할 수 있다. @class지시어를 사용하면 ClassA전체를 처리할 필요가 없기 때문에 효율적이다. 그러나 대부분의 메서드를 사용하거나 메모리 관리를 해야하는 경우라면 #import하여 사용하면 된다.  


Posted by 버터백통
Objective C/상속2010. 4. 11. 21:44
C 이후의 대부분의 언어는 객체지향이라는 개념으로 언어가 설계되었다. 
이는 절차 지향보다 훨씬 편하고 다형성을 지킬 수 있도록 많은 프로그래머들이 고민하여 현재까지 발전해 왔다.
당연히 ObjC도 객체지향언어이며 모든 것은 루트클래스(최상위 클래스)에서 시작한다.
여기서는 NSObject클래스가 루트클래스이다. 루트클래스는 더 이상 위로 올라갈 수 없는 가장 기본적인 클래스(최상위 클래스)를 말하며 그것을 상속받은 클래스를 자식클래스 또는 서브 클래스라고 한다. 
서브클래스에서 루트클래스 또는 부모클래스, 슈퍼 클래스로 접근하기 위해서는 항상 super라는 키워드를 사용한다.

상속 받은 서브 클래스는 항상 부모클래스의 모든 기능을 가지고 있고 추후 개발자에 의해 새로운 기능들이 추가되거나 수정(Override)된다. 가령 어떤 클래스 A는 변수 x와 이를 설정하는 initVar라는 메서드를 가지고 있다. 누군가 이 클래스를 이용하여 변수x를 설정하고 그 값을 출력 하는 기능을 추가하고 싶다고 한다면 클래스 B를 만들어 클래스 A를 상속받아 새로운 메서드인 print를 만들어 넣으면 된다.

이렇게 상속을 하다보면 많은 메서드와 변수가 쓰이게 된다.
컴파일러는 어떤 변수와 메서드를 우선으로 실행할까? 아래는 메서드 실행 메카니즘이다.
어떠한 메시지가 인스턴스에 전달되면 컴파일러는 해당 인스턴스 클래스 내부를 우선으로 검색하고 실행한다. 
만약 해당 클래스에 메시지를 받는 메서드가 없다면 그 상위 클래스에서 메서드를 검색한다. 그래도 없다면 또 그 상위 클래스를 검색하고 발견되면 실행하지만 발견되지 않는다면, '메시지 전달에 응답하지 못할 것'(may not respond to 'method')이라고 컴파일러는 경고 또는 에러를 발생한다.
Posted by 버터백통