이 게시물은 다음 링크를 참조하여 학습했습니다.
1. Lambda
1-1. Lambda?
Lambda는 value처럼 다룰 수 있는 익명함수이다.
Lambda의 특징으로는
1) 메소드의 파라미터로 넘겨줄 수 있다.
2) return 값으로 사용할 수 있다.
가 있다.
Lambda의 기본 형식은 아래와 같다.
val lambdaName: Type = { argumentList -> codeBody }
Lambda의 사용 예시
val square : (Int) -> (Int) ={number -> number*number} //인자가 한 개일 때
val nameAge = {name : String, age: Int -> "my name is${name} I'm${age}"} //인자가 여러 개일때
1-2. 익명함수
익명함수는 아래처럼 이름없이 정의되는 함수이다.
// 익명함수를 생성하여 greeting에 할당
val greeting = fun(){ println("Hello") }
// 익명함수 호출
greeting("chacha")
람다를 이용하면 더 간단히 익명함수를 정의할 수 있다.
// 익명함수를 생성하여 greeting에 할당
val greeting: () -> Unit = { println("Hello") }
// 익명함수 호출
greeting()
1-3. Lambda Signature?
Java 8이후 버전에선 Lambda Signature라는 기능을 제공한다.
특정한 형태를 가진 인터페이스들을 미리 만들어서 제공한다.
1-4. Lambda Expression
람다식의 문법에는 몇가지 규칙이 있다.
- 중괄호로 감싼다. { .. }
- 인자와 본문은 ->로 구분한다.
- 인자는 ()로 감싸지 않는다.
- 인자는 형식추론이 가능하므로 타입을 생략할 수 있다.
- 변수에 람다식을 담는경우에는 인자의 타입을 생략할 수 없다.
또한 코드 간결성을 위해 아래와 같은 규칙들도 존재한다.
- 함수의 맨 마지막 인자가 람다라면 () 안에서 빼내서 밖에 람다를 표현할 수 있다.
- 인자가 하나라면 그 인자는 람다식 내부에서 it으로 받을 수 있다.
- 인자가 하나이면서 그 인자가 람다타입 이라면 ()를 생략할 수 있다.
people.maxBy({p: Person -> p.age})
people.maxBy() {p: Person -> p.age}
people.maxBy{p: Person -> p.age}
people.maxBy{it.age}
위 네가지 코드는 모두 같은 표현이다.
1-5. member reference
class의 method를 람다의 반환 값으로 사용할 때 코드 량을 줄일 수 있다.
1-5-1. 클래스의 멤버 표현
표현식 -> 클래스이름::멤버변수
1-5-2. 최상위 함수의 표현
표현식 -> :: 최상위함수
1-5-3. 변수에 람다 대신 member reference 저장
표현식 -> ::함수
1-5-4. 생성자
표현식 -> :: 클래스
1-5-5. 확장함수
표현식 -> 클래스::함수
1-6. 확장함수
// 나중에 추가 예정...
2. data class
data class는 Java에서 DB나 Retrofit을 사용할때 함께 사용하던 pojo class를 대신해서 편하게 사용할 수 있다.
data class는 getter, setter를 사용할 필요없이 값들을 저장할 수 있고, 내부적으로 toString(), hashCode(), equals(), copy()가 구현되어 있다.
대충 요런식으로 사용!
data class Ticket( val name: String,
val company : String,
var date : Long,
var seatNumber : Int)
3. companion object
// 나중에 추가 예정...
4. object
object는 객체를 Singleton pattern으로 사용할 수 있도록 만들어준다.
object를 생성하면 앱이 실행 될 때 한번만 객체가 생성된다고 한다.
4-1. 익명객체
object는 익명객체를 생성할 때도 사용된다.
object와 메서드가 아래처럼 정의 되어있을 때,
interface Vehicle {
fun drive(): String
}
fun start(vehicle: Vehicle) = println(vehicle.drive())
아래처럼 사용할 수 있다.
start(object : Vehicle {
override fun drive() = "Driving really fast"
})
한번만 사용하고 사용할 일이 없는 객체이기 때문에 이름을 지정해주지 않고, 꼭 구현해야될 부분만 interface에 담아서 override 해준 점을 볼 수 있다.
'Legacy' 카테고리의 다른 글
[Kotlin #4] Scope Functions (0) | 2022.05.16 |
---|---|
[Kotlin #3] Collections (0) | 2022.05.16 |
[Kotlin #1] 기본문법 (0) | 2022.05.11 |
[Java#7] Queue, Deque, PriorityQueue (0) | 2022.05.04 |
[Java#6] Stack (0) | 2022.05.04 |