자바 와 Kotlin 사이 에서 어떻게 상호작용 을 하 는 지 상세 하 게 설명 합 니 다.

머리말
현재 kotlin 은 구 글 이 처음으로 안 드 로 이 드 를 개발 하 는 언어 이지 만 역사적 인 원인 으로 인해 우 리 는 대부분의 프로젝트 가 자바 위주 로 되 어 있다.즉,자바 와 Kotlin 두 가지 언어 가 동시에 개발 되 는 상황 이 존재 한 다 는 것 이다.
오래된 프로젝트 를 모두 Kotlin 으로 번역 하면 어떻게 할 수 있 지만 비용 은 매우 크다 고 말 할 수 있다.우 리 는 조금씩 kotlin 언어 로 이동 할 수 밖 에 없다.
그러면 이전 과정 에서 자바 와 Kotlin 이 서로 호출 되 는 상황 을 피 할 수 없다.즉,Kotlin 은 자바 나 자바 에서 Kotlin 을 호출 합 니 다.다음은 두 사람 이 서로 조작 하 는 해결 방안 을 구체 적 으로 살 펴 보 자.
kotlin 호출 자바
가 공 성(Nullability)
자바 의 기본 값 은 비어 있 고 kotlin 은 없어 서 자바 방법 을 호출 할 때 빈 값 을 받 을 수 있 을 지 모 르 겠 습 니 다.
그래서 저희 가 Kotlin 에서 자 바 를 호출 할 때 추가 해 야 하나 요?아니면!Kotlin 에 게 빈 값 이 나타 날 수 있 음 을 알려 줍 니 다.
예 를 들 어 자바 방법 이 있 습 니 다.문자열 을 받 은 후에 문자열 을 되 돌려 줍 니 다.

public Set<String> toSet(Collection<String> elements){
 //TODO
}
그러면 Kotlin 은 호출 할 때 입력 과 출력 이 비어 있 는 지 확인 할 수 없습니다.그냥 써 야 돼?아니면!판단 을 보조 하 겠 습 니 다.​
Kotlin 호출 을 편리 하 게 하기 위해 저 희 는 보통@NotNull 주 해 를 사용 하여 자바 코드 의 비 원시 적 인 매개 변수,필드,반환 값 을 표시 합 니 다.

@NotNull
Set<@NotNull String> toSet(@NotNull Collection<@NotNull String> elements){
 //TODO
}
이 Kotlin 은 호출 할 때 비어 있 으 면 안 된다 는 것 을 명확 하 게 알 고 있 습 니 다.여 기 는 jetBrain 의@NotNull 주 해 를 사용 합 니 다.물론 다른 선택 도 있 습 니 다.다음 그림 과 같 습 니 다.

JetBrain 이나 Android 를 사용 하 는 것 을 추천 합 니 다.
접두사 속성:(getter,setter)
자바 비 안 을 사용한다 면,우 리 는 Kotlin 에서 호출 하 는 데 문제 가 없 을 것 입 니 다.
빈 매개 변수 방법 이 get 으로 시작 하면 Kotlin 은 getter 라 는 것 을 알 고 속성 명 을 통 해 접근 할 수 있 습 니 다.
같은 set 로 시작 하 는 단일 매개 변수 방법 이 라면 Kotlin 은 이것 이 setter 라 는 것 을 알 고 속성 명 을 통 해 직접 값 을 부여 합 니 다.
물론 is 의 작업 원리 도 그것들 과 유사 하 다.
자바 bean 을 정의 합 니 다:

class User {
 
 private String name;
 private int age;

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }
}
Kotlin 방문

val user = User()
user.name = "  " //  
val age = user.age //  age   
키워드(키워드)
kotlin 에는 fun is in objects,type of,val,var,when,type alias 등 시스템 정의 키워드 가 많 습 니 다.
이 키 워드 는 자바 에서 사용 할 수 있 지만,kotlin 에 서 는 사용 할 수 없습니다.
함수 나 매개 변 수 는 이러한 키 워드 를 사 용 했 습 니 다.그러면 kotlin 은 호출 할 때 문제 가 발생 할 수 있 습 니 다.예 를 들 어 자바 에서 is 라 는 방법 을 정 의 했 습 니 다.그럼 Kotlin 에서 직접 호출 하면 오류 가 발생 합 니 다.
그렇다면 가장 쉬 운 방법 은 자바 라 이브 러 리 이름 을 바 꾸 는 것 이지 만 3 자 라 이브 러 리 를 호출 하 는 방법 이 라면 이름 을 바 꾸 기 어렵다.
그래서 우리 의 또 다른 해결 방법 은 Kotlin 이 자바 방법 을 호출 할 때'반 따옴표'를 붙 여 사용 하 는 것 이다.

Utils.`is`()
그러나 코드 에 너무 많은 기호 가 나타 나 지 않도록 이름 을 바 꿀 수 있다 면 이름 을 바 꿀 수 있 습 니 다.
확장 방법 과 확장 속성 에 Any 를 사용 하지 않도록 합 니 다.

연산 자 과부하(operator Overloading)
자바 에 서 는 연산 자 를 다시 불 러 오지 않 고 kotlin 에 있 습 니 다.예 를 들 면:

a+b => a.plus(b)
kotlin 에서 연산 자+를 방법 플러스 로 번역 합 니 다.
자바 에서 같은 방법 이름 을 사용 했다 면,예 를 들 어 플러스(plus),마이너스(minus)또는 다른 연산 자 이름 을 사용 했다 면,예상 치 못 하 게 호출 되 지 않도록 연산 자 와 호 환 되 는 지 확인 하 십시오.
Java 호출 Kotlin
JvmName & JvmMultifileClass
우리 가 이전 할 때 자바 의 도구 류 를 Kotlin 확장 함수 나 최상 위 함수 로 번역 합 니 다.그러나 이렇게 처리 한 후에 자바 파일 에서 직접 호출 할 수 없습니다.이 때 우 리 는 주 해 를 추가 해 야 합 니 다@file:JvmName("파일 이름"):
Ext.kt 파일

@file:JvmName("ExtUtils")
package com.demo.javaAndKotlin

fun a(): String {
 ...
}

fun b(): String {
 ...
}
여기 서 우 리 는 이름 을 ExtUtils 라 고 명명 합 니 다.그 밖 에 우 리 는 다른 꼭대기 함수 나 확장 함수 가 있 을 수 있 습 니 다.위의 방식 에 따라 우 리 는 다른 이름 을 지정 할 수 있 습 니 다.그러나 우리 가 ExtUtils 라 는 이름 을 사용 하고 싶 을 때 오류 가 발생 할 수 있 습 니 다.
Duplicate JVM class name
이 때 우 리 는 다른 파일 에 새로운 주 해 를 추가 해 야 합 니 다@file:Jvm MultifileClass.모든 파일 을 새 이름 인 ExtUtils 파일 에 통합 한 다 는 뜻 입 니 다.
ExtOther.kt 파일

@file:JvmMultifileClass
@file:JvmName("ExtUtils")
package com.demo.javaAndKotlin

fun c(str: Any): String {
 ...
}
저 희 는 Ext.kt 파일 에 도@file:Jvm MultifileClass 주 해 를 추가 하면 자바 파일 에서 ExtUtils 를 직접 사용 하여 a(),b(),c()방법 을 호출 할 수 있 습 니 다.
JvmField
kotlin 에서 우리 가 사용 하 는 데이터 클래스 인 data class 는 getter 와 setter 를 지정 할 필요 가 없 으 며 필드 이름 으로 직접 접근 할 수 있 습 니 다.그러나 자바 파일 에서 data class 를 호출 하려 면 getter 와 setter 방법 으로 호출 해 야 합 니 다.여기 서 우 리 는 그들 을 수정 할 수 있 습 니 다.그것 은@JvmField 주 해 를 사용 하 는 것 입 니 다.주 해 를 통 해 필드 를 직접 노출 시 켜 접근 할 수 있 습 니 다.​

data class Person(

 @JvmField var name: String,
 @JvmField var age: Int
)

//java   
Person person = new Person("",1);
person.name = "";
person.age = 10;
그러나 예 외 는 latenit 가 수식 한 필드 가 자동 으로 노출 되 므 로@JvmField 주 해 를 지정 하지 않 아 도 됩 니 다.그리고 const 수식 필드 도 자동 으로 노출 됩 니 다.
또한 자바 에서 setName 을 호출 할 때 이 속성 이름 을 setName 이 라 고 부 르 지 않 으 려 면@set:JvmName 설명 을 사용 해 야 합 니 다.getName 을 수정 할 때@get:JvmName 을 사용 합 니 다.주의해 야 할 것 은@set:JvmName 또는@get:JvmName 주석 을 지정 한 후@JvmField 를 지정 할 필요 가 없습니다.

data class Person(

 @set:JvmName("changeName")
 var name: String,
 @JvmField var age: Int,
 @get:JvmName("likesPink")
 var likesPink: Boolean
){
 lateinit var address:String
}
JvmStatic
자바 파일 의 정적 방법 을 Kotlin 으로 옮 길 때 copanion object 에 넣 습 니 다.그러나 이렇게 처리 한 후에 자바 파일 에서 직접 호출 할 수 없습니다.copanion 대상 인 스 턴 스 방법 으로 호출 해 야 합 니 다.

class MyService {
 internal fun doWork() {
  ...
 }

 companion object {
  fun schedule(context: Context) {
   ...
  }
 }
}

// Java   
MyService.Companion.schedule(this);
다행히 Kotlin 은@JvmStatic 주 해 를 제공 했다.그 는 컴 파일 러 가 클래스 패 키 지 를 완성 한 후에 정적 인 방법 을 만 들 도록 할 것 이다.

class MyService {
 internal fun doWork() {
  ...
 }

 companion object {
   @JvmStatic
  fun schedule(context: Context) {
   ...
  }
 }
}

// Java   
MyService.schedule(this);
JvmOverloads
Kotlin 에서 우 리 는 함수 의 매개 변수 에 기본 값,즉 기본 매개 변 수 를 설정 할 수 있 습 니 다.하지만 이 기능 은 자바 에는 없다.아무런 처리 도 하지 않 으 면 자바 에서 함 수 를 호출 할 때 모든 인자 가 들 어 와 야 합 니 다.그러면 우리 가 설정 한 기본 매개 변 수 는 아무런 의미 가 없습니다.
그래서 Kotlin 은 우리 에 게@JvmOverloads 주 해 를 제 공 했 습 니 다.이 주 해 를 사용 하면 Kotlin 컴 파일 러 가 왼쪽 에서 오른쪽으로 순서대로 선택 할 수 있 는 매개 변수 에 재 부팅 을 생 성 할 수 있 습 니 다.

@JvmOverloads
fun Bitmap.resize(width: Int, height: Int = 200) {

}

//java  
ExtUtils.resize(bitmap,100);
여기 서 우 리 는 Kotlin 에서 Bitmap.resize 방법의 의 미 를 쉽게 이해 할 수 있 지만 ExtUtils.resize 가 이렇게 호출 될 때 방법 명 이 명확 하지 않 습 니 다.그래서 우 리 는@JvmName 주 해 를 사용 하여 이름 을 지정 할 수 있 습 니 다.

@JvmName("resizeBitmap")
@JvmOverloads
fun Bitmap.resize(width: Int, height: Int = 200) {

}
//java  
ExtUtils.resizeBitmap(bitmap,100);
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기