Kotlin

[Kotlin] 예외처리 / 람다 / 클래스

sian han 2022. 11. 14. 16:50

※ 예외 처리

 

▶ try-catch

코틀린에서는 try-catch를 표현식처럼 사용할 수 있다.

try-catch 로 리턴값을 전달할 수 있으며,

그 값을 별도의 변수나 상수에 할당할 수 있다.

 val tcNumber = try{
        "10A".toInt()
    }catch (e:NumberFormatException){
        println("예외발생")
        0
    }
    println("tcNumber의 값은 $tcNumber 입니다")

 

 


 

 

※ 람다

▶ 고차함수

함수를 일반 자료형이나 객체처럼 인자로 받거나, 리턴할 수 있는 함수이다.

흔히 매개변수에 오는 함수를 콜백함수라고 한다. 콜백함수는 고차함수로 인해 되불려지기 때문에 이렇게 불린다. 

 

(인자타입1, 인자타입2) -> 반환형

예제1) ()->Unit //인자도 없고 리턴값도 없는 함수
예제2) (Int,Int)->Int  //정수 2개를 받아서 정수를 리턴하는 타입의 함수

고차함수는 인자를 받을 때 함수인자를 정의하는 부분만 람다표현식을 사용한다.

코틀린에서 람다는 매개변수가 없거나, 1개뿐일때 표현식에서 중괄호와 화살표 "()->" 를 생략할 수 있다

 

 

▽ 다음은 인자가 없는 함수를 사용하는 예제이다

fun invokeFunction1(f: ()-> Unit){
    f()
}

fun invokeFunction2(num:Int, f:()->String){
    println("인자로 받은 숫자 : $num")
    var returnValue = f()
    println("$returnValue")
}
//main
    invokeFunction1 { println("콜백함수 실행") }

    invokeFunction2(10, {
        println("콜백함수 여러줄 실행")
        "리턴 문자열"
    })

    for(i in 1..5 ){
        Thread{
            println("${i}번 스레드")
        }.start()
    }

main 함수에서 invokeFunction1 을 보면 매개변수가 함수 1개 밖에 없다. 다른 매개변수를 받지 않기 때문에 함수를 호출할 때 소괄호마저 생략하고 바로 중괄호로 코드블럭을 전달할  수 있다.

또 incokeFunction2를 보면 매개변수가 2개이기 때문에 소괄호는 생략하지 않았다. 또한 특이점은 인자로 받는 함수에서 매개변수는 받지 않지만 String 리턴하는 타입의 함수를 받는다. 그래서 코드블럭을 전달할 때 코드블럭의 맨 마지막 라인에 있는 "리턴문자열" 이 리턴되어 invokeFunction2 의 returnValue 변수에 값이 들어가게 된다.

 

마지막으로 스레드 5개를 호출했는데 스레드 또한 매개변수가 없는 함수(run) 을 전달받기 때문에 소괄호를 생략하고 중괄호 만으로도 생성자를 호출할 수 있었다.

 

이거뭔소린지모르겠음

 


※ 클래스

 

코틀린에서 클래스의 개념은 자바와 동일하다

자바 : 모든 클래스가 Object 클래스를 상속받음

코틀린 : 모든 클래스가 Any 클래스를 상속받음

 

객체생성도 자바와 비슷한데, 간결한 문법을 위해서 new 키워드가 빠졌다

 

 

▷ 코틀린 String 객체생성

val exam = String()

 

BUT 클래스를 선언하는 문법은 확연하게 다르다.

코틀린에는 "주 생성자" 와 "보조 생성자" 두개로 나눠진다.

 

 

 

 

▶ 주 생성자

fun main(args:Array<String>) {
    val calc = Calc()
    println(calc.sum(1,5))
}

class Calc{
    fun sum(a:Int, b:Int):Int{
        return a+b
    }
}

간단하게 Calc 의 객체를 생성했고

그 메소드인 Sum 을 호출했다. 

 

자바에서 기본 생성자를 생략해도 되듯이 코틀린에서도 생략가능하며,

기본생성자는 주 생성자에 속한다.

 

 

▷ 주 생성자를 사용하여 클래스 선언

class BackPack(brand:String, color:String){
    init{
        println("브랜드는 ${brand} 이고 색상은 ${color} 입니다.")
    }
}
//main
val mybackpack = BackPack("Kolping","gray")

init 이라는 키워드로 코드블럭을 정의한다.

코틀린에서 주 생성자는 코드블록이 없기 때문에 init 키워드로 주 생성자에 대한 행위를 정의할 수 있다.

init 키워드로 정의된 코드블럭은 자바에서 생성자와 같이 객체가 생성될 때 한번 실행된다.

 

자바에서는 인자가 없는 생성자를 만들지 않고, 다른 생성자를 만든다면 인자가 없는 생성자로 객체를 생성할 수 없다.

이와 마찬가지로 BackPack 클래스는 인자를 넘기지 않으면 객체를 생성할 수 없다.

그래서 여러 생성자를 사용하려면 보조생성자를 사용해야한다.

 

 

▶ 보조 생성자

주 생성자만 사용하면 생성자를 1개 밖에 사용하지 못하므로 보조생성자를 사용해야 한다.

주 생성자를 생략한 상태에서 보조생성자를 만들게 되면 주 생성자는 "생략" 이 아니라 아예 "없는" 것이 된다.

//main
val book = Book() //에러
bal book2 = Book("Kotlin","Daniel")

//Book 클래스 
constructor(title: String, authour: String){
        this.title=title
        this.author=author
    }

 

 

class Book(){
    var title:String =""
    var author:String = ""

    constructor(title:String) : this(){
        this.title = title
    }
    
    constructor(title: String, authour:String) : this(title){
        this.author = author
    }
}

각 보조 생성자를 보면

메소드처럼 콜론(:) 뒤에 자신의 생성자를 재호출하는 것을 볼 수 있다.

코틀린에서 여러 생성자 처리는 이렇게 다른 생성자에게 나머지 역할을 위임하는 식으로 한다.

 

 

 

▶ getter & setter

코틀린은 기본적으로 getter 와 setter 를 자동으로 지원한다

 

▷ getter & setter 를 수동으로 추가해줘야할 때

  - 멤버변수 선언 바로 뒤어 getter 와 setter 선언

class Book() {
    var title: String?
        get() {
            return title
        }
        set(value) {
            title = value
        }
    var author: String? //간소화
        get() = author
        set(value) {
            author = value
        }
}

 

 

▶ Singleton

싱글톤패턴 : 클래스가 객체를 1개만 생성할 수 있도록 만드는 디자인 패턴 중 하나이다. 

코틀린에서는 싱글톤패턴을 쉽게 만들 수 있도록 object 키워드를 제공하며, 이를 사용하면 클래스가 싱글톤으로 자동으로 만들어짐

object SingletonClass{
    val str = "Hello world"

    fun sum(a:Int, b:Int): Int{
        return a+b
    }
}
//main
    println(SingletonClass.str)

    val number = SingletonClass.sum(5,10)
    println(number)