{매개변수1, 매개변수2... -> 코드 }//중괄호로 감싼다.
//매개변수와 본문은 -> 로 구분한다. (화살표 표기법 사용)
//매개변수는 ( )괄호로 감싸지 않는다.
//매개변수로 타입추론이 가능하기 때문에, 반환형 타입 생략이 가능하다.
//변수에 람다식을 담을 경우, 매개변수 타입은 생략이 불가능하다.
people.maxBy ({p: Person -> p.age}) //기본 람다 함수
//함수의 맨 마지막 인자가 람다라면, ()괄호 안에서 빼서, 밖에 람다를 표현할 수 있다.
people.maxBy () {p: Person -> p.age}
//인자가 하나이면서, 그 인자가 람다 타입이라면 ()괄호를 생략할 수 있다.
people.maxBy {p: Person -> p.age}
//인자가 하나일 때, 람다식 내부에서 인자를 it으로 받을 수 있다.
people.maxBy {it.age}
=>하나의 메소드를 간결하게 표현하는 방법. 혹은, 메소드를 선언하지 않아도 로직을 저장할 수 있다.
//숫자 3개의 평균을 리턴해주는 함수
fun add(num1:Int, num2:Int, num3:Int) = (num1+num2+num3)/3
//매개변수 Int끼리의 계산은 어차피 결과값이 Int라는 것을 추론하기 때문에 반환형 생략이 가능하다.
//메소드 없이 변수에 로직을 저장한 방법.
var add = {num1: Int, num2: Int, num3: Int -> (num1+num2+num3) / 3}
println("평균값은 ${add(10,20,30)}입니다")
if(name is String) {//boolean반환
println("name은 String 타입입니다")
} else {
println("name은 String 타입이 아닙니다")
}
var A: Drinks = Cola()
//Cola 클래스가 상위클래스인 Drinks클래스가 되는 것.
var B: Cola = Drinks() // 이렇게 바로 연결하면 error: type mismatch 발생한다.
//별도의 연산자가 필요하다.
다운캐스팅은 별도의 연산자가 필요하다.
is : 변수가 자료형에 호환되는지를 먼저 체크한 후 변환해주는 캐스팅 연산자. if문 안에서만 사용 된다. 자동캐스팅을 해주기도 한다.
var A = Drinks()
var B = Cola()
if (A is Cola) { //이 if문 안에서 Cola로서 동작.} //빠져나가면 다시 Drinks 클래스로 동작한다.
fun castMethod(a: Any) {
if (a is String) {
println(a.length) // a가 String 타입으로 자동 캐스팅
}
}
as : 변수를 호환되는 자료형으로 변환해주는 캐스팅 연산자. 해당 타입으로 변환이 안되면 오류가 뜨지만, as? 를 하용하면 에러 대신 null을 반환한다.
//업캐스팅
var A: Drinks = Cola()
//이후로는 a는 cola로 작동, 반환도 가능
A as Cola
var B = a as Cola
open class Drinks{
var name :String = "음료수"
open fun Drink(){
println("${name}을 마십니다.")
}
}
class Cola : Drinks(){
var type :String = "콜라"
override fun Drink(){
println("${name}인 ${type}을 마십니다.")
}
fun Taste(){
println("${type}향이 납니다.")
}
}
람다식 설명 참고 출처 :
[Kotlin] 코틀린 람다 #1 - 기본 문법
업캐스팅/다운캐스팅 참고 출처 :
코틀린 casting, is, as
[Kotlin] 클래스의 다형성(+as, is) 설명 & 예제