가시성


인스턴스 변수의 공개 범위

일반적으로 클래스는 구조와는 다른 역할이 있기 때문에 데이터 형의 제안으로 클래스는 존재해서는 없습니다. 그러나 RGB 형식의 색을 표현하기위한 클래스와 좌표와 크기를 나타내는 클래스라면 메시지에서 값을 얻는다는 처리는 다소 중복 때문에 직접 인스턴스 변수와 상호 작용할 수있는 편이 좋다고 생각 개발자도 있을 것입니다.

원칙적으로는 클래스의 인스턴스 변수에 외부에서 액세스 할 수 있어야하지 않으며, 기본적으로 외부에서 인스턴스 변수에 액세스 할 수 없습니다. 기본적으로 인스턴스 변수를 선언하는 클래스의 메소드 이외에서 인스턴스 변수를 조작 할 때 변수에 저장되는 값의 일관성을 유지할 수 없게되기 때문입니다. 외부에서 인스턴스 변수에 액세스하려면 먼저 인스턴스 변수의 가시성을 명확히해야합니다.

인스턴스 변수의 가시성은 공개를 나타내는 public 비공개을 나타내는 private 서브 클래스에서 액세스를 허용하는 protected로 나뉩니다. public 클래스의 외부 나 서브 클래스를 포함한 모든 위치에서 인스턴스를 통해 액세스되는 변수를 나타냅니다. private는 반대로 인스턴스 변수를 선언 한 클래스의 메소드에서만 사용 가능한 변수입니다. 그리고 protected 변수를 선언 한 클래스와 그 클래스의 서브 클래스에서 액세스 할 수있는 변수를 나타냅니다.

선언 할 인스턴스 변수에 이러한 가시성을 지정하려면 컴파일러 지시문을 사용하여 @public , @private , @protected 중 하나를 인스턴스 변수 선언 부분 사이에 삽입합니다. 이러한 컴파일러 지시문이 출현하면 이후에 선언 된 인스턴스 변수는 모든 지정된 가시성 설정됩니다. 가시성이 지정되지 않은 경우, 인스턴스 변수는 protected로 설정됩니다.

@interface A : Object
{
	int z;	//protected
@public
	int a;	//public
@protected
	int b;	//protected
@private
	int c;	//private
	int d;	//private
}
@end

이처럼 가시성을 지정한 후 선언 된 인스턴스 변수는 그 시정을 갖습니다. 가시성을 지정하는 컴파일러 지시문의 출현 순서, 출현 횟수에는 제한이 없습니다.

public 공개되는 변수에 클래스의 외부에서 인스턴스를 통해 액세스하려면 클래스 형의 포인터 변수 -> 연산자를 사용하여 인스턴스 변수를 지정합니다. 이것은 구조체에 대한 포인터에서 멤버 변수에 액세스하는 방법과 동일합니다. 인스턴스 변수에 대한 액세스는 컴파일 타임에 유형 검사가 필요하므로 id 형식의 변수에서 액세스 할 수 없습니다.

#import <stdio.h>
#import <objc / Object.h>

@interface A : Object
{
@public
	int a;
@protected
	int b;
@private
	int c;
}
- (id) initWithA : (int) a int : (int) b int : (int) c;
- (void) WriteA;
@end

@interface B : A
- (void) WriteB;
@end

@implementation A
- (id) initWithA : (int) a int : (int) b int : (int) c {
	self-> a = a;
	self-> b = b;
	self-> c = c;
	return self;
}
- (void) WriteA {
	printf ( "[A Write Method a = % d, b = % d, c = % d \ n", a, b, c);
}
@end

@implementation B
- (void) WriteB {
	printf ( "[B Write Method a = % d, b = % d \ n"a, b);
}
@end

int main () {
	B * objb = [[B new] initWithA : 1000 int : 100 int : 10];
	printf ( "[main () scope a = % d \ n", objb-> a);
	[objb WriteB];
	[objb WriteA];
	[objb free];
	return 0;
}

이 프로그램에서 선언하고있는 A 클래스는 public 인스턴스 변수 a, protected 인스턴스 변수 b, private 인스턴스 변수 c를 선언하고 있습니다. 그리고 이들에 액세스 할 수있는 것을 증명하기 위해 main () 함수에서 B 형의 포인터 변수 objb 통해 공개되는 변수 a에 objc-> a라는 형태로 접근하고 있습니다.

A 클래스를 상속하는 하위 클래스 B는 WriteB라는 메소드를 선언하고이 메소드의 구현에 공개되는 변수 a와 서브 클래스에서 액세스 할 수있는 변수 b를 표시합니다. 그러나 하위 클래스에서도 private 변수에 액세스 할 수 없기 때문에 c를 표시 할 수 없습니다. 모든 변수에 액세스 할 수 인스턴스 변수를 선언 A 클래스뿐입니다. A 클래스의 메소드 WriteA에서 모든 인스턴스 변수를 표시 할 수 있습니다.