본문 바로가기
Android (Kotlin)/kotlin 문법

[Kotlin] 유용한 기능

by 키윤 2023. 12. 4.

1. 문자열로 저장되어있는 숫자를 정수형으로 바꾸는 방법

var intNum = 10
var doubleNum = "10.43"

var num1 = Integer.paresInt(intNum)
var num2 = doubleNum.toDouble()

println("num1 : $num1")
println("num2 : $num2")

// 출력값: 
// num1 : 10
// num2 : 10.43

2. 객체 자료형간의 변환 

2.1 업 캐스팅 (자식 클래스를 부모클래스의 자료형으로 객체 생성) - 추가 공부 필요

fun main() {
	println("몇 마리를 생성하시겠습니까?")
    var count = readLine()!!.toInt()
    var birds = mutableListOf<Bird>()
    
    for (idx in 0..count-1) {
    	println("조류의 이름을 입력해주세요")
        var name = readLine()!!
        
        // as Bird 는 생략가능
        birds.add(Sparrow(name) as Bird)
    }
    println("==========조류 생성완료==========")
    for (bird in birds) {
    	bird.fly()
    }
}

open class Bird(name: String) {
	var name: String
    
    init {
    	this.name = name
    }
    
    fun fly() {
    	println("${name}이름의 조류가 날아요~")
    }
}

class Sparrow(name: String): Bird(name) {
}

3. 자료형의 타입 확인 

if(name is String) {
	println("name은 String 타입입니다.")
} else {
	println("name은 String 타입이 아닙니다")
}

4. 여러 인스턴스 리턴

  • 메소드는 기본적으로 하나의 데이터를 리턴해요
  • 두 개 이상의 데이터르 포함하는 데이터클래스를 설계학 ㅗ인스턴스를 리턴하면 가능해요
  • 하지만 매번 불필요한 클래스를 만드는 행위는 비효율적이예요
  • 코틀린은 데이터를 두 개, 세 개 리턴할 수 있는 클래스를 제공해요
  • Pair을 활용하면 두 개의 값을 리턴할 수 있어요.
// Pair 활용
fun main() {
	var chicken = Chicken()
    var eggs = chicken.getEggs()
    var listEggs = eggs.toList()
    
    // first, second 로 관리
    // var firstEgg = eggs.first
    // var secondEgg = eggs.second
    
    // 리스트로 관리
    var firstEgg = listEggs[0]
    var secondEgg = listEggs[1]
    
    println("달걀의 종류는 $eggs 입니다.")
    println("리스트 달걀의 종류는 $listEggs 입니다.")
    println("첫번째 달걀의 종류는 $firstEgg 입니다.")
    println("두번째 달걀의 종류는 $secondEgg 입니다.")
}

class Chicken {
	fun getEggs(): Pair<String, String> {
    	var eggs = Pair("달걀", "맥반석")
        return eggs
    }
}
// Triple 활용
fun main() {
    var chicken = Chicken()
    var eggs = chicken.getThreeEggs()
    var listEggs = eggs.toList()
    
//    first, second, third로 관리
//    var firstEgg = eggs.first
//    var secondEgg = eggs.second
//    var eggTime = eggs.third
    
    // 리스트로 관리
    var firstEgg = listEggs[0]
    var secondEgg = listEggs[1]
    var eggTime = listEggs[2]

    println("달걀의 정보는 ${eggs} 입니다.")
    println("리스트 달걀의 정보는 ${listEggs} 입니다.")
    println("첫번째 달걀의 종류는 ${firstEgg} 입니다.")
    println("두번째 달걀의 종류는 ${secondEgg} 입니다.")
    println("달걀은 ${eggTime}에 나왔습니다.")
}

class Chicken {
    fun getTwoEggs(): Pair<String, String> {
        var eggs = Pair("달걀", "맥반석")
        return eggs
    }

    fun getThreeEggs(): Triple<String, String, Int> {
        var eggs = Triple("달걀", "맥반석", 20230101)
        return eggs
    }
}

5. Scope Function

자기 자신의 객체를 전달해서 효율적인 처리를 할 수 있다.
현재 내 객체를 it으로 넘겨서 중괄호 안에 있는 코드를 실행하고 리턴하는 함수이다.

5.1. let function

var strNum = "10"

var result = strNum?.let {
	// 중괄호 안에서는 it으로 활용함
	Integer.parseInt(it)
}

println(result!!+1)

5.2. with function

중괄호 블록안에 this로 자신으 ㅣ객체를 전달하고 코드를 수행한다.

this 는 생략해서 사용할 수 있으므로 반드시 null이 아닐때만 사용하는게 좋다.

var alphabets = "abcd"

with(alphabets) {
//  var result = this.subSequence(0,2)
	var result = subSequence(0,2)
	println(result)
}

5.3. also function

fun main() {
    var student = Student("참새", 10)

    var result = student?.also {
        it.age = 50
    }
    result?.displayInfo()
    student.displayInfo()
}

class Student(name: String, age: Int) {
    var name: String
    var age: Int

    init {
        this.name = name
        this.age = age
    }

    fun displayInfo() {
        println("이름은 ${name} 입니다")
        println("나이는 ${age} 입니다")
    }
}

5.4. apply function

fun main() {
    var student = Student("참새", 10)

    var result = student?.apply {
        student.age = 50
    }
    result?.displayInfo()
    student.displayInfo()
}

class Student(name: String, age: Int) {
    var name: String
    var age: Int
    
    init {
        this.name = name
        this.age = age
    }
    
    fun displayInfo() {
        println("이름은 ${name} 입니다")
        println("나이는 ${age} 입니다")
    }
}

5.5. run function

// 객체에서 호출하지 않는 경우의 예시
var totalPrice = run {
	var computer = 10000
	var mouse = 5000
	
    computer+mouse
}
println("총 가격은 ${totalPrice}입니다")
// 객체에서 호출하는 경우의 예시
fun main() {
    var student = Student("참새", 10)
    student?.run {
        displayInfo()
    }
}

class Student(name: String, age: Int) {
    var name: String
    var age: Int
    
    init {
        this.name = name
        this.age = age
    }
    
    fun displayInfo() {
        println("이름은 ${name} 입니다")
        println("나이는 ${age} 입니다")
    }
}

5.6. 수신객체와 람다함수간의 긴밀한 관계