※ 예외 처리
▶ 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)
'Kotlin' 카테고리의 다른 글
[Kotlin] 목록에서 랜덤으로 1개만 가져오기 (response : objectDTO) (0) | 2022.11.22 |
---|---|
[Kotlin] 유용한 함수 with / run (0) | 2022.11.15 |
[Kotlin] 데이터클래스 / 컬렉션 (0) | 2022.11.14 |
[Kotlin] 조건문 / 반복문 (0) | 2022.11.14 |
[Kotlin] 함수 / 변수 / 자료형 / 배열 (0) | 2022.10.24 |