본문 바로가기

Study/Book

다재다능 코틀린 프로그래밍 / 콜렉션 사용하기

반응형

kotlin.collections 패키지에 Java 콜렉션에 유용한 함수들이 많이 추가되었다.

코틀린에서는 Java의 콜렉션을 각자 편한 방법대로 사용할 수 있다. 동일한 콜렉션이면 코틀린이 추가한 메소드를 사용할 수 있다.

 

JAVA에서 명령형 스타일의 for-each가 아닌 함수형 스타일의 forEach문을 사용한다면 인덱스는 사용 할 수 없다.

코틀린은 withIndex() 메소드를 제공해서 인덱스와 값 모두를 편하게 얻게 해준다.

// JAVA
for(int i = 0 ; i < names.size() ; i++){
	System.out.println(names.get(i));
}
for(String name : names) {
	System.out.println(name);
}

// Kotlin
val names = listOf("TOM","JERRY")
println(names.javaClass) // class java.util.Arrays$ArrayList
for((index, value) in names.withIndex()){
	println("$index $value") // 0 Tom \n 1 Jerry
}

 

리스트, 셋, 맵은 각기 뷰를 두가지씩 가지고 있다.

읽기전용 뷰 - 이뮤터블 뷰 : 읽기 연산자만 사용 가능 / 쓰기 시도할 경우 컴파일 단계에서 실패

(List, MutableList는 코틀린의 ArrayList 뷰. 요소를 추가하거나 인덱스를 이용해서 값을 set하려고 하면 컴파일 시점에서 실패)

읽기-쓰기 뷰 - 뮤터블 뷰

오리지날 콜렉션 대신 이 뷰들을 사용하면 런타임 시 오버헤드가 없고, 컴파일 시간이나 실행 시간에 변환이 발생하지 않는다.

 

주의사항! 읽기전용 뷰가 스레드 안정성을 제공해준다고 가정하면 안된다.

읽기전용 참조는 뮤터블 콜렉션이다. 직접 콜렉션을 변경할 수는 없지만, 다른 스레드가 참조하고 있는 콜렉션을 변경하지 않는다는 걸 보장해주지 않는다.

 

튜플 : 작고 셀 수 있는 크기의 객체의 배열

코틀린은 두 개의 사이즈의 튜플만을 호용한다.

println(Pair("Tom","Jerry")) // (Tom, Jerry)
println(mapOf("Tom" to "Cat", "Jerry" to "Mouse")) // {Tom=Cat, Jerry=Mouse}

문자열의 페어를 만드는 예제이다. 

Pair 생성자를 이용해서 인스턴스를 만들었다.

to() 확장함수를 이용해서 Map의 엔트리가 될 페어를 만들었다.

 

// 공항의 온도를 공항 코드별로 수정
val airportCodes = listOf("LAX", "SF", "PDX", "SEA")
val temperatures = 
	airportCodes.map { code -> code to getTemperatureAtAirport(code) }
for (temp in temperatures){
	println("Airport : ${temp.first} : Temperature: ${temp.seconde}")
}

fun getTemperatureAtAirport(code : String) : String =
	"${Math.round(Math.random() * 30) + code.count()} C"
    
 /*
 Airport: LAX: Temperature: 25C
 Airport: SFO: Temperature: 21C
 .
 .
 .
 */

 

airportCodes 콜렉션을 함수형 스타일로 map() 반복자를 이용해서 반복.

반복문은 airportCodes가 가지고 있던 공항 코드를 (코드, 온도) 꼴로 Pair로 도치시켰다.

airpotCodes는 List<Pair<String,String>>이 되었다.