이름 매핑
Java는 패키지를 사용하여 비공식적으로 네임스페이스를 정의합니다. Objective C++에는 C++ 네임스페이스가 있지만
Objective C에서는 그렇지 않습니다. 여러 패키지의 클래스를 사용할 때 이름 고유성을 유지하려면
J2ObjC는 유형 이름 앞에 카멜 표기법으로 된 패키지 버전을 추가합니다. 예를 들어 java.util.Map
는 JavaUtilMap
로 바뀝습니다.
안타깝게도 카멜 표기법을 사용한 패키지 이름은 특히 생성된 코드의 가독성을 떨어뜨릴 수 있습니다.
긴 패키지 이름이 있는 것을 볼 수 있습니다. 예를 들어 Google Guava의
베타 주석
이(가) com.google.common.annotations
패키지에 있으며, ComGoogleCommonAnnotationsBeta
는
Beta
보다 읽음
패키지 접두사 정의
비공식 네임스페이스를 정의하기 위한 Objective-C 규칙은 공유 접두사(일반적으로 대문자 2자)를 사용하는 것입니다. 예를 들어 iOS Foundation Framework는 NeXTStep의 'NS'를 사용합니다. Google Guava의 베타 이름을 단순화하기 위해 'GG'와 같은 접두사를 사용하면 Beta
를 GGBeta
로 참조하여 가독성을 개선할 수 있습니다.
J2ObjC는 개발자가 패키지 이름에 매핑할 자체 접두사를 지정할 수 있도록 지원합니다. 이 작업은 --prefix package=prefix
를 사용하여 명령줄에서 실행됩니다. 모든 클래스 이름을
Beta
님의 패키지, "--prefix com.google.common.annotations=GG
" 사용됩니다. 패키지마다 별도의 접두사 선언이 필요합니다.
여러 패키지에 단일 접두사 정의
소규모 라이브러리에는 충돌하지 않는 Java 클래스 이름이 있는 경우가 많으므로 와일드 카드 패키지 사양과 단일 접두사를 공유할 수 있습니다. 예를 들어 모든 Joda-Time 패키지는 --prefix
'org.joda.time.*=JT'
를 사용하여 동일한 JT 접두사를 공유할 수 있습니다. 지원되는 유일한 와일드 카드 문자는 '*'이며, 이는
명령줄 셸은 파일 이름을 사용합니다.
여러 패키지 접두사 정의
여러 접두사 정의를 간단하게 지정하기 위해 속성 파일은
"--prefixes
파일" 인수:
cat prefixes.properties
com.google.common.annotations: GG com.google.common.base: GG # While GG can be used for all packages, let's mix it up. com.google.common.collect: GC com.google.common.io: GIO # A prefix can be more than two characters, com.google.common.net: GuavaNet # a lot more! ...
j2objc --prefixes prefixes.properties <args>
런타임 시 접두사가 있는 클래스
완성된 앱에는 접두사가 있는 클래스가 있으므로 기본적으로 원래 Java 클래스 이름을 사용하여 클래스를 찾을 수 없습니다. 그러나 앱의 리소스에 prefixes.properties라는 파일이 있는 경우
번역에 사용된 접두사로 번들을 지정하면 Class.forName(javaName)
는 매핑된 클래스를 찾습니다.
Xcode에서 iOS 앱에 위의 prefixes.properties를 추가하려면 빌드 대상의 빌드 단계를 엽니다. 탭에서 번들 리소스 복사 섹션을 펼친 후 해당 목록에 prefixes.properties 파일을 추가합니다. 자바 리소스 개념이 iOS에 매핑되는 방식에 관한 자세한 내용은 자바 리소스를 참고하세요. 리소스를 배포합니다