형식 매개변수(=T)로 선언된 함수의 매개변수를 연산할 경우에는 자료형을 결정할 수 없기 때문에 오류가 난다.
fun <T> add(a:T, b:T) : T{
return a+b //자료형을 아직 결정할 수 없기 때문에 오류가난다.
}
====>
fun <T> add(a:T, B:T, op:(T,T)->T) :T {
return op(a,b)
}
fun main(){
val result=add(2,3,{a,b->a+b})
println(result)
}
위의 코드와 같이 람다식을 매개변수로 받으면 자료형을 결정하지 않아도 실행시 람다식 본문을 넘겨 줄 때(위 코드는 main에서) 결정되므로 이런 문제를 손쉽게 해결 할 수있다.
코틀린에서는 콜론(:)을 사용해 제한한다. 형식 매개변수 다음에 콜론과 자료형을 기이바면 매개변수 T의 자료형이 제한된다.
여러개의 조건에 맞춰 제한하고싶을 때 => where 키워드 사용 (제한을 모두 포함하는 경우만 허용할 수 있다)
class Calc<T:Number>{ //자료형 형식 매개변수 제한
fun plus(arg1:T,arg2:T):Double{
return arg1.toDouble()+arg2.toDouble()
}
}
class HandlerA : InterfaceA,InterfaceB
class HandlerB : InterfaceA
class ClassA<T> where T: InterfaceA, T: InterfaceB
// 2개의 인터페이스를 구현하는 클래스로 제한
fun main(){
val calc=Calc<Int>()
println(calc.plus(10,20))
val calc2=Calc<String>() // 자료형이 제한되었기 때문에 오류발생
val obj1=ClassA<HandlerA>() //객체 생성가능
val obj2=ClassA<HandlerB>() //범위에 없으므로 오류 발생
}
~이해가 잘안됨~
T 자료형은 실행시간에 삭제되기 때문에 T자체에 그대로 접근할 수 없다. 컴파일 시간에 접근가능하나 함수 내부에서 사용하려면 매개변수를 넣어 c:Class처럼 지정해야 접근가능하다.
매개변수형식 매개변수에 직접 접근하려면 reified로 지정한다.
reified 자료형은 인라인 함수에만 사용할 수 있다.
arrayOf()나 Array() 생성자를 사용해 배열을 만든다.
val numbers=arrayOf(4,5,6,7)
val animals=arrayOf("Cat","Dog","lION")
val mixArr=arrayOf(4,5,7,"Chike",false) //특정 자료형으로 제한하지 않는다면 여러 자료형을 혼합할 수 있음
//자료형을 제한하려면
val arr=arrayOf<Int>(4,5,5)
val arr2=intArrayOf(4,5,6)
자료형을 제한하려면 arrayOf<자료형>()이나 자료형이름ArrayOf() 형태로 나타낼 수 있다.
get()과 set()메서드가 있다.
println(arr.get(2)) //게터를 통한접근
println(arr[2]) //연산자 오버로딩으로 대괄호를 통한 접근
arr.set(2,7) //인덱스 2번 요소를 7로 교체
arr[0]=8 //인덱스 0번을 8로 교체
val arr2=arr.plus(6) //길이가 5로 고정된 배열에 하나의 요소를 추가한 새배열 arr2 생성
val arr3=arr1.sliceArray(0..2) //필요한 범위를 잘라내 새배열 생성
val sorted=arr.sortedArray() //오름차순 정렬
val sortedreverse= arr.sortedArrayDescending() //내림차순 정렬해서 새로운 배열로
arr.sort(1,3) //원본배열을 정렬
arr.sortDescending()
//SortBy를 이용한 특정 표현식에 따른 정렬
val items=arrayOf<String>("Dog","Cat","Lion)
items.sortBy{item->item.length}
기타 메서드
387~392
String s1="hello";
String s2=new String("hello");
s1은 이터럴 기반의 참조 자료형으로 생성되어 JVM의 메모리 중 상수 풀에 저장된다. NEW로 선언된 String의 객체는 힙에 생성된다. 자바 7부터 gc대상에 포함되어 참조가 없으면 메모리에서 삭제된다
s="abcdef"
s1="abced"
println(s.substring(0..2)) //인덱스 0~2의 abc 반환
println(s.compareTo(s1)) //문자열 비교 대소문자 무시하려면 s.compareTo(s2,true)
var s=StringBuilder("Hello")
s[2]='x' //허용되지 않았던 요소의 변경이 가능함
"123".toInt() //정수로 변환
한번 할당하면 읽기전용이 되는 불변형 컬렉션과 가변형 컬렉션(자바는 다 가변형)이 있음
코틀린 컬렉션 인터페이스 구성
가장 상위의 Iterable 인터페이스는 컬렉션이 연속적인 요소를 표현 할 수 있도록 한다.
public interface Iterable<out T>{
public abstract operator fun iterator(): Iterator<T>
}
iterator()는 hasNext()와 next()메소드를 가지고 요소를 순환한다. 형식 매개변수는 공변성을 제공하도록 out으로 선언되어있다.
Collection에서 상속받은 Set과 List는 불변형이다.
MutableIterable과 MutableCollection은 가변형 컬렉션을 지원하기 위해 준비된 인터페이스이며 요소를 추가하거나 제거하는 기능을 수행한다.
fun main(){
var numbers: List<Int>=listOf(1,2,3) //불변형 List의 사용
//요소의 인덱스를 통해 List에 접근하려면 .indices멤버를 추가한다.
for(index in numbers.indices){
println("numbers[$index]=${numbers[index]}")
}
}
val emptyList: List<String>=emptyList<String>() //비어있는 리스트 생성
//가변형 list를 생성하고 자바의 arrayList로 변환
val stringList: ArrayList<String>=arrayListOf<String>("Hello","Kotlin","wow")
stringList.add("java")
stringList.remove("hello")
//가변형 mutableListOf() 함수를 사용해서도 가능
val mutableList:MutableList<String>=mutableListOf<String>("Kildong","Dooly")
시퀀스는 순차적인 컬렉션으로 요소의 크기를 특정하지 않고 나중에 결정할 수 있는 특수한 컬렉션이다.
잘모르겠당