초보 개발자의 성장기

[부스트코스] [부스트코스][코틀린 프로그래밍 기본 1/2] 한아아지와 함께하는 kotlin - 함수형 프로그래밍 (4) 중위함수와 꼬리 재귀 함수 그리고 Scope 본문

IT 강의 리뷰/코틀린

[부스트코스] [부스트코스][코틀린 프로그래밍 기본 1/2] 한아아지와 함께하는 kotlin - 함수형 프로그래밍 (4) 중위함수와 꼬리 재귀 함수 그리고 Scope

개발자 김케빈 2021. 1. 24. 20:21

이번 시간에는 중위함수와 꼬리 재귀 함숙 그리고

함수의 변수의 범위인 Scope에 대해 배워보겠습니다!


강의 링크

www.boostcourse.org/mo132/lecture/59988

 

코틀린 프로그래밍 기본 1

부스트코스 무료 강의

www.boostcourse.org

www.boostcourse.org/mo132/lecture/59979

 

코틀린 프로그래밍 기본 1

부스트코스 무료 강의

www.boostcourse.org


1. 중위 함수

1.1. 중위 표현법이란?

중위 표현법(infix notation)이란 클래스의 멤버 호출 시

사용하는 점(.)을 생략하고 함수 이름 뒤에 소괄호를 붙이지 않아 직관적인 이름을 사용할 수 있는 표현법입니다.
즉, 중위 함수란 일종의 연산자를 구현할 수 있는 함수를 말합니다.  중위 함수는 특히 비트 연산자에서 사용하고 있습니다.

 

1.2. 중위 함수의 조건

✏️ 멤버 메서드 또는 확장 함수여야 합니다.

✏️ 하나의 매개변수를 가져야 합니다.

✏️ infix 키워드를 사용하여 정의해야 합니다.

 

1.3. 중위 함수 코드 예시


fun main() {

	val num = 3
    
	// 일반 표현법
    // val str =  num.strPlus("kotlin")

    // 중위 표현법
    val str = num strPlus "kotlin" // 점(.) 생략
    println(str)
}

// String를 확장해서 strPlus() 함수가 하나 더 추가되었음
infix fun Int.strPlus(x: String): String {  // infix로 선언되므로 중위 함수
    return "$x version $this"
}

/*
결과 
kotlin version 3
*/


2.  꼬리 재귀 함수

2.1. 재귀 함수란?

  • 재귀란 자기 자신을 다시 참조하는 방법을 의미합니다.
  • 자기 자신을 지속적으로 참조하면 무한하게 대상을 생성할 수도 있습니다.
  • 재귀 함수는 자기 자신을 계속 호출하는 특징이 있습니다 그래서 재귀 함수는 반드시 아래의 조건에 맞게
    설계해야 합니다. 그렇지 않으면 스택 오버플로(Stack Overflow) 현상이 발생할 수 있습니다. 

 

2.2. 재귀 함수의 필수 조건

✏️ 무한 호출에 빠지지 않도록 탈출 조건을 만들어 둔다.

✏️ 스택 영역을 이용하므로 호출 횟수를 무리하게 많이 지정해 연산하지 않는다.

✏️ 코드를 복잡하지 않게 한다.

 


2.3. 꼬리 재귀 함수

꼬리 재귀 함수는 스택에 계속 쌓이는 방식이 함수가 계속 씌워져 꼬리를 무는 형태입니다.

kotlin 고유의 tailrec 키워드를 이용해 선언합니다.



2.4. 재귀 함수 코드 예시


/* 재귀 함수 */

fun main() {
    val number = 4
    val result: Long
    
    result = factorial(number)
    println("Factorial: $number -> $result")
}

fun factorial(n: Int):Long {
	return if (n == 1) n.toLong() else n * factorial(n-1)
}

/*
결과
factorial(4)
4*factorial(3)
4*(3*factorial(2))
4*(3*(2*factorial(1)))
4*(3*(2*1))
24
*/


/* 꼬리 재귀 함수 */

fun main() {
    val number = 5
    println("Factorial: $number -> ${factorial(number)}")
}


tailrec fun factorial(n: Int, run: Int = 1): Long {
    return if (n == 1) run.toLong() else factorial(n-1, run*n)
}

/*
결과
factorial(4)
4*factorial(3)
4*(3*factorial(2))
4*(3*(2*factorial(1)))
4*(3*(2*1))
24
*/


3. Scope

※ 먼저 알아야하는 점!

  • 함수는 실행 블록({ })을 가지고 있습니다. 함수의 시작을 알리는 중괄호 시작 기호 ({)에서 함수가 실행되며
    중괄호가 끝나는 지점(})에서 함수가 종료되면서 가지고 있는 지역 변수를 삭제합니다.
  • 지역 변수란 블록 내에서만 사용하는 변수입니다.
    이와 마찬가지로 블록 내에 또 다른 함수를 정의해 넣었을 때는 지역 함수가 됩니다.
  • 이 지역 함수를 사용하려고 할 때는 항상 선언이 먼저 되어 있어야 합니다.
    이 지역 함수도 마찬가지로 블록이 끝나면 같이 삭제됩니다.

3.1. 함수의 범위 (scope)
코틀린에서는 파일을 만들고 곧바로 main() 함수나 사용자가 직접 함수를 만들 수 있습니다.

이것을 최상위 레벨 함수(top-level function)라고 합니다.

함수에 또 다른 함수가 선언되어 있는 경우 (블록  내에서 사용)엔 지역 함수(local function)라고 합니다.


fun main() { // 최상위 레벨의 함수
    ...
    fun secondFunc(a: Int) { // 지역 함수 선언
        ... 
    }
    userFunc(4) // 사용자 함수 사용 - 선언부의 위치에 상관 없이 사용
    secondFunc(2) // 지역 함수 사용 - 선언부가 먼저 나와야 사용 가능
}

fun userFunc(counts: Int) { // 사용자가 만든 최상위 레벨의 함수 선언
    ...
}


3.2. 함수의 실행 블록

최상위 함수는 main() 함수 전, 후 어디든 선언하고 코드 내에서 호출 가능합니다.

지역 함수는 먼저 선언되어야 그 함수를 호출할 수 있습니다.


/* 코드 예시 */
fun a() = b() // 최상위 함수이므로 b()함수 선언 위치에 상관 없이 사용 가능
fun b() = println("b") // b() 함수의 선언

fun c() {
	fun d() = e() // error - d() 지역함수 이므로 e()의 이름을 모름
    fun e() = println("e")
}

fun main() {
	a() // 최상위 함수는 어디든 호출 가능
    e() // error - c() 함수에 정의된 e()는 c의 블록({})을 벗어난 곳에서 사용 불가
    
    
/* 코드 예시 2 */
val global = 10
    
fun main() {
    global = 15
    val local1 = 15
    println("global : $global")
    userFunc()
    println("final - global : $global, local1 : $local1")
}

fun userFunc() {
	global = 20
    val local1 = 20
    println("userFunc - global : $global, local1 : local1")
}

/*
결과
global : 15
userFunc - global : 20, local1 : 20
final - global : 20, local1 : 15
*/


3.3. 변수의 범위

☑️ 전역 변수

 - 최상위에 있는 변수로 프로그램이 실행되는 동안 삭제되지 않고 메모리에 유지됩니다.

 - 여러 요소가 동시에 접근하는 경우에 잘못된 동작을 유발할 수 있습니다.

 - 자주 사용되지 않는 전역 변수는 메모리 자원 낭비가 될 수 있습니다.

 

☑️ 지역 변수

 - 특정 코드 블록 내에서만 사용가능 합니다.

 - 블록 시작 시 임시로 사용되며 주로 스택 메모리에 저장됩니다.

Comments