(Kotlin 카테고리를 통해서 순서대로 공부할 수 있으니, 참고 부탁드립니다. ^^ 👍 )

 

이번엔 함수에 대해서 알아보자. Kotlin에는 함수를 선언하는 것도 엄청 다양하고 유용한 것들이 많다!👏(대박...함수 조차 이렇게 많이 신경쓰는 언어 너무 매력있고 멋있어요 정말)  빨리 알고 싶으니 바로 Let's go!

 

①. 가장 기본적인 함수 스타일

  //function의 약자 fun, 함수명, 함수 인자, 함수 반환할 타입,로직이 있다.
    fun sum(a: Int, b: Int) : Int {
        return  a + b
    }

위의 코드를 잘 살펴보면

①.function의 약자인 fun

②. 함수명(sum)

③. 함수의 인자(a: Int, b: Int)

④. 함수가 반환할 Type

⑤.함수의 로직이 들어가는 몸통( { return a +b } )으로 구성 되어 있다!


②.표현식 스타일

  //표현식 스타일
    fun sum2(a: Int, b: Int) : Int = a + b
    //표현식 & 반환타입 생략
    fun sum3(a: Int, b: Int) = a + b

Kotlin에서는 표현식 스타일을 제공하고 있다. sum2의 함수를 보면 중괄호 없이 로직만 들어간 것을 확인할 수가 있다.

바로 이런 방법을 표현식이라고 한다!

sum3처럼 반환타입을 생략할 수가 있다.저번 시간에 변수는 타입추론이 가능하다고 했었다. 그런 것처럼 함수도 타입 추론이 가능해져서 타입을 컴파일러가 기본적으로 추론 해주기 때문에 반환 타입을 생략 가능하다!  이것은 함수 본문이 단 하나의 표현식으로 구성된 함수인데 단일 표현식 함수(single-expression function)라고 한다.

 //몸통이 있는 함수는 반환 타입을 제거하면 컴파일 오류 //Int 생략하면 오류
    fun sum4(a: Int, b:Int) : Int {
        return a + b
    }

단! 위의 코드처럼 중괄호가 있을 경우, return-type을 생략하면 compile error가 발생 하니 주의 바란다😢..

예를 들어서 위의 "Int" 를 생략하게 되버리면 return 부분에서 빨간 줄로 변할 것이다(헉👀)


③.반환타입이 없는 함수는 Unit을 반환 한다.

  //반환타입이 없는 함수는 Unit을 반환한다. Void와 유사 반환타입에는  : Unit 이 숨겨져 있다.
    fun printSum(a: Int, b: Int) {
        println("$a + $b = ${a + b}")
    }

Kotlin에서는 반환 타입이 없는 함수는 Unit을 반환하게 되어 있다. Java로 굳이 이야기 하자면 Void와 유사하다.

return이 없고 반환 값이 없는 함수의 경우에 사용 가능하다. Kotlin에서 반환 값이 없거나 중요하지 않은 경우에 사용되는 특수한 타입이다.

하지만 일반적으로 Unit 타입은 생략하고 작성하는 것이 더 깔끔하고 일반적이다.


 ④.Default Parameter

//디폴트 파라미터
    fun greeting(message: String = "안녕하세요!!") {
        println(message)
    }
    
       fun main() {
        greeting()
        greeting("Hi!")
    }

Kotlin에서는 Default Parameter라는 아주 유용한 기능을 제공하고 있다. 인자로 message라는 String값을 받도록 하고,

"안녕하세요!!"라는 값을 할당했는데, 

main 함수에서 실행하게 되면, 첫번째 greeting() 이라고 선언한 함수는 아무 값도 안주니 "안녕하세요!!"라는 값이 출력된다.

두번 째 함수인 greeting("HI!!!")에서는 "HI!!!"라는 값이 출력 된다. 이와 같이 Kotlin에서는 값이 없는 경우 Default parameter에서 값을 할당 해줄 수가 있다.

 

아래는 자바 코드인데, Message라는 Java class라는 클래스를 생성했다.

 

public class Message {

    public void greeting(String message) {
        if (message == null || message.length() == 0) {
            System.out.println("안녕하세요!!");
            return;
        }
        System.out.println(message);
    }

    public static void main(String[] args){

        new Message().greeting(null);

        new Message().greeting("Hello, World");
    }
}

, new Message().greeting(null);은 null이기 때문에 if문으로 값을 check해서 넣어주는 것과 유사하다.


⑤.Named Argument

fun log(level: String = INFO", message: String) {
  println("[$level]$message")
}

fun main() {
  log(message = "인포 로그")
  log(level = "DEBUG", "디버그 로그")
  log("WARN", "워닝 로그")
  log(level = "ERROR", message="에러 로그")
 
}

위와 같이 level이라는 String 변수, message라는 스트링 변수를 받았다. 그래서 level은 괄호로 감싸주었고 $를 주었다.

main 함수에서 log를 4번을 사용했다.

함수에 변수 값을 넣을 때, 이름과 값을 매핑하는 기법을 Named Argument라고 한다. 출력하게 되면

fun log(level: String = INFO", message: String) {
  println("[$level]$message")
}

fun main() {
  log(message = "인포 로그") //[INFO]인포 로그
  log(level = "DEBUG", "디버그 로그") //[DEBUG]디버그 로그
  log("WARN", "워닝 로그") //[WRAN]워닝 로그
  log(level = "ERROR", message="에러 로그") //[ERROR]에러 로그
 
}

 

이렇게 출력 된다.

 

위와 같이 여러 함수기능들이 있으며, Kotlin의 변수와 같이, 함수도 따로 클래스가 없는데도 함수를 선언 가능한 특징이 있다.

 

 

참고: FastCampus

'Kotlin' 카테고리의 다른 글

Kotlin.06 클래스와 프로퍼티  (0) 2023.04.02
Kotlin 05.예외처리  (0) 2023.04.02
Kotlin 04. 널 참조  (0) 2023.04.02
Kotlin 03. 흐름제어  (0) 2023.04.02
Kotlin 01.변수  (0) 2023.04.02

+ Recent posts