반응형

이 게시물은 다음 링크를 참조하여 학습했습니다.

 

Kotlin - object와 class 키워드의 차이점

코틀린에서 클래스를 정의하는 키워드는 class입니다. 만약 object로 클래스를 정의하면, 싱클턴(Singleton) 패턴이 적용되어 객체가 한번만 생성되도록 합니다. 싱글턴으로 사용하는 방법 외에도, obj

codechacha.com

 

Kotlin - 람다 표현식(Lambda expression)에 대해서 알아보기

쉽게 말하면 람다는 익명함수입니다. 익명함수는 함수의 이름이 없는 함수를 말합니다. 보통 한번 사용되고 재사용되지 않는 함수를 만들때 익명함수로 만듭니다. 람다함수를 사용하면 코드 가

codechacha.com

 

[Kotlin] 코틀린 람다 #1 - 기본 문법

이 글은 Kotlin In Action을 참고 하였습니다. 더욱 자세한 설명이나 예제는 직접 책을 구매하여 확인 하시기 바랍니다 코틀린의 람다는 자바8의 람다와 개념은 매우 비슷합니다. 다만 표현하는 방

tourspace.tistory.com

 

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라는 기능을 제공한다.

특정한 형태를 가진 인터페이스들을 미리 만들어서 제공한다.

 

java.util.function (Java Platform SE 8 )

Interface Summary  Interface Description BiConsumer Represents an operation that accepts two input arguments and returns no result. BiFunction Represents a function that accepts two arguments and produces a result. BinaryOperator Represents an operation u

docs.oracle.com

 

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

+ Recent posts