본문 바로가기

kotlin, java, android

[Kotlin] function expression / function parameter / single-expression function

Function Expression

kotlin의 정말 거의 모든 것은 expression이다. 

cf) expression 이다 == value를 갖는다 == type이 있다

수많은 종류의 expressions 중에서도 눈에 띄는 것은 function도 expression이라는 점이다.

func은 뒤에서 보고.. 우선 line2의 if statement가 expression이라는 설명을 해보겠다.

이 if문은 true or false라는 value를 갖고, bool type인 expression인 것이다! (간단ㅎㅎ)

 

충분히 납득할만 했던 if문을 뒤로하고.. 이번에 println문을 살펴보자.

line1의 println문은 딱히 value가 없는 듯하다.. ㅇㅈ?

그러나 kotlin은 이 상황에서도 의미가 없을 뿐 'Unit'이라는 value가 있다, unit type이다! 라고 정리한다.

이때 println이라는 함수가 Unit이라는 value를 갖는 unit type expression임을 알 수 있다.

 

cf) kotlin은 module화를 위하여 function, class를 모두 사용한다.
function이 class 밖에 존재할 수 있다.

이번 예시는 if statement이지만 body가 bool type이 아닌 println문이다.

따라서 if는 value가 Unit이고 Unit type인 expression이 된다.

참고로 line1에서 { 왼쪽에 쓰인 Unit은 함수의 return type이다! 

 

다음으로는 block body를 갖는 function expression을 살펴보자^^

조금 복잡하다고 느껴지기 때문에, 알아야 하는 내용을 넘버링해서 정리해보겠다.

㉮ kotlin의 type inference engine은 block body를 갖는 function의 return type을 infer하지 않는다.

㉯ 따라서 block body를 갖는 function은 return type을 명시적으로 작성하거나, 작성 안해서 Unit을 return하게 된다.

㉰ 한줄짜리 expression body를 갖는 function은 return type inference를 해준다!

 


Function Parameter

kotlin의 function parameter는 default parameter가 존재함으로써, 초기화가 가능하다! 

ex)

물론 default parameter로 초기화를 안하면, 함수를 호출할 때 인자를 꼭 써줘야한다.

이렇게 초기화 안해주는 parameter를 required parameter라 한다.

 

이 두가지 parameters를 섞어서 함수를 선언할 수도 있다.

어떤 parameter는 초기화를 하고, 또 다른 parameter는 초기화를 안해도 된다는 말이다.

이땐 초기화하는 default parameter를 parameter 선언부의 맨 뒤에 써주는 것이 좋다.

(왜냐하면 함수 호출시 default는 인자를 생략해버릴 수가 있어서 헷갈릴까봐 그렇다.)


Single Expression Function

한줄짜리 함수의 body를 curly braces없이 쓰는 건 많이 보았을 것이다.

kotlin에서는 한줄짜리 함수의 body를 curly braces 없이 표현할 때, =를 추가로 사용해주어야 한다.

아래 동일한 기능의 두 함수를 확인해보자.

익숙하지 않은 syntax는 여러번 보고 써보는 수 밖에...ㅜ_ㅜ

여기서 한가지 복습해볼 수 있는 것은,

function1의 경우 block body function이므로 kotlin이 return type inference를 해주지 않는 상황이고,

return type을 int로 명시하였다. 만약 return type을 작성하지 않았다면 Unit type이 되었을 것이다.

function2의 경우 한줄짜리 expression body function이다. kotlin이 return type inference를 해주기 때문에

따로 return type을 명시하지 않아도 알아서 int가 되었을 것이다.