'Objective C/변수'에 해당되는 글 4건

  1. 2010.05.05 정적(static)변수
  2. 2010.05.05 외부(external)변수
  3. 2010.05.05 인스턴스 변수의 범위(Scope)
  4. 2010.05.05 객체의 초기화 메서드
Objective C/변수2010. 5. 5. 22:00
메서드를 구현 중 자주 사용하는 패턴이 싱글턴 패턴이 있다. 이러한 패턴을 사용하기 위해서 자주 사용하는 것이 정적변수와 클래스 메서드다. 이 둘을 잘 사용하면 캡슐화와 좋은 객체 지향 기법을 지켜 줄 수 있다.

#import "ClassA.h"


static int gCounter = 0;


@implementation ClassA


+(ClassA *) allocA

{

extern int gCounter;

++ gCounter;

return [ClassA alloc];

}


+(int) count

{

 extern int gCounter;

return gCounter

}


@end


위의 코드는 클래스 메서드에서 정적메서드로 접근하여 값을 참조하고 있다.  우리가 흔히 instance와 getInstance를 사용한 싱글턴 패턴을 생각하면 될것 같다. 정적메서드는 내부 변수에 직접 접근하지 못하므로 클래스메서드 즉 getInstance로 접근하여 값을 참조한다는 것을 생각하면 된다. 여기서는 클래스 메서드에서 extern 지시어로 내부의 정적변수로 접근하고 있다.
Posted by 버터백통
Objective C/변수2010. 5. 5. 21:59
외부변수라는 것은 프로그램 파일에서 설정된 전역 변수를 구현할 어떤 파일에서 참조하여 그 값을 사용하게 한다.
가령 프로그램 파일에서 전역 변수 int num = 0; 이라고 선언하고 프로그램 파일에서 import하여 사용하는   A.m이라는 구현 파일에
extern int num이라고 선언한 변수가 있다면 전역 변수 num과 구현파일의 num과 같은 참조값을 갖게되며 둘 중 어느곳에서든 변수의 값을 수정하게 된다면 전역변수 num의 값에 적용된다. 이처럼 전역변수로 선언된 변수는 모듈 어디에서든 외부변수로 선언하여 값을 참조할 수 있다.
Posted by 버터백통
Objective C/변수2010. 5. 5. 18:06
Objc에서도 역시 변수의 스코프를 지정할 수 있다.  다른 것 들과 마찬 가지로 public, protected, private이 있으며 package라는 첨보는 것 도 있다. 형태는 다음과 같다.
@protected : 기본값으로 설정되며 서브클래스까지만 접근이 가능하다.
@private : 클래스 내부에서만 사용가능 하다.
@public : 어디서든 인스턴스 변수에 접근 할 수 있다.
@package : 64비트 이미지의 경우 그 클래스를 구현하는 이미지 안에서는 어디서든 접근이 가능하다. - (package는 사실 테스트를 못해봐서 무슨 소리인지 잘 모르겠다..)

이러한 범위는 보통 interface에서 그룹단위로 선언한다.
가령 한 가지 지시어를 사용하면 }가 나올때 까지 그 변수는 그 지시어를 따른다.
{
@private
    int a;
    int b;
@public
    int c;
}
위 코드처럼 a,b,는 private범위를 갖고, c 는 public범위를 설저하게 된다. 

Posted by 버터백통
Objective C/변수2010. 5. 5. 18:02
가장 기본적인 클래스인 NSObject에서는 init이라는 메서드를 제공하며 클래스를 초기화 하여 준다.
그러나 경우에 따라 다양한 초기화 메서드가 존재하는 것을 볼 수 있다. 가령 NSString의 경우 initWithFormat를 제공한다.
이는 초기화와 동시에 어떤 값을 같이 설정하게 해준다.
어떤 클래스에 이와 비슷한 이름(가독성을 높이고자 대부분의 초기화 메서드는 앞에 init을 붙이고 있다)을 설정하고 필요한 값을 전달할 수 있게 한다.

아래는 어떤 클래스를 만들고 초기화 시에 2개의 정수를 받는 초기화 메서드이다.

-(MyClass *) initWith:(int) a :(int) b

{

/*

 이 클래스의 상위 클래스에서 init메시지를 전달함으로 기본적인 초기화 기능을 수행한다.

*/

[super init];

/*

 만약 초기화에 성공하여 메모리상에 존재하게되면.. self 존재하게 하면

  self 값을 받는 값으로 초기화 한다.

*/

num1 = a;

num2 = b;

/*

 초기화 메서드는 메모리상의 객체를 바꾸거나 이동 시킬 수 있는 권한이 있기 때문에

 반환값을 self에 할당해 주어야 한다.

*/

return self;

}


이 클래스를 생성하고 초기화 시에 initwith::를 실행하여 필요한 값을 대입한다.


이 처럼 필요한 경우 초기화 메서드를 개량하여 기능을 정해주면 된다. 다만 반드시 내부에서 실제 수행할 초기화 메서드인 init을 한 번 호출해 주면 된다.

Posted by 버터백통