Kotlin Study_3

김민진·2022년 3월 16일
0

kotlin

목록 보기
5/5
fun <T> Collction<T>.joinToString( => Collection<T>에 대한 확장 함수를 선언한다.
	separator:String = ",",
    prefix: String ="",     	 파라미터의 디폴트 값ㅇ르 지정한다.
    postfix: String =""
    ): String {
    	val result = StringBuilder(prefix) 
        for((index,element) in this.withIndex()) this는 수신 객체를 가리킨다. 
        if(index>0) result.append(separator)     여기서는 T 타입의 원소로 이뤄진 컬렉션이다.
        result.append(element)
        }

확장 함수는 단지 정적 메서드 호출에 대한 문법적인 편의일 뿐이다. 그래서 클래스가 아닌 더 구체적인 타입을 수신 객체 타입으로 지정할 수도 있다. 그래서 문자열의컬렉션에 대해서만 호출할 수 있는 join 함수를 정의하고 싶다면 다음과 같이 하면 된다.

fun Collection<String>.join(
	separator:String =",",
    prefix:String ="",
    postfix:String=""
    ) = joinToString(separator,prefix,postfix)
    >>> println(listOf("one","two","eight").join(" "))
    one two eight

이 함수를 객체의 리스트에 대해 호출할 수는 없다.

확장 함수는 오버라이드 할 수 없다.

확장 함수는 클래스의 일부가 아니다. 확장 함수는 클래스 밖에 선언된다.

fun View.showOff() = println("i`m a view!")
fun Button.showOff() = println("i`m a button!")
>>> >>> val view : View = Button()
>>> view.showOff() --> 확장 함수는 정적으로 결정된다.
i`m a view!

view 가 가리키는 객체의 실제 타입이 Button 이지만 이 경우 view 타입이 View 이기 때문에 무조건 View의 확장 함수가 호출된다.

코틀린은 호출될 확장 함수를 정적으로 결정한다.

확장 프로퍼티
변경 가능한 확장 프로퍼티 선언하기

var StringBuilder.lastChar:Char
	get() = get(length-1) -- 프로퍼티 게터
    set(value:Char) {
    	this.setCharAt(length-1,value)  -- 프로퍼티 세터
        }
        
>>>println("Kotlin".lastChar)
n
>>> val sb = StringBuilder("Kotlin?")
>>> sb.lastChar = "!"
>>> println(sb)
Kotlin!

컬렉션 처리 : 가변 길이 인자, 중위 함수 호출, 라이브러리 지원

vararg 키워드를 사용하면 호출 시 인자 개수가 달라질 수 있는 함수를 정의할 수 있다.
중위함수 호출 구문을 사용하면 인자가 하나뿐인 메서드를 간편하게 호출할 수 있다.
구조 분해 선언(destructuring declaration)을 사용하면 복합적인 값을 분해해서 여러 변수에 나눠 담을 수 있다.

자바 컬렉션 API 확장

리스트의 마지막 원소를 가져오는 예제와 숫자로 이뤄진 컬렉션의 최댓값을 찾는 예제를 살펴봤다.

>>>val strings: List<String> = listOf("first","second","fourteenth")
>>> strings.last()
fourteenth
>>> val numbers: Collection<Int> = setOf(1,14,2)
>>> numbers.max()
14

last() , max() 는 모두 확장 함수이다

fun <T> List<T>.last(): T{ /* 마지막 원소를 반환함*/}
fun Collection<Int>.max() : Int {/* 컬렉션의 최댓값을 찾음 */}

가변 인자 함수 : 인자의 개수가 달라질 수 있는 함수 정의

코틀린에서는 배열을 명시적으로 풀어서 배열의 각 원소가 인자로 전달되게 해야 한다.
기술적으로는 스프레드(spread)연산자가 그런 작업을 해준다. 하지만 실제로 전달하려는 배열 앞에 * 를 붙이기만 하면 된다.

fun main(args: Array<String>) {
	val list = listOf("args: ",*args) --> 스프레드 연산자가 배열의 내용을 펼쳐준다.
    println(list)
}

값의 쌍 다루기: 중위 호출과 구조 분해 선언

val map = mapOf(1 to "one", 7 to "seven", 53 to "fifty-three")

to라는 단어는 코틀린 키워드가 아니다. 이 코드는 중위호출 이라는 틀벽한 방식으로 to 라는 일반 메서드를 호출한 것이다.

중위 호출 시에는 수신 객체와 유일한 메서드 인자 사이에 메서드 일므으 넣는다.(이때 객체,메서드 이름,유일한 인자 사이에는 공백이 들어가야 한다.) 다음 두 호출은 동일하다

l.to("one") to 메서드를 일반적인 방식으로 호출함
l to "one" to 메서드를 중위 호출 방식으로 호출함

인자가 하나뿐인 일반 메서드나 인자가 하나뿐인 확장 함수에 중위 호출을 사용할 수 있다.
함수를 중위 호출에 사용하게 허용하고 싶으면 infix 변경자를 함수 선언 앞에 추가해야 한다.
다음은 to 함수의 정의를 간략하게 줄인 코드다

infix fun Any.to(other:Any) = Pair(this,other)

이 to 함수는 Pair의 인스턴스를 반환한다. Pair는 코틀린 표준 라이브러리 클래스로 그 이름대로 두 원소로 이뤄진 순서쌍을 표현한다. 실제로는 to는 제네릭 함수지만 여기서는 설명을 위해 그런 세부 사항을 생략한다.

Pair 의 내용으로 두 변수를 즉시 초기화할 수 있다.

val (number, name) 1 to "one"

이런 기능을 구조분해 선언 이라고 부른다.

내가 도대체 뭘 배우는건가 싶다.

이게 코..틀린?

책이 어려운걸까 내가 이해를 못하는걸까

그래도 이렇게 배워두면 나중에 다 써먹는다 신기하게도 ㅋㅋ

profile
dart,c#,java 개발자! 잡다하게 해서 문제될게 없다!

0개의 댓글