본문 바로가기

Dev/Kotlin

[부스트코스] 코틀린 프로그래밍 기본1 (4)

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 키워드를 사용해 선언
      • 스택 공간을 낭비하지 않아도 되므로 일반 재귀함수보다 훨씬 안전한 코드가 됨

 

5. 함수의 실행 블록

  • 함수의 블록 ({})
    • 지역 변수(Local variables): 블록 내에서 사용하는 변수
  • 함수의 범위(Scope)
    • 최상위 함수와 지역 함수
    • 최상위 및 지역 함수의 사용 범위
      • 최상위 함수는 main() 함수 전, 후 어디든 선언하고 코드 내에서 호출 가능
      • 지역 함수는 먼저 선언되어야 그 함수를 호출 가능(아직 선언되지 않은 함수를 사용하려고 할 경우, unresolved reference 오류)
  • 변수의 범위
    • 전역 변수(Global variable)
      • 최상위에 있는 변수(패키지)로 프로그램이 실행되는 동안 삭제되지 않고 메모리에 유지
      • 여러 요소가 동시에 접근하는 경우 잘못된 동작 유발 가능
      • 자주 사용되지 않는 전역 변수는 메모리 자원 낭비
    • 지역 변수(Local variable)
      • 특정 코드 블록 내에서만 사용
      • 블록 시작 시 임시로 사용되며 주로 스택 메모리를 사용