티스토리 뷰
함수
- 명명된 인자 : 매개변수의 이름과 함께 인자를 대입
//원을 그리는 함수
fun drawCircle(x: Int, y: Int, radius: Int) {...}
//명명된 인자를 사용해 함수 호출
drawCircle(x=10, y=5, radius=25)
drawCircle(10, 5, radius=25)
- 기본 매개변수 : 함수의 매개변수에 기본값 지정 가능
//반지름의 기본값을 25로 갖는 함수
fun drawCircle(x: Int, y: Int, radius: Int = 25) {...}
//반지름을 지정하지 않았으므로 원의 반지름은 25
drawCircle(10, 5)
- 단일 표현식 표기 : Unit 타입을 제외한 타입을 반환하는 함수라면, 메소드 내용을 중괄호로 감싸지 않고 함수 정의 가능
//동일한 값을 반환하는 두 함수
fun theAnswerToLifeTheUniverseAndEverything(): Int{ return 21 * 2 }
fun theAnswerToLifeTheUniverseAndEverything(): Int = 21 * 2
- 확장 함수 : 상속없이 기존 클래스에 새로운 함수 추가 가능
- 리시버 타입(확장 함수를 추가할 대상 클래스) 뒤에 점을 찍고 그 뒤에 원하는 함수의 형태를 적는 방식으로 정의
- 구현부에서는 this를 사용하여 리시버 객체(클래스의 인스턴스)에 접근 가능
//String 클래스에 withPostfix() 함수 추가
private fun String.withPostfix(postFix: String) = "$this$postFix" //this로 인스턴스에 접근
//this를 사용하여 리시버 클래스의 인스턴스에 접근 가능하므로, 앞에서 정의한 확장 함수 사용 가능
fun String.withBar() = this.withPostfix("Bar")
val foo = "Foo"
//String 클래스에 포함된 추가된 withBar()함수 호출, this는 foo를 가리킴
val foobar = foo.withBar()
- 연산자 오버로딩 : operator 키워드를 추가하여 기존의 연산자 재정의 가능
//단항 연산자 재정의
class Volume(var left: Int, var right: Int) {
//단항 연산자 '-' 재정의
operator fun unarayMinus(): Volume {...}
//단항 연산자 '++' 재정의
operator fun inc(): Volume {...}
}
//확장 함수를 이용해 이항 연산자 재정의
class Volume(val left: Int, val right: Int)
//이항 연산자 '+' 재정의
operator fun Volume.plus(other: Int) = Volume(this.left + other.left, this.right + other.right)
//v1에는 Volume(30,50)과 같은 값이 할당
val v1 = Volume(10,20) + Volume(20,30)
- 중위 표기법 (infix notation) : infix키워드가 붙어있고, 확장 함수 혹은 멤버 함수이면서 매개변수가 하나인 사용자 정의 함수 호출
class Volume(var left: Int, var right: Int) {
//멤버 함수이며 infix 키워드가 표기되어 있어 중위 표기법 지원 가능
infix fun increaseBy(amount: Int) {
this.left += amount
this.right += amount
}
}
//확장 함수이며 infix 키워드가 표기되어 있어 중위 표기법 지원 가능
infix fun Volume.decreaseBy(amount: Int) {
this.left -= amount
this.right -= amount
}
val currentVolume = Volume(50, 50)
currentVolume increaseBy 30 //currentVolume.increaseBy(30)과 동일
currentVolume decreaseBy 20 //currentVolume.decreaseBy(20)과 동일
람다 표현식
- { } 안에 매개변수와 함수 내용을 선언하는 함수 : { 매개변수 -> 함수 내용} -> { x : Int, y : Int -> x + y }
- fun 예약어를 사용하지 않으며 함수명도 명시하지 않음
- 매개변수 타입을 선언해야 하며 추론이 가능할때는 생략 가능
- 함수의 반환값은 함수 내용의 마지막 표현식
//일반 함수로 정의
fun sum(x: Int, y:Int): Int {
return x+y
}
//람다 표현식으로 정의
val sum = {x: Int, y:Int -> x+y} //함수를 일반 변수처럼 이용
fun main(args: Array<String>){
val result = sum(10,20)
}
- 멤버 참조 (::) : 하나의 메소드만 호출할 때 간략하게 표현하기 위해 사용
- it : 람다의 매개변수가 하나뿐이고 그 타입을 컴파일러가 추론할 수 있는 경우 사용 가능
//람다와 멤버참조를 이용해 컬렉션에서 값을 검색하는 예시
data class Person(
val name: String,
val age: Int
)
val people = listOf(Person("kim",24), Person("Lee",25), Person("Park",29))
//세 개의 결과값은 같음
people.maxBy{p:Person -> p.age}
people.maxBy{it.age} //'it'은 컬렌션의 원소
people.maxBy(Person::age) //멤버참조를 사용
🆘 람다 함수 간단하게 하기
- 1. 함수 호출 시 맨 뒤에 있는 인자가 람다식이면 해당 람다식을 소괄호() 밖으로 뺄 수 있음
- 2. 람다가 어떤 함수의 유일한 인자이며, 괄호 귀에 람다를 썼다면 함수 호출 시 빈 괄호를 없앨 수 있음
- 3. 컴파일러는 람다 파라미터의 타입 추론이 가능하므로 타입을 생략할 수 있음
- 4. 람다의 파라미터가 하나뿐이고, 그 타입을 컴파일러가 추론할 수 있는 경우 it을 사용할 수 있음
people.maxBy{(p: Person -> p.age)} //복잡한 람다식
//1번 적용
people.maxBy(){p: Person -> p.age}
//2번 적용
people.maxBy{p: Person -> p.age}
//3번 적용
people.maxBy{p -> p.age}
//4번 적용
people.maxBy{it.age}
'Android' 카테고리의 다른 글
[kotlin] 코틀린을 코틀린답게 (라이브러리 - 조건 확인 함수,컬렉션 생성 함수) (0) | 2020.03.08 |
---|---|
[kotlin] 안드버디 스터디 정리 - 1 (0) | 2020.03.05 |
[kotlin] 코틀린을 코틀린답게 (함수,상속과 구현,this,companion object,제네릭,예외,null 연산자) (0) | 2020.03.04 |
[kotlin] 코틀린을 코틀린답게 (클래스,프로퍼티,접근제한자,생성자) (0) | 2020.03.03 |
[kotlin] 코틀린을 코틀린답게 (변수,배열,컬렉션) (0) | 2020.02.28 |