CODING/강의노트-부스트코스-코틀린

[부스트코스]📱코틀린 3-1 함수를 선언하고 호출해 보기 (2)

codingTrip 2021. 2. 6. 21:46

안녕하세요? codingTrip입니다.

오늘은 "코틀린 프로그래밍  1/2(함수편)"

2단원 함수형 프로그래밍이란?

3장. 마법의 요술상자, 함수의 기본

3-1 함수를 선언하고 호출해보기 (2)

시작하겠습니다!

 

 

💻 실습하기

package chap03.section01

fun sum(a:Int,b:Int): Int {
    return a+b
}

fun main(){//최상위(Top-level)함수
    val result1 = sum(2,3)
    println(result1)
}

우리 지난 시간에 했던 코드

여기에다가 최대, 최소를 구하는 함수를 만들어 볼까요?

package chap03.section01

fun sum(a:Int,b:Int): Int {
    return a+b
}

fun max(a: Int, b: Int): Int{
    return if(a>b) a else b
}

fun outfunc(name: String): Unit{
    println("Name: $name")
}

fun main(){//최상위(Top-level)함수
    val result1 = sum(2,3)
    val a =3
    val b = 5
    
    val result2 = max(a,b)
    outfunc("Kildong")
    println(result1)
    println(result2)
}

복잡해 보이나요? 걱정하지 마세요. 하나씩 살펴볼테니까요.

먼저 매개변수와 인자의 개념을 알아볼까요?

정의할 때 사용한 변수들을 함수의 매개변수(parameters)라고 합니다.

함수를 사용할 때인자 혹은 인수(arguments)라고 하죠.

그래서 실제로는 매개변수와 인자가 서로 섞여서 사용되기도 합니다.

하지만 정확하게는 선언되어 있는 형태의 변수들은 매개변수,

사용할 때는 인자 이렇게 이해하시면 된답니다.

 

main() 여기서 사용되는 a, b

max함수 안에서 사용되는 a, b는 완전히 다른 변수입니다.

값이 매개변수에 복사되어 사용된다고 이해하시면 좋습니다.

 

Shift+F10해서 결과를 나오게 해볼까요?

result2 변수max함수를 동작시켜 볼까요?

결괏값은 5가 나오네요.

 

함수가 반환타입이 없는 경우 즉,  return문이 없는 경우를 알아보겠습니다.

Unit리턴이 없는 형태입니다.

return을 사용하지 않고 단순히 출력을 했죠?

이런 형태는 Unit인데

outfunc는 할당문을 사용해서 결과문이 나오지 않습니다.

단순히 괄호 안에 이름을 넣어주면 됩니다.

 

근데 실제로 Unitreturn Unit이라는 형태로

Unit이 반환되고 있는 것입니다.

하지만 이것은 생략이 가능합니다.

Unit은 아무런 형을 지정하지 않았다는 특수한 반환값입니다.

마찬가지로 함수를 선언할때도 특정 반환타입이 없는 경우 Unit을 생략해도 가능합니다.

 

반환타입이 있는 경우에는 간략하게 사용할 수 있습니다.

fun sum(a: Int, b: Int) = a+b

마찬가지로

fun max(a: Int, b: Int)= if(a>b) a else b

줄여서 함수를 만들 수도 있습니다.

이것이 바로 코틀린의 특징입니다.

fun outfunc(name: String) = println(“Name: $name”)

Unit도 위처럼 생략 가능합니다.

실행하면 동일한 결과를 얻을 수 있습니다.

 

package chap03.section01

fun sum(a:Int,b:Int = 5): Int {
    return a+b
}

fun max(a: Int, b: Int): Int{
    return if(a>b) a else b
}

fun outfunc(name: String): Unit{
    println("Name: $name")
}

fun main(){//최상위(Top-level)함수
    val result1 = sum(2,3)
    val result3 = sum(2)

    val a = 3
    val b = 5

    val result2 = max(a,b)
    outfunc("Kildong")
    println(result1)
    println(result2)
    println(result3)
}

함수에서는 특정값을 미리 지정해놓는

함수 매개변수기본값(default)을 넣을 수 있어요!

sum 함수의 경우에는 a와 b에 각각 2, 3을 넣었지만

b:Int = 5처럼

= 등호를 사용해서 특정값을 넣을 수 있습니다.

두 번째 매개변수에 값을 넣지 않으면

자동으로 5라는 값으로 디폴트가 만들어집니다.

디폴트 값이 있는 경우에는 b의 값을 넣어주는 것을 생략해도 된답니다.

출력하면 a는 2이고, b는 5이므로 a+b, 2+5 즉, 7이라는 값이 나옵니다.

 

a에도 기본값을 넣을 수 있습니다. 2를 기본값으로 넣어보겠습니다.

이러면 괄호안의 값을 완전히 생략할 수 있습니다.

하지만 기본적으로 ab25라는 값으로 연산되는 것입니다.

 

만약 특정값 b에만 스스로 값을 넣고 싶은 경우에는

b=2 이런 형태로

함수 사용 시 이름을 직접 넣어서 인자를 구성하면 됩니다.

 

▷ 가변형 인자

 

chap03.section01폴더에 Alt+Insert해서 코틀린 파일을 만듭니다.

파일명 VarargTest로 합니다.

package chap03.section01

fun normalVarargs(vararg a: Int){
    for(num in a) {
        print("$num ")
    }
}

fun main() {
    normalVarargs(1)
    println()
    normalVarargs(1, 2, 3, 4)
}

함수 특정 인자가 1,2,3개.... 로 바뀐다면 어떻게 될까요?

계속 바뀌면 비효율적이겠죠?

그래서 간략한 표현법으로 동일한 데이터타입인 경우에

vararg라는 키워드가 존재하게 됩니다.

vararg로 들어온 인자는 하나가 아니라 하나 이상을 받아들일 수 있게 됩니다.

즉, 우리가 원하는 만큼 넣을 수 있습니다.

해당 코드를 입력하고 Alt+Shilt+F10 2번을 누르면

우리가 normalVarargs()에 넣은 만큼 계속 출력되는 것을 알 수 있습니다.

println은 한줄 띄어쓰기 / print는 한줄로 붙어서 출력

이렇게 우리가 원하는 만큼 인자를 추가해서

그것을 모두 더하게끔 만들 수도 있습니다.

vararg 잘 기억하시기 바랍니다.

 

 

🔎 함수와 스택 프레임 이해하기

[출처] 부스트코스 코틀린 강의자료

우리가 함수를 호출할 때 내부적인 메모리에 어떤 일이 일어나는지 볼까요?

우리가 프로그램을 구동하면

임시로 쓰는 스택 메모리동적 메모리 공간은 힙이 있습니다.

낮은 주소에서 높은 주소로 점점 증가하고

스택은 거꾸로 높은 주소에서 낮은 주소로 증가하는 형태로 사용되고 있습니다.

 

기본적으로 진입점(main())에 들어가게 되면

제일 처음에 함수의 인자를 보게 되는데 main에는 인자가 없으므로

스택에는 main함수의 프레임이 만들어집니다.

프레임 함수가 사용하고자 하는 변수들을 관리하는 일종의 입니다.

프레임 안에는 지역변수들, 항 스택, 상수 풀 등이 정의되어 준비됩니다.

 

main 함수인자가 없기 때문에 0이 들어가게 되고,

그 다음에 중괄호에 존재하는 {} 지역변수

지역변수스택에 들어갑니다.

num110 들어가고, num2에는 3이 들어갑니다.

이들은 모두 임시 공간에 사용됩니다.

result는 아직 초기화 되지 않았죠?

이 상태에서 새로운 함수를 호출했습니다.

max()라는 함수의 프레임이 새로 만들어지게 됩니다.

여기는 인자num1, num2로 들어가서 해당 함수의 내용들을 처리하게 됩니다.

ab에 각각 103이 들어가게 되고

처리된 후에는 하나씩 사라집니다.

결과물은 프레임 자체가 없어지면서

해당 결과물을 돌려주고 result10이 들어가게 됩니다.

return이 되기 때문에 돌아오게 됩니다.

그리고 최종 결과를 출력하게 됩니다.

 

함수와 스택은 진입할수록 프레임이 계속 쌓여서 올라가고

사용이 완료된 함수는 사라집니다.

동적개체는 힙에 들어갑니다. 힙은 나중에 설명하겠습니다.

함수의 기본 원리에 대해 설명을 마무리 하겠습니다.

 

 

 

 

오늘은 함수형 프로그래밍

두 번째 시간이었는데요.

코틀린은 함수를 간단한 형태로 만들 수 있어서 좋네요.

익숙해지면 저도 함수를 한 줄로 작성할 수 있겠죠?

 

강의에서 중요한 개념은 자막으로 정리해주셔서 좋아요.

그런데 왜 이번 강의자료는 1 페이지 밖에 없는지 궁금해요.

선생님께서 평소에 실습으로 보여주시고,

나중에 강의자료로 다시 정리해주신 점이 좋았는데 말이죠.

그래도 함수와 스택 프레임 이해하기를

그림으로 설명해주셔서 좋았어요.

동적 메모리인 힙이 궁금한데,

이것은 나중에 설명해주신다고 하셔서 기다려보려고요.

 

그럼 다음 시간에 만나요!

 

 

 

부스트코스 서포터즈 3기 codingTrip