Kotlin 시리즈 의 배열 과 집합

오늘 은 kotlin 의 배열 과 집합 에 대해 이야기 합 니 다.
앞에서 말 했 듯 이 kotlin 은 더욱 순수한 대상 을 대상 으로 하 는 언어 이기 때문에 kotlin 의 배열 과 집합 은 자바 와 다 를 수 있 습 니 다.그러나 성능 을 고려 하기 위해 서 입 니 다.또한 kotlin 의 최종 컴 파일 결과 물 은 JVM 위 에서 실행 되 고 kotlin 과 자바 의 좋 은 상호작용 성 을 유지 하기 위해 서 입 니 다.그래서 kotlin 의 최종 컴 파일 결과 물 은 가능 한 한 자바 의 컴 파일 결과 물 에 접근 하고 있 습 니 다.
개체 배열
우 리 는 이전 코드 에서 kotlin 의 main 함수 가 이렇게 쓰 여 있 는 것 을 보 았 다.
fun main(args: Array){

}

자바 의 main 함수 표기 법 을 비교 해 봅 시다.
public static void main(String[] args) {
        
}

kotlin 의 대상 배열 의 쓰기 와 일반적인 쓰기 가 비슷 하 다 는 것 을 알 수 있 습 니 다.이것 이 바로 kotlin 에서 대상 배열 의 성명 방식 입 니 다.사실은 kotlin 에서 다음 과 같은 세 가지 방식 으로 대상 배열 을 만 들 수 있 습 니 다.1.array Of 함수 와 지정 한 배열 요 소 를 사용 하여 배열 을 만 들 수 있 습 니 다.
//Java  :
String[] params1 = {"str1", "str2", "str3"};

//kotlin  :
val params1 = arrayOf("str1", "str2", "str3")

2.arrayOfNulls 함 수 를 사용 하여 지정 한 크기 를 만 들 고 모든 요 소 를 null 로 초기 화 하 는 배열
//Java  :
String[] params2 = new String[12];

//kotlin  :
val params2 = arrayOfNulls(12)

3.Array 구조 방법 은 배열 크기 와 요 소 를 생 성 하 는 lambda 표현 식 을 지정 합 니 다.
이 방법 으로 만 든 배열 은 모든 요소 가 비어 있 지 않 습 니 다.아래 와 같이:
//kotlin  :
val params3 = Array(3){i -> "str" + i }

배열 의 원본 크기 가 확정 되 었 기 때문에 lambda 표현 식 에서 배열 의 아래 표 시 를 받 고 이 아래 표 시 된 위치의 값 을 되 돌려 줍 니 다.
kotlin 의 자동 유도 에 따라 우 리 는 일반적인 형식 을 생략 할 수 있 습 니 다.lambda 내부 의 it 매개 변수 이름 에 따라 i 를 쓰 지 않 아 도 됩 니 다.문자열 템 플 릿 에 따라 우 리 는'+'를 사용 하지 않 고 문자열 을 연결 할 수 있 기 때문에 위의 코드 는 이렇게 쓸 수 있 습 니 다.
val params3 = Array(3){"str$it"}

주의해 야 할 것 은 위의 세 가지 방식 으로 만 든 배열 은 모두 대상 배열 이다.예 를 들 어 Array 형식의 배열 을 만 들 었 다 면 그 중의 모든 유형 은 자바 의 Integer 형식 에 대응 하고 컴 파일 된 class 파일 에 대응 하 는 배열 의 모든 요소 도 Integer 형식 입 니 다.
기본 데이터 형식 배열
대부분의 경우 대상 형식의 배열 을 만 들 고 싶 지 않 습 니 다.자바 의 기본 데이터 형식 과 같은 배열 을 만 들 고 싶 습 니 다.이때 kotlin 은 다음 세 가지 함수 로 기본 데이터 형식의 배열 을 만 들 수 있 습 니 다.1."xxxArray"와 같은 구조 방법 은 모든 기본 데이터 형식 에 대응 하 는 구조 함수 가 있 습 니 다.이러한 구조 함 수 는 하나의 배열 크기 를 받 고 기본 데이터 형식의 기본 값 으로 배열 을 초기 화 합 니 다.아래 와 같이:
val array1 = IntArray(5)

2."xxxArray Of"함수 와 같이 배열 을 지정 하고 배열 을 만 듭 니 다.아래 와 같이:
val array2 = intArrayOf(1, 2, 3, 4)

위의 이 함수 의 매개 변 수 는 가 변 매개 변수 입 니 다.자바 의 가 변 긴 매개 변수 와 유사 합 니 다.만약 에 우리 가 하나의 배열 을 가지 고 다른 배열 을 초기 화 하려 면 우 리 는'*'를 사용 하여 한 배열 을 패키지 해제(전개 로 간단하게 이해 할 수 있 습 니 다)한 다음 에 가 변 매개 변수 에 값 을 부여 해 야 합 니 다.아래 와 같이:
val x = IntArray(3);
val array2 = intArrayOf(*x)

3.배열 크기 와 lambda 를 받 아 배열 을 만 듭 니 다.이런 방식 은 우리 위의 대상 배열 의 생 성 방법 과 마찬가지 로 아래 의 예제 코드 를 직접 봅 니 다.
val array3 = IntArray(5){ it * it }

위의 방법 으로 만 든 배열 은 자바 의 기본 데이터 형식의 배열 로 컴 파일 됩 니 다.대상 유형의 배열 에 비해 포장 과 상 자 를 뜯 는 절차 가 적 고 성능 도 좋 습 니 다.
집합 과 가공 성
앞에서 말 했 듯 이 kotlin 의 유형 은 비 어 있 는 유형 과 비 어 있 는 유형 으로 나 눌 수 있 습 니 다.이에 따라 하나의 집합 에 대해 서도 이 집합 에 null 값 을 저장 할 수 있 는 지,비 어 있 는 값 을 포함 하 는 집합 과 비 어 있 는 값 을 포함 하 는 집합 에 대응 하 는 지 고려 해 야 합 니 다.아래 와 같 습 니 다.
//        
val list1 = ArrayList()
list1.add(null)

val list2 = ArrayList()
//   
//list2.add(null)

위 에 서 는 kotlin 에서 일반적인 형식 매개 변 수 를 지원 하 는 빈 성 을 보 여 줍 니 다.
동시에'ArrayList'와 ArrayList 를 구분 하 는 것 도 주의해 야 합 니까?구별앞의 하 나 는 집합 자체 가 비 어 있 는 유형 임 을 나타 내 지만 집합 에 null 값 을 저장 할 수 있 습 니 다.뒤의 하 나 는 집합 자체 가 비 어 있 음 을 나타 내 지만 집합 에는 비 어 있 는 유형의 요소 만 저장 할 수 있다.
읽 기 집합 과 가 변 집합
자바 와 달리 kotlin 은 집합 을 읽 기 전용 집합 과 가 변 집합 으로 나 누 었 다.kotlin 에는 두 가지 집합 인터페이스 가 있 는데 하 나 는 Collection 인터페이스 이다.그 중에서 값 은 집합 의 기본 속성 을 포함한다.예 를 들 어 크기,특정한 요소 가 집합 중간 에 있 는 지 판단 한다.또 다른 인터페이스 인 MutableCollection 은 자체 Collection 인 터 페 이 스 를 계승 하고 집합 수정 과 관련 된 방법 을 추가 했다.예 를 들 어 add,clear,remove 등 이다.
그들의 계승 관계 도 는 다음 과 같다.그림 에서 회색 배경 은 읽 기 전용 집합 이 고 흰색 배경 은 가 변 집합 이다.
위의 그림 에는 맵 이 없고,kotlin 에 서 는 맵 이 위의 계승 관계 에 있 지 않다 는 것 을 알 게 될 것 이다.
kotlin 은 왜 이렇게 구분 합 니까?코드 를 작성 할 때 정 의 된 함수 가 들 어 오 는 매개 변수 가 읽 기 전용 집합 이 라면 호출 자 는 이 함수 가 들 어 오 는 집합 을 수정 하지 않 는 다 는 것 을 명확 하 게 알 게 될 것 입 니 다.다음 예 로 설명해 주세요.
fun main(args: Array) {
    //    
    val readOnlyCollection = List(10) { "str$it" }
    printList(readOnlyCollection)
}

fun printList(list: Collection){
    for (x in list){
        println("   = $x")
    }
}

위 에서 도 주의해 야 할 것 은 읽 기 집합 만 합 쳐 서 는 후속 적 으로 수정 할 수 없 기 때문에 집합 만 읽 을 때 안에 있 는 요 소 를 만들어 야 한 다 는 것 이다.여기 서 주의해 야 할 것 은 읽 기 집합 만 합병 하 는 것 이 반드시 변 하지 않 는 것 은 아니다.무슨 뜻 이 죠?우 리 는 아래 의 코드 를 보 자.
fun main(args: Array) {

    //    
    val mutableList = MutableList(10){it}

    //           
    val readOnlyList: List = mutableList

    //  
    printList(readOnlyList)

    //        
    mutableList.add(10)

    //    
    printList(readOnlyList)
}

/**
 *           
 */
fun printList(list: Collection){
    for (x in list){
        println("   = $x")
    }
}

우 리 는 가 변 집합의 인용 과 읽 기 전용 집합의 인용 을 모두 같은 집합 을 가리킨다.비록 우리 함수 의 매개 변 수 는 집합 만 읽 고 집합 을 수정 하지 않 았 지만 우 리 는 다른 곳 에서 이 집합 을 수정 했다.만약 두 함수 가 모두 이 집합 을 사용 하고 그들 이 동시에 서로 다른 스 레 드 에서 운행 한다 면 그 중의 한 스 레 드 가 이 집합 을 수정 하면 다른 스 레 드 에서 집합 에 대한 읽 기 에 이상 이 생 길 것 이다.그래서 집합 만 읽 고 약속 으로 호출 자 에 게 내 방법 에 서 는 당신 이 들 어 온 집합 만 읽 을 수 있다 고 말 할 수 있 습 니 다.
위 에 있 는 쓰기 집합 을 제외 하고 kotlin 이 제공 하 는 집합 을 만 드 는 함 수 를 살 펴 보 겠 습 니 다.
집합 유형
읽 기만 하 다
가 변
List
listOf
mutableListOf arrayListOf
Set
setOf
mutableSetOf hashSetOf linkedSetOf sortedSetOf
Map
mapOf
mutableMapOf hashMapOf linkedMapOf sortedMapOf
위의 함 수 를 사용 하면 kotlin 의 집합 대상 을 편리 하 게 만 들 수 있 습 니 다.
kotlin 집합 과 자바 집합 상호 조정
kotlin 에서 만 든 집합 은 자바 방법 에 직접 전달 하여 조작 할 수 있 습 니 다.다음은 kotlin 집합 과 자바 집합 이 서로 호출 될 때 주의 하 는 점 을 보 겠 습 니 다.우선 kotlin 에서 설명 한 집합 이 자바 에서 사 용 될 때 주의해 야 할 점 을 보 세 요.1.읽 기 전용 집합 은 자바 에서 제약 을 받 을 수 없습니다.kotlin 에서 읽 기 전용 집합 을 설명 하면 자바 에 서 는 일반적인 집합 으로 만 생각 합 니 다.자바 는 다음 코드 처럼 수정 할 수 있 습 니 다.
//Java  
import java.util.Collection;

public class Sample {
    public static void modifyCollection(Collection collection){
        //        kotlin    
        if (collection != null){
            collection.add("xxxx");
        }

        for (String x : collection){
            System.out.println(x);
        }
    }
}

//kotlin  
fun main(args: Array) {
    //        
    val list1 = listOf("str1", "str2", "str3")
    Sample.modifyCollection(list1)
}

2.집합 유형 매개 변 수 는 자바 에서 제약 을 받 을 수 없습니다.앞에서 말 했 듯 이 kotlin 의 집합 은 일반적인 유형 매개 변수 에서 이 집합 에 있 는 요소 가 비어 있 는 지 여 부 를 제약 할 수 있 습 니 다.그러나 자바 에 서 는 유형 을 비어 있 는 유형 과 비어 있 지 않 은 유형 으로 나 누 지 않 았 기 때문에 자바 는 집합 에 null 값 을 추가 할 수 있 습 니 다.아래 와 같 습 니 다.

//kotlin  
fun main(args: Array) {
    val list1: MutableCollection = mutableListOf("str1", "str2", "str3")
    //  ,        
    //list1.add(null)
    Sample.modifyCollection(list1)
}

//Java  
import java.util.Collection;

public class Sample {
    public static void modifyCollection(Collection collection){
        if (collection != null){
            //Java        null 
            collection.add(null);
        }
    }
}

사실 위 에서 도 잘 이해 합 니 다.kotlin 은 kotlin 과 관련 된 컴 파일 차원 에서 만 비 공 성 을 판단 할 수 있 습 니 다.만약 에 호출 하 는 방법 이 자바 코드 에 있다 면 kotlin 은 호출 자가 이러한 제약 을 깨 뜨 렸 다 는 것 을 알 아차 릴 수 없습니다.
자바 에서 설명 한 집합 을 살 펴 보 겠 습 니 다.kotlin 코드 에서 사 용 될 때 주의해 야 할 점 입 니 다.
우 리 는 앞의 글 에서 플랫폼 유형 을 말 했 습 니 다.이런 상황 에서 도 플랫폼 유형 입 니 다.자바 에서 설명 한 집합 은 kotlin 에서 플랫폼 유형 으로 간주 되 고 가 변 집합 일 수도 있 고 읽 기 집합 일 수도 있 습 니 다.우 리 는 간단 한 예 를 들 어 자바 에서 이러한 인 터 페 이 스 를 설명 했다 고 가정 합 니 다.
//Java  
import java.util.List;

public interface DataProcessor {
    void process(List list);
}

위 에서 우리 가 설명 한 인터페이스 중의 process 방법 중의 형 삼 은 집합 유형 이다.우 리 는 kotlin 에서 우리 가 이 인 터 페 이 스 를 어떻게 실현 하 는 지 살 펴 보 자.koltin 에서 이 인 터 페 이 스 를 플랫폼 유형 으로 보기 때문에 kotlin 에서 다음 과 같은 몇 가지 인터페이스 실현 방식 은 모두 허용 된다(구체 적 인 차 이 는 코드 의 설명 을 볼 수 있다).
1.방식 1
class Main : DataProcessor{
    //             ,
    //              ,
    //       
    override fun process(list: MutableList) {
    }
}

2.방식 2
class Main : DataProcessor{
    //             ,
    //              ,
    //       
    override fun process(list: List) {
    }
}

3.방식 3
class Main : DataProcessor{
    //             ,
    //            ,
    //       
    override fun process(list: MutableList) {
    }
}

4.방식 4
class Main : DataProcessor{
    //             ,
    //            ,
    //       
    override fun process(list: List) {
    }
}

5.방식 5
class Main : DataProcessor{
    //             ,
    //            ,
    //       
    override fun process(list: MutableList?) {
    }
}

6.방식 6
class Main : DataProcessor{
    //             ,
    //            ,
    //       
    override fun process(list: List?) {
    }
}

7.방식 7
class Main : DataProcessor{
    //             ,
    //            ,
    //       
    override fun process(list: MutableList?) {
    }
}

8.방식 8
class Main : DataProcessor{
    //             ,
    //            ,
    //       
    override fun process(list: List?) {
    }
}

변수 자체 와 유형 매개 변 수 는 빈 공간 과 비 빈 공간 으로 나 뉘 기 때문에 집합 은 가 변 과 읽 기 전용 의 구분 이 있 기 때문에 위 에서 8 가지 상황 이 파생 되 었 다.우리 의 구체 적 인 사용 에서 우 리 는 실제 상황 에 따라 적당 한 형식 을 선택해 야 한다.
집합 과 배열 이 서로 전환 하 다.
마지막 으로 다시 한 번 보충 하면 집합 유형 과 배열 유형 을 서로 연결 할 수 있 고 인 코딩 과정 에서 우 리 는 자주 사용 합 니 다.
fun main(args: Array) {
    
    //      
    val array1 = arrayListOf("str1", "str2", "str3")

    //        
    val list1 = array1.toList()
    
    //        
    val array2 = list1.toTypedArray()
}

마지막 에 쓰다
이상 은 kotlin 에서 집합 과 배열 에 관 한 내용 입 니 다.이 를 통 해 알 수 있 듯 이 kotlin 은 자바 기 존의 데이터 인 터 페 이 스 를 충분히 이용 하고 자신의 확장 을 했 습 니 다.또한 좋 은 상호 조정 성 을 유지 하기 위해 플랫폼 유형 을 도입 하여 일부 타협 을 했 습 니 다.

좋은 웹페이지 즐겨찾기