1. 람다식 선언
{x:Int, y:Int → x*y}
- 화살표를 기준으로 왼쪽에는 람다식의 매개변수, 오른쪽에는 함수의 내용과 반환값
- 만약 함수 내용에 표현식이 2줄 이상일 경우, 마지막 표현식이 반환값이 됨
- 람다식의 매개변수에 자료형이 지정되어 있다면 변수의 자료형 생략 가능
- 변환 자료형이 없을 때
()->Unit = { println("Hello World!") }
- 람다 함수의 매개변수가 없을 때
(Int)->Int = { x -> x * x }
2. 람다식과 고차함수 호출
- 값에 의한 호출
- 함수가 인자로 전달될 경우
- 람다식 함수는 값으로 처리되어 그 즉시 함수가 수행된 후 값을 전달
- 람다식 이름을 사용한 호출
- 람다식 자체가 매개변수에 복사, 해당 함수가 호출되어 사용되기 전까지는 실행되지 않음
- 필요할때만 람다식 함수가 작동하도록 만들 수 있음
- 다른 함수의 참조에 의한 호출
- ::를 함수 이름앞에 사용해 소괄호와 인자를 생략하고 사용하는 경우, 일반함수를 참조에 의한 호출로 사용할 수 있게 됨
3. 람다식 함수의 매개변수
- 매개변수 개수에 따라 람다식을 구성하는 방법
- 매개변수가 없는 경우
- 사용시 화살표 기호 사용X
- 소괄호 생략 가능
- 매개변수 1개
- 화살표 기호 생략, it으로 대체 가능
- 매개변수 2개 이상
- it으로 변수 생략 불가
- 필요한 경우 _(언더바)를 사용해 특정 매개변수 생략 가능
- 매개변수가 없는 경우
- 일반 매개변수와 람다식 매개변수 같이 사용
- 일반함수의 마지막 매개변수가 람다식 함수일 경우, 함수가 사용될 때 소괄호 바깥으로 마지막 인자인 람다식을 빼낼 수 있음
- 람다식 매개변수가 마지막 인자 위치에 있어야 함
4. 다양한 함수
- 익명 함수(Anonymous functions)
- 일반 함수가 이름이 없는 것
- 일반 익명 함수에서는 return, break continue가 사용 가능하지만, 람다식에서는 사용이 어려움 (라벨 표기법과 같이 사용해야 함)
- 인라인(Inline) 함수
- 함수가 호출되는 곳에 내용을 모두 복사
- 함수의 분기 없이 처리 → 성능 증가
- 람다식 매개변수를 가지고 있는 함수 형태 권장
- 인라인함수의 단점: 코드가 복사되므로 내용이 많은 함수에 사용하면 코드가 늘어남
- noinline 키워드
- 람다식 함수 매개변수 정의에서 사용시, 해당 함수가 inline 정의되어 있다고 해도 사용할 때 람다식 함수를 inline 시키지 않음
- noinline이 있는 람다식 함수는 인라인으로 처리되지 않고 분기하여 호출됨
- 비지역 반환
- 람다식 함수를 인자로 사용하는 함수는 의도하지 않게 람다식 함수 바깥에 있는 함수가 함께 반환
- crossinline 이라는 키워드를 람다식 함수 앞에 사용하면 비지역 반환이 금지됨
- 확장 함수(Extension function)
- 클래스의 멤버 함수를 외부에서 더 추가할 수 있다
- 기존의 표준 라이브러리를 수정하지 않도고 확장 가능
- 확장하려는 대상에 동일한 이름의 멤버 함수, 메소드가 존재한다면 항상 확장 함수보다 멤버 메소드가 우선 호출
fun 확장대상.함수명
- 중위 함수
- 일종의 연산자를 구현할 수 있는 함수
- 특히 비트 연산자에서 사용
- 중위 표현법(Infix notation)
- 클래스의 멤버 호출 시 사용하는 점(.)을 생략하고 함수 이름 뒤에 소괄호를 생략해 직관적인 이름을 사용할 수 있는 표현법
- 중위 함수의 조건
- 멤버 메소드 또는 확장 함수
- 하나의 매개변수를 가질 것
- infix 키워드를 사용하여 정의
- 꼬리 재귀함수(Tail recursion function)
- 재귀(Recursion)
- 자기 자신을 다시 참조
- 자기 자신을 계속 호출하는 특징
- 재귀 함수의 필수 조건(지키지 않으면 Stack Overflow 발생 가능)
- 무한 호출에 빠지지 않도록 탈출 조건 생성
- 스택 영역을 이용하므로 호출 횟수를 무리하게 많이 지정해 연산하지X
- 코드를 복잡하지 않게 함
- 꼬리 재귀 함수
- 스택에 계속 쌓이는 방식이 함수가 계속 씌워지는 꼬리를 무는 형태
- 코틀린 고유의 tailrec 키워드를 사용해 선언
- 스택 공간을 낭비하지 않아도 되므로 일반 재귀함수보다 훨씬 안전한 코드가 됨
- 재귀(Recursion)
5. 함수의 실행 블록
- 함수의 블록 ({})
- 지역 변수(Local variables): 블록 내에서 사용하는 변수
- 함수의 범위(Scope)
- 최상위 함수와 지역 함수
- 최상위 및 지역 함수의 사용 범위
- 최상위 함수는 main() 함수 전, 후 어디든 선언하고 코드 내에서 호출 가능
- 지역 함수는 먼저 선언되어야 그 함수를 호출 가능(아직 선언되지 않은 함수를 사용하려고 할 경우, unresolved reference 오류)
- 변수의 범위
- 전역 변수(Global variable)
- 최상위에 있는 변수(패키지)로 프로그램이 실행되는 동안 삭제되지 않고 메모리에 유지
- 여러 요소가 동시에 접근하는 경우 잘못된 동작 유발 가능
- 자주 사용되지 않는 전역 변수는 메모리 자원 낭비
- 지역 변수(Local variable)
- 특정 코드 블록 내에서만 사용
- 블록 시작 시 임시로 사용되며 주로 스택 메모리를 사용
- 전역 변수(Global variable)
'Dev > Kotlin' 카테고리의 다른 글
[부스트코스] 코틀린 프로그래밍 기본1 (3) (0) | 2023.01.18 |
---|---|
[부스트코스] 코틀린 프로그래밍 기본1 (2) (1) | 2023.01.15 |
[부스트코스] 코틀린 프로그래밍 기본1 (1) (0) | 2023.01.15 |
[부스트코스] Hello, Kotlin! (0) | 2023.01.14 |