티스토리 뷰

함수

  • 명명된 인자 : 매개변수의 이름과 함께 인자를 대입
//원을 그리는 함수
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}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함