개발 일기

2-1-2. 함수 본문

Kotlin

2-1-2. 함수

dev-jo 2021. 10. 5. 23:32

2장 코틀린 기초

👋 목차

  • 함수 , 변수, 클래스, enum, 프로퍼티를 선언하는 방법
  • 제어 구조
  • 스마트 캐스트
  • 예외 던지기와 예외 잡기

 

노션에서도 해당 글을 확인 하실 수 있습니다.

https://www.notion.so/2-1833f2fe438742c881119fc5042d79bb

 

2장 코틀린 기초

👋 목차

www.notion.so

 

작성한 코드는 깃허브에서도 확인 하실 수 있습니다.

https://github.com/pursue503/kotlin-in-action

 

GitHub - pursue503/kotlin-in-action: kotlin in action study

kotlin in action study. Contribute to pursue503/kotlin-in-action development by creating an account on GitHub.

github.com

 


2.1.2 함수

 

 

 

아무런 값도 반환하지 않는 함수를 어떻게 선언하는지 방금 살펴봤습니다. ( 이전 글 )

이번에는 의미 있는 결과를 반환하는 함수의 경우 반환 값의 타입을 어디에 지정해야 하는지 살펴보겠습니다.

 

/*
코틀린의 함수 선언은 fun키워드로 시작합니다.

fun다음에 함수 이름이오고  그뒤 괄호 안에 파라미터 목록이 옵니다.

함수의 반환 타입은 파라미토 목록의 닫는 괄호 다음에 오는데 괄호와 반환 타입 사이를 콜론(:)으로 구분해야 합니다.

함수 이름   파라미터        리턴타입
fun max(a: Int, b: Int): Int {

}
*/

 

Max

 

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

fun main() {
    println(max(1,10))// 10
}

 

코틀린에서 if란?

위의 함수 에서 자바와 다른 if문이 있습니다

자바에서는 if가 제어문이지만 코틀린에서는 식 (expression) 입니다.

위 예제의 if식은 자바의 3항 연산자로 작성한것과 비슷하게 됩니다

(a > b) ? a : b

 

아래는 kotlin in action 에서 나온 설명입니다.

 

문(statement)과 식 (expression)의 구분

코틀린에서 if는 식이지 문이 아니다. 식은 값을 만들어 내며 다른 식의 하위 요소로 계산에
참여할 수 있는 반면 문은 자신을 둘러싸고 있는 가장 안쪽 블록의 최상위 요소로 존재하며 아무
런 값을 만들어내지 않는다는 차이가 있다. 자바에서는 모든 제어 구조가 문인 반면 코틀린에서
는 루프를 제외한 대부분의 제어 구조가 식이다. 나중에 이 책에서도 보여주겠지만, 제어 구조를
다른 식으로 엮어낼 수 있으면 여러 일반적인 패턴을 아주 간결하게 표현할 수 있다
반면 대입문은 자바에서는 식이었으나 코틀린에서는 문이 됐다. 그로 인해 자바와 달리 대입식과
비교식을 잘못 바꿔 써서 버그가 생기는 경우가 없다.

 

식이 본문인 함수

 

위의 예제를 좀더 간결하게 표현 할 수 있씁니다

앞의 함수 본문은 if 식 하나로 이루어져있습니다 이런경우 중괄호를 없애고

return 을 제거하면서 등로 (=) 를 이용하여 더 간결하게 표현할 수 있습니다.

 

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

 

본문이 중괄호로 둘러싸인 함수를 블록이 본문인 함수라 부르고, 등호와 식으로 이뤄진
함수를 식이 본문인 함수라고 부릅니다.

 

코틀린에서는 식이 본문인 함수가 자주 쓰입니다. 그런 함수의 본문 식에는 단순한 산술식
이나 함수 호출 식뿐 아니라 if, when, try 등의 더 복잡한 식도 자주 쓰인다고 합니다.

 

추가로 반환 타입까지 생략할수 있습니다

 

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

 

반환 타입을 생략 할 수 있는 이유

 

여기서 반환 타입을 생략할 수 있는 이유는 무엇일까요
코틀린은 정적 타입 지정 언어이므로 컴파일 시점에 모든 식의 타입을 지정해야 합니다.
실제로 모든 변수나 모든식에는 타입이 있으며, 모든 함수는 반환 타입을 정해야 합니다.

하지만 위처럼 식이 본문인 함수의 경우 굳이 사용자가 반환 타입을 적지 않아도
컴파일러가 함수 본문 식을 분석하여
식의 결과 타입을 함수 반환타입으로 지정해줍니다.

이렇게 컴파일러가 타입을 분석해 프로그래머 대신 프로그램 구성 요소의 타입을 정해주는 기능을
타입 추론 이라고 부릅니다.

 


 

Max 함수의 자바 , 코틀린 버전

 

Kotlin

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

fun main() {
    println(max(1,10))// 10
}

 

Java

 

public class JavaVersion {

    public static int max(int a, int b) {
        return a > b ? a : b;
    }

    public static void main(String[] args) {
        System.out.println(max(1, 10)); // 10
    }

}

'Kotlin' 카테고리의 다른 글

2-1-1. Hello Kotlin World!!  (0) 2021.10.05
Kotlin  (0) 2021.10.05