함수의 매개변수에는 기본값(default value)을 선언할 수 있습니다. 만약 어떤 매개변수에 기본값을 선언했다면 호출할 때 인자를 전달하지 않아도 되며 이때 선언문에 명시한 기본값이 적용됩니다.
* 기본값 활용 fun main(){ fun some(data1: Int, data2: Int = 10): Int{ return data1 * data2 } println(some(10)) println(some(10, 20)) } >> 실행결과 100 200
어떤 함수의 매개변수가 여러 개면 호출할 때 전달한 인자를 순서대로 할당합니다. 즉, 첫 번째 인자를 첫 번째 매개변수에 할당합니다. 그런데 호출할 때 매개변수명을 지정하면 매개변숫값의 순서를 바꿔도 됩니다.
* 매개변수명 생략 - 매개변수 순서대로 할당 fun some(data1: Int, data2: Int): Int { return data1 * data2 } println(some(10, 20))
위 소스처럼 some() 이라는 함수에 매개변수를 2개 선언하고 some(10, 20)으로 함수를 호출하면 data1에 10, data2에 20을 대입합니다. 그런데 오른쪽처럼 매개변수명을 지정해서 호추할 수 있습니다.
* 매개변수명을 지정하여 호출 some(data2 = 20, data1 = 10)
매개변수명을 지정하여 호출하는 것을 명명된 매개변수라고 합니다. 이렇게 하면 함수 선언문의 매개변수 순서에 맞춰 호출하지 않아도 됩니다.
컬렉션 타입
여러개의 데이터를 표현하는 방법이며, Array List Set Map 이 있습니다.
Array – 배열 표현
코틀린의 배열은 Array 클래스로 표현합니다. Array 클래스의 생성자에서 첫 번째 매개변수 배열의 크기이며 두 번째 매개변수는 초깃값을 지정하는 함수 입니다. 배열의 타입은 제네릭으로 표현합니다. Array<Int>로 선언하면 정수 배열을 의미하며 Array<String>으로 선언하면 문자열 배열을 의미합니다.
* Array 클래스의 생성자 <init>(size: Int, init: (Int) -> T)
오른쪽 코드는 Array() 생성자의 첫 번째 인자가 3이고 두번 째 인자는 0을 반환하는 람다 함수이므로 0으로 초기화한 데이터를 3개 나열한 정수형 배열을 선언합니다.
* 배열 선언 예 val data1: Array<Int> = Array(3, {0})
배열의 데이터에 접근할 때는 대괄호([])를 이용해도 되고 set()이나 get() 함수를 이용할 수도 있습니다.
* 배열의 데이터에 접근하는 예 fun main(){ val data1: Array<Int> = Array(3, {0}) data[0] = 10 data[1] = 20 data.set(2, 30) println( """ array size : ${data1.size} array data : ${data1[0]}, ${data1[1]}, ${data1.get(2)} """ ) } >> 실행결과 array size : 3 array data : 10, 20, 30
기초 타입의 배열
기초 타입이라면 Array 클래스를 사용하지 않고 각 기초 타입의 배열을 나타내는 클래스를 이용할 수도 있습니다. 즉 BooleanArray, ByteArray, CharArray, DoubleArray, FloatArray, IntArray, LongArray, ShortArray 클래스를 이용할 수도 있습니다.
* 기초 타입 배열 선언 val data1: IntArray = IntArray(3, {0}) val data2: BooleanArray = BooleanArray(3, {false})
또한 arrayof() 라는 함수를 이용하면 배열을 선언할 때 값을 할당할 수도 있습니다.
* 배열 선언과 동시에 값 할당 fun main(){ val data1 = arrayOf<Int>(10, 20, 30) println( """ array size : ${data1.size} array data : ${data1[0]}, ${data1[1]}, ${data1.get(2)} """ ) } >> 실행결과 array size : 3 array data : 10, 20, 30
arrayOf() 함수도 기초 타입을 대상으로 하는 booleanArrayOf(), byteArrayOf(), charArrayOf(), doubleArrayOf(), floatArrayOf(), intArrayOf(), longArrayOf(), shortArrayOf() 함수를 제공합니다.
* 기초 타입 arrayOf() 함수 val data1 = intArrayOf(10, 20, 30) val data2 = booleanArrayOf(true, false, true)
List Set Map
Collection 인터페이스 타입으로 표현한 클래스이며 통틀어서 컬렉션 타입 클래스라고 합니다.
List : 순서가 있는 데이터 집합으로 데이터 중복을 허용
Set : 순서가 없으며 데이터의 중복을 허용하지 않음
Map : 키와 값으로 이루어진 데이터 집합으로 순서가 없으며 키의 중복은 허용하지 않음
Collection 타입의 클래스는 가변 클래스와 불변 클래스로 나뉩니다.
불변 클래스 : 초기에 데이터를 넣으면 이제 변경 불가
가변 클래스 : 초기에 데이터를 넣은 후에도 추가하거나 변경 가능
List를 예로 들면 코틀린에서는 가변과 불변이라는 2가지 타입의 클래스를 제공합니다. List는 불변 타입이므로 size(), get() 함수만 제공하고 데이터를 추가하거나 변경하는 add(), set() 함수는 제공하지 않습니다. 그런데 MutableList는 가변 타입이므로 size(), get() 함수 이외에 add(), set()함수를 이용할 수 있습니다. 이는 Set, Map 도 마찬가지 입니다. Set, Map 은 불변 타입이며 MutableSet, MutableMap은 가변 타입입니다.
* 가변 타입과 불변 타입성 * <구분> <타입> <함수> <특징> List List listOf() 불변 MutableList mutableListOf() 가변 Set Set setOf() 불변 MutableSet mutableSetOf() 가변 Map Map mapOf() 불변 MutableMap mutableMapOf() 가변
다음 소스는 listOf() 함수로 List 객체를 만들며 매개변수에 초깃값을 대입합니다. List 객체의 데이터는 배열처럼 대괄호를 이용해 얻을 수도 있지만 get() 함수를 사용해도 됩니다.
* 리스트 사용 예 fun main(){ var list = listOf<Int>(10, 20, 30) println( """ list size : ${list.size} list data : ${list[0]}, ${list.get(1)}, ${list.get(2)} """ ) } >> 실행결과 list size : 3 list data : 10, 20, 30
MutableList는 mutableListOf() 함수로 만들며 데이터를 추가하거나 변경할 때는 add(), set() 함수를 이용할 수 있습니다.
* 가변 리스트 사용 예 fun main() { var mutableList = mutableListOf<Int>(10, 20, 30) mutableList.add(3, 40) mutableList.set(0, 50) println( """ list size : ${mutableList.size} list data : ${mutableList[0]}, ${mutableList.get(1)}, ${mutableList.get(2)}, ${mutableList.get(3)} """ ) } >> 실행결과 list size : 4 list data : 50, 20, 30, 40
Map 객체는 키와 값으로 이루어진 데이터의 집합입니다. Map 객체의 키와 값은 Pair 객체를 이용할 수도 있고 ‘키 to 값’ 형태로 이용할 수도 있습니다.
* 집합 사용 예 fun main() { var map = mapOf<String, String>(Pair("one", "hello"), "two" to "world") println( """ map size : ${map.size} map data : ${map.get("one")}, ${map.get("two")} """ ) } >> 실행결과 map size : 2 map data : hello, world
위 코드에서 mapOf() 함수를 이용해 Map 객체를 만들었습니다. 이때 <String, String> 제네릭 타입을 지정하였고 따라서 Map 객체에 대입되는 데이터의 키와 값은 모두 String 타입이 됩니다. Pair(“one”, “hello”)처럼 키값을 Pair 객체로 표현해서 Map에 대입할 수도 있고, “two” to “world” 처럼 Map 객체에 대입할 수도 있습니다.