본문 바로가기
모바일개발(Mobile Dev)/IOS개발(ObjectC)

xcode 에서 private, project 형태

by 테크한스 2015. 9. 30.
반응형

출처 : http://liimix.tistory.com/entry/xcode-%EC%97%90%EC%84%9C-private-project-%ED%98%95%ED%83%9C-%EB%82%98%ED%83%80%EB%82%B4%EA%B8%B0


objective-C 에서 private 이 있으며 사용법은 다음과 같다.

@interface testClass : NSObject {
@private
@public
@protected
}
@end

======================================== old...
다른사람들과 함께 프로젝트를 진행하거나

라이브러리 작업을 하게 되면
외부에 공개되지 말아야 할 것들이 꼭 있다.
C++ 에서는 class 내부에 private 과 protected 가 그 역할을 하지만 Objective-C  에서는 모든 것이 사실상 public 이나 마찬가지이다. 그리고 메시지 콜 방식이므로 외부에 공개되어 있지 않더라도 접근이 사실상 허용된다.

이해를 쉽게 하기 위해 C++ 과 용어를 비교 하자면
c++ : public , protected, private
ObjC : public, project, private
로 용어를 사용한다.

그러나 이는 ObjC 에서는 클래스를 구분하는 용도이지 클래스 내부에서의 관리를 위한 용어는 아니다.

본론으로 넘어가,
Objective-C 에서도 private, project 형태의 메소드나 변수를 선언하는 방법이 있다.
이는 오브젝티브-C 2.0 Objective-C 책을 참고 하기 바란다.

책에는 사실 메소드에 관한 것만 나와 있지만 변수들도 그와 비슷한 방법으로 쓸 수 있다.
그런데 이는 형식이 약간 아이러니 하다. (지금으로선 완벽하게 파악된 것이 아닌지라...)
 
예1-1)
// AAA.h

@interface AAA : NSObject {

NSStringopenVariable;

}

- (void)openMethod;

@end



상기와 같은 클래스(이해를 편하게 하기 위해 클래스라는 용어를 쓰겠다.) 를 내부적으로 BBB 라는 놈이 사용을 한다고 가정하자. 그런데 BBB에서 AAA에 있는 openVariable 를 변경하려면 @property 를 사용하거나 Setter 메소드를 사용하여야 한다. 그런데 이 Setter 메소드가 외부에 공개되어야 하지 않는다면 어떻게 해야 할까?
해답은 interface 이다.
 
예1-2)
// BBB.m

@interface AAA (Poject)

- (void)setOpenVariable:(NSString *)strValue;

@end


@implementation BBB

- (void)method1 {

[<AAA> setOpenVariable:@"Hello world"];  // <AAA>는 AAA 인스턴스를 뜻함.

}

@end



이런식으로 하면 BBB 에서 AAA의 내부에 메소드가 있는 것처럼 사용을 할 수가 있다.

자, 그러면 변수의 경우는 어떨까? (이 부분이 책에 없음)
이도 선언을 해주는 방식이 비슷하나 그 사용방법이 약간 아이러니 하다. 예를 보자.

 
예1-3)
// BBB.m

@interface AAA (Poject)

NSString* closedVariable;

- (void)setOpenVariable:(NSString *)strValue;

@end


@implementation BBB

- (void)method1 {

[<AAA> setOpenVariable:@"Hello world"];  // <AAA>는 AAA 인스턴스를 뜻함

}

- (void)method2 {

closedVariable = @""Hello world2;

}

@end

 

// AAA.m

@interface AAA (Poject)

NSString* closedVariable;    // .h 가 아닌 .m 에 변수를 선언했다는 것이 포인트; 이를 외부에서 접근

- (void)setOpenVariable:(NSString *)strValue;

@end


@implementation AAA

~

@end



변수 사용과 메소드 사용의 차이가 느껴지는지?
그 차이점은 변수는 사용할때 마치 BBB 내부에 선언된 변수인마냥 사용하고 있다는 것이다.
그러나 변수의 위치는 AAA에 있는 것 같다. 왜 그런것 같냐면
BBB 내부에 closedVariable 을 선언해 준적이 전혀 없고 단지 저 BBB.m 의 AAA interface 내부에 선언 했을 뿐인데 컴파일도 잘 되고 실행 또한 원활히 되었다.

아직 원리에 대해선 구체적으로 파악할 시간이 없어서 분석은 못했으나
일단은 모르더라도 저런 방식으로 사용하면 코드 안정성에 도움은 될 듯하다.


반응형