코틀린 인 액션 3,4강 정리

박경현·2024년 1월 19일
0

3,4강에 있는 리스트와 클래스에 대한 설명을 정리해보려고 한다!

일단 그러기 위해서는 컬렉션들과 배열은 어떻게 만드는지 그리고 클래스는 어떻게 만드는지 알아야한다

3강

배열과 컬렉션 만들기

추가적으로 배열에는 내장 함수인 indices와 withIndex가 있다 차이는 for문 돌리는데
인덱스만 주는지 인덱스랑 값 같이 주는지 차이다!

val strings = arrayOf("this", "is")
val num = arrayOfNulls<String>(5)
val squares = Array(5) {i -> (i*i).toString()} // 0 1 4 9 16

val list = arrayOf("Hello", "world", "!")
for (i in list.incidies) {
	print(list[i])
}
for ((index, value) in list.withIndex()) {
	println("index $index, value $value")
}

val set = hashSetOf(1,7,5)
val list = arrayListOf(1,7,53)
val map = hashMapOf(1 to "one", 7 to "seven")

차고로 코틀린은 자체 Collection을 제공하지 않는다!
표준 자바 컬렉션을 활용하면 자바코드와 상호작용하기 쉽기 때문이다
그렇기에 자바 -> 코틀린 / 코틀린 -> 자바 로 컬렉션을 서로 변환하지 않아도 된다

코틀린의 확장함수와 사용법!

기존의 java API에 추가로 자체 기능을 만들고 싶다면 확장함수를 사용하면 됩니다!
간단히 방금 본 to나 last, max등 확장함수가 정의되어있다

확장함수는 함수 이름앞에 클래스의 이름만 덧붙이면 됩니다
차고로 멤버함수가 우선순위가 더 높음

fun <T> Collection<T>.joinToString(
	separator: String = ", ",
    prefix: String ="",
    postfix: String = ""
): String {
	val result = StringBuilder(prefix)
    for ((index, value) in this.withIndex()) {
    	if (index > 0) result.append(separator)
        result.append(element)
    }
   	result.append(postfix)
    return result.toString()
}

fun String.lastChar(): Char = this.get(this.length - 1)

fun MutableList<Int>.swap(index: Int, idnex2: Int) {
	val tmp = this[index]
    this[index] = this[index2]
    this[index2] = tmp
}

fun main(args: Array<String>) {
	val list =arrayListOf(1,2,3)
	println(list.joinToString(" "))
}

가변인자 함수 - 인자의 개수를 정확하기 지정하지 않아도 된다

public fun <T> listOf(vararg elements: T): List<T> = 
	if (elements.size > 0) elements.asList() else emptyList()
    
fun main(args: Array<String>) {
	val list = listOf("one", "two", "eight")
}

4강 클래스 객체 인터페이스

코틀린의 클래스와 인터페이스는 자바와 약간 다르다
인터페이스에 프로퍼티 선언이 들어갈 수 있다는 점, 코틀린은 기본이 final이며 public이다
게다가 중첩클래스는 내부 클래스가 아니어서 외부클래스에 대한 참조를 안한다!

interface Clickable {
	fun click()
    fun showOff() = println("I'm clickable!")
}
class Button: Clickable {
	override fun click() = println("I was clicked")
}

차고로 코틀린은 중복된 상위 메소드는 하위클래스에서 반드시 구현해야한다!!

interface Clickable {
	fun click()
    fun showOff() = println("I'm clickable!")
}
interface Focusable {
	fun setFocus(b: Boolean) = println("I ${if (b) "got" else "lost"} focus.")
	fun showOff() = println("I'm focusable!")
}

class Button: Clickable, Focusable {
	override showOff() = prinltn("new Button")
}

클래스

java에서는 상속을 위한 즉 하위클래스에서 사용하는 메소드가 아니면 전부 final로 지정하는 걸 적극 권장!
코틀린도 그래서 기본이 final로 설정되어있다!! 상속을 허용하고 싶다면 open을 적어주자!

open class RichButton : Clickable {
	fun disable() {}
    open fun animate() {}
    override fun click() {} // override한 메소드는 기본이 open이다!
    
    final override fun click2() {} // 이러면 하위클래스가 구현 못함
}

추상클래스

abstact class Animated {
	abstact fun animate() // 추상 메소드는 무조건 오버라이드 해야함
	open fun stopAnimating() {...} // 구현 메소드는 기본이 final이지만 open으로 오버라이드 가능
}
profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글