유형
- 프리미티브 유형의 경우 J2ObjC는 JNI 스타일 typedef를 정의했습니다.
- 일반적인 클래스 유형의 경우 패키지는 카멜 표기법을 사용하고 클래스 이름 앞에 추가됩니다.
- 생성된 패키지 프리픽스의 이름을 변경하려면 패키지 프리픽스를 참고하세요.
- 기본 객체 유형 및 모든 유형 변수의 경우 'id'가 사용됩니다.
- 몇 가지 핵심 자바 유형이 기반 유형에 매핑됩니다. (예: String에서 NSString으로 변환)
- 'volatile'로 선언된 필드의 경우 J2ObjC에 C11 _Atomic(...) 유형을 사용하는 typedef가 더 많이 있습니다.
- 내부 유형에서는 내부 클래스 이름이 밑줄과 함께 외부 이름에 추가됩니다.
자바 유형 | Objective-C 유형 | Objective-C 휘발성 유형 |
---|---|---|
boolean | J부울 | volatile_jboolean |
char | jchar | volatile_jchar |
byte | J바이트 | volatile_jbyte |
short | jshort | volatile_jshort |
int | 젠트 | volatile_jint |
long | jlong | volatile_jlong |
float | Jfloat | volatile_jfloat |
double | Jj | volatile_jdouble |
java.lang.Object | id | volatile_id |
유형 변수 | id | volatile_id |
java.lang.String | NS 문자열* | volatile_id |
java.lang.Number | NSNumber* | volatile_id |
java.lang.복제 가능 | NS복사* | volatile_id |
foo.bar.중얼 | FooBarMumble* | volatile_id |
foo.bar.Mumber$Inner | FooBarMumble_Inner* | volatile_id |
방법
Objective-C 메서드는 자바 메서드와 두 가지 중요한 차이점이 있습니다. 메서드 선택기의 구성요소 사이에 매개변수를 삽입하여 구문이 달라집니다. Objective-C 메서드는 자바처럼 오버로드를 지원하지 않습니다. 이러한 차이는 생성된 선택기에 매개변수 유형을 삽입하여 해결됩니다. 이는 오버로드된 자바 메서드 간의 이름 충돌을 방지하기 위해 필요합니다.
생성된 API에는 인스턴스 메서드, 정적 메서드, 생성자라는 세 가지 종류의 자바 메서드가 있습니다. 인스턴스 메서드는 Objective-C 인스턴스 메서드로 변환됩니다. 정적 메서드와 생성자는 C 스타일 함수로 변환되지만 Objective-C 래퍼를 추가하여 Objective-C 개발자에게 더 친숙한 API를 제공합니다.
인스턴스 메서드
메서드 이름은 다음과 같이 생성됩니다.
- 0 매개변수 메서드는 변경되지 않습니다.
- 하나 이상의 매개변수가 다음 패턴을 사용합니다.
<java name>With<1st param keyword>:with<2nd param keyword>:with<3rd param keyword>:
- 매개변수 키워드 규칙:
- 프리미티브 유형의 경우 키워드는 자바 프리미티브의 대문자 이름입니다. (예: '차')
- 프리미티브가 아닌 경우 키워드는 카멜 표기법을 적용한 정규화된 유형 이름입니다. (예: 'ComGoogleFoo')
- 배열 유형의 경우 요소 유형의 키워드에 '배열'이 추가됩니다.
예시 자바
interface Foo {
void bar();
String bar(int i);
java.util.List bar(String s, long[] l);
}
Objective-C 예
- (void)bar;
- (NSString *)barWithInt:(jint)i;
- (id<JavaUtilList>)barWithNSString:(NSString *)s
withLongArray:(IOSLongArray *)l;
정적 메서드
Objective-C 클래스 메서드는 인스턴스 메서드와 동일한 이름 지정 규칙에 따라 추가됩니다.
C 스타일 함수는 다음 이름 지정 규칙을 사용하여 추가됩니다.
- 생성된 Objective-C 선택기로 시작합니다. (예:
barWithInt:
) - 콜론을 밑줄로 바꿉니다. (예:
barWithInt_
) - 클래스 이름 앞에 밑줄로 구분합니다. (예:
ComGoogleFoo_barWithInt_
)
예시 자바
package com.google;
class Foo {
static boolean bar() { ... }
static double bar(int[] i) { ... }
static void bar(String s, boolean b) { ... }
}
Objective-C 예
@interface Foo : NSObject
+ (jboolean)bar;
+ (jdouble)barWithIntArray:(IOSIntArray *)i;
+ (void)barWithNSString:(NSString *)s
withBoolean:(jboolean)b;
@end
FOUNDATION_EXPORT jboolean ComGoogleFoo_bar();
FOUNDATION_EXPORT jdouble ComGoogleFoo_barWithIntArray_(IOSIntArray *i);
FOUNDATION_EXPORT void ComGoogleFoo_barWithNSString_withBoolean_(NSString *s, jboolean b);
생성자
Objective-C 규칙에 따라 init
인스턴스 메서드가 추가됩니다. 생성자에 매개변수가 있으면 인스턴스 메서드와 동일한 이름 지정 규칙이 사용됩니다.
세 가지 C 스타일 함수가 추가되었습니다.
- 첫 번째 함수는 새로 할당된 객체를 첫 번째 매개변수로 허용합니다. 이 함수는 일반적으로 서브클래스 생성자에서 호출하는 데 사용됩니다. 이는 정적 메서드와 동일한 이름 지정 규칙을 따릅니다. (여기서 'init'는 메서드 이름입니다.)
- 새 객체를 할당하고 초기화하는 두 함수가 추가됩니다. 프리픽스로 구분됩니다.
create_
함수는 자동 해제된 객체를 반환합니다.new_
함수는 보관된 객체를 반환합니다.
예시 자바
package com.google;
class Foo {
Foo() { ... }
Foo(Object a, Object b) { ... }
}
Objective-C 예
@interface ComGoogleFoo : NSObject
- (instancetype)init;
- (instancetype)initWithId:(id)a
withId:(id)b;
@end
FOUNDATION_EXPORT void ComGoogleFoo_init(ComGoogleFoo *self);
FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_init() NS_RETURNS_RETAINED;
FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_init();
FOUNDATION_EXPORT void ComGoogleFoo_initWithId_withId_(ComGoogleFoo *self, id a, id b);
FOUNDATION_EXPORT ComGoogleFoo *new_ComGoogleFoo_initWithId_withId_(id a, id b) NS_RETURNS_RETAINED;
FOUNDATION_EXPORT ComGoogleFoo *create_ComGoogleFoo_initWithId_withId_(id a, id b);
필드
인스턴스 필드 (비정적)
자바 인스턴스 변수는 Objective-C 인스턴스 변수가 됩니다. 이름은 밑줄과 동일합니다. '최종'으로 선언된 기본 필드는 특수한 경우이며 인스턴스 변수로 변환되지 않습니다.
- '->' 구문을 사용하여 필드에 직접 액세스할 수 있습니다.
- 기본 필드는 직접 설정할 수 있습니다.
- 최종 프리미티브 (상수)는 정적 상수처럼 변환됩니다. (정적 필드 참고)
- 기본이 아닌 필드는 제공된 setter 함수를 사용하여 설정해야 합니다.
ClassName_set_fieldName_(instance, value)
예시 자바
package com.google;
class Foo {
public int myInt;
public String myString;
}
Objective-C 예
Foo *foo = [[Foo alloc] init];
// Access a primitive field.
i = foo->myInt_;
// Set a primitive field.
foo->myInt_ = 5;
// Access a non-primitive field.
NSString *s = foo->myString_;
// Set a non-primitive field.
ComGoogleFoo_set_myString_(foo, @"bar");
정적 필드
정적 변수는 제공된 getter 함수와 setter 함수를 사용하여 액세스해야 합니다. 이러한 접근자 함수는 변수에 액세스하기 전에 클래스 초기화가 발생했는지 확인합니다.
- 정적 필드에 액세스
ClassName_get_fieldName()
- 최종이 아닌 정적 필드 할당
ClassName_set_fieldName()
- 기본 정적 필드 포인터를 가져옵니다.
ClassName_getRef_fieldName()
- 최종 및 비휘발성 필드에만 사용할 수 있습니다.
최종 프리미티브 필드 (상수)는 값이 클래스 초기화에 종속되지 않으므로 직접 액세스하는 것이 안전합니다.
ClassName_fieldName
예시 자바
package com.google;
class Foo {
public static final MY_FINAL_INT = 5;
public static int myInt;
public static String myString;
}
Objective-C 예
// Access a primitive constant field.
jint i = ComGoogleFoo_MY_FINAL_INT; // No class initialization
i = ComGoogleFoo_get_MY_FINAL_INT(); // Class initialization
// Access a primitive field.
i = ComGoogleFoo_get_myInt();
// Set a primitive field.
ComGoogleFoo_set_myInt(5);
// Access a non-primitive field.
NSString *s = ComGoogleFoo_get_myString();
// Set a non-primitive field.
ComGoogleFoo_set_myString(@"bar");
열거형
J2ObjC는 각 자바 enum에 대해 두 가지 유형을 생성합니다. 자바 enum의 모든 기능을 제공하는 Objective-C 클래스 유형이 생성됩니다. 또한 C enum은 기초 프레임워크의 NS_ENUM 매크로를 사용하여 생성됩니다. Objective-C 클래스 유형은 생성된 모든 API에서 사용됩니다. C enum은 Switch 문의 상수 값 또는 스토리지 유형으로 유용합니다.
생성된 enum 유형의 이름은 다음과 같습니다.
- Objective-C 클래스는 일반 자바 클래스와 동일한 규칙을 사용하여 이름이 지정됩니다. (유형 참고)
- C enum에는 '_Enum' 접미사가 추가된 일반 자바 클래스로 이름이 지정됩니다.
enum 상수는 정적 필드처럼 액세스됩니다.
예시 자바
package com.google;
enum Color {
RED, GREEN, BLUE
}
Objective-C 헤더 예시
typedef NS_ENUM(NSUInteger, ComGoogleColor_Enum) {
ComGoogleColor_Enum_RED = 0;
ComGoogleColor_Enum_GREEN = 1;
ComGoogleColor_Enum_BLUE = 2;
};
@interface ComGoogleColor : JavaLangEnum < NSCopying >
+ (IOSObjectArray *)values;
+ (ComGoogleColor *)valueOfWithNSString:(NSString *)name;
@end
inline ComGoogleColor *ComGoogleColor_get_RED();
inline ComGoogleColor *ComGoogleColor_get_GREEN();
inline ComGoogleColor *ComGoogleColor_get_BLUE();
// Provides conversion from ComGoogleColor_Enum values.
FOUNDATION_EXPORT ComGoogleColor *ComGoogleColor_fromOrdinal(NSUInteger ordinal);