코틀린 표준 라이브러리의 활용

hyeon·2022년 9월 21일
0

코틀린 스터디

목록 보기
3/5

제네릭과 배열

제네릭 다루기

제네릭과 람다식

형식 매개변수(=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>()	//범위에 없으므로 오류 발생
}

가변성의 3가지 유형

~이해가 잘안됨~

reified 자료형

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은 가변형 컬렉션을 지원하기 위해 준비된 인터페이스이며 요소를 추가하거나 제거하는 기능을 수행한다.

List


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")

  • Array와 list의 차이
    배열은 내부 구조상 고정된 크기의 메모리 리스트는 늘리거나 줄이는 것이 가능함.
    Array< T >는 상하위 관계가 성립하지 않는 무변성이기 때문에 Array < Int >는 Array와 무관하지만(MutableList< T >도 이와 동일함.) List는 공변성이기 때문에 하위인 List< Int >가 List< Number >에 지정될 수 있다.

시퀀스

시퀀스는 순차적인 컬렉션으로 요소의 크기를 특정하지 않고 나중에 결정할 수 있는 특수한 컬렉션이다.
잘모르겠당

profile
남기고 싶은 개발자입니다 :>

0개의 댓글