Kotlin

[Kotlin] 함수

hvoon 2022. 9. 14. 14:51
package days01

fun main(){
    // 함수를 만드는 문법
    // fun 함수이름(매개변수): 리턴값의 타입{
    //  코드 입력..
    // }
    test1()

    // 코틀린 함수는 main 함수 내부에서도, 외부에서도 생성이 가능
    // 변수가 지역변수와 전역변수가 있듯이 함수도 그렇다는 뜻
    var a1:Int=100 // 1.
    fun test10(){
        var a1:Int=200 // 2. 함수 내부에 지역변수 생성
        println("test10 호출")
        println("a1:$a1") // 2. 지역변수 사용 및 출력
    } // 함수의 생성
    test10() // 함수의 호출
    println("a1:$a1") // 1. 위에 있는 var a1:Int=100 명령이 없다면 이 명령은 오류
    println("---------------------------")
    
    fun test11(){
        println("test11 호출")
        fun test13(){
            println("test13 호출")
        } // 함수 내부에 지역함수 생성
        test13()
    }
    test11()
    // test13() -> error  
    // test13 함수는 test11 함수 안에 있는 지역함수이므로 외부에서 호출할 수 없음
}

// 기본함수 (전달인수 없고 변환값 없는 함수)
fun test1(){
    println("test1 함수 호출")
    println("---------------------------")
}

 

 

fun main(){
   test2(a1: 20, a2: 12.23) // test2() 함수 호출
    // 매개변수가 있는 함수를 호출할 때
    // 전달인수를 넣는 동자기 하나하나 끝날 때마다 '매개변수 이름:'를 인텔리제이가 전달인수 앞에 붙여줌
    // 자동으로 입력되는 사항이니 수동으로 입력하면 안됨

    val k1:Int=20
    val k2:Double=123.45
    test2(k1,k2) //  변수가 전달인수로 전달될 때는 앞에 매개변수 이름이 붙지 않음

    test2(a2=123.12, a1=300)
    // 다른 프로그래밍 언어도 마찬가지이지만 전달인수의 순서는 매개변수의 기수된 순서에 맞춰 넣어줌
    // 다만 위와 같이 순서를 바꾸고자 한다면 '매개변수='를 써서 전달인수와 매개변수의 짝을 맞춰줌
}

// 전달인수&매개변수 있는 함수
// 매개변수는 var 없이 변수이름과 자료형만 기술함
fun test2(a1:Int, a2:Double){
    println("test2: 호출")
    println("a1:$a1")
    println("a2:$a2")
}

 

fun main(){
    test3(100  , 11.11)
    test3(200)
    // a2에 전달할 값이 생략되어 기본값 0.0이 a2 변수에 대입됨
    test3(a2=30.123)
    // a1에 전달할 값을 생략하려면 매개변수 이름을 써서 전달값만 전달함
    test3()
    // 모두 생략 가능
}
// 매개변수에 기본값(default값)이 지정된 함수: 해당 매개변수에 전달되는 값이 없으면 
//                                          기본값이 변수에 대입됨
fun test3(a1:Int=0, a2:Double=0.0){
    println("test3 호출")
    println("a1:$a1")
    println("a2:$a2")
}

 

fun main(){
    val r1:Int=test4(100, 200.12)
    println("r1:$r1")
    val r2:Int=test4(1000, 2000.123)
    println("r2:$r2")
}
// 리턴(반환)값이 있는 함수
// fun 함수이름(매개변수): 리턴값의 자료형()
fun test4(a1:Int, a2:Double): Int{
    println("test4 호출")
    val result:Int=a1+a2.toInt()
    return result
} // 변수 또는 리터럴 .toInt() -> 변수 또는 자료의 형변환(정수로 변화)

 

fun main(){
    test5()
    test6()
}

// Unit: void의 의미로 사용되며 대부분 생략된 채로 사용됨
fun test5():Unit{
    println("test5 호출")
}
fun test6(){
    println("test6 호출")
}

 

fun main(){
   test7()
   test7(100)
}

// 함수의 오버로딩: 매개변수의 형태와 갯수를 달리한 같은 이름의 함수들을 정의하고 사용함
fun test7():Unit{
    println("test7 호출 - 매개변수 없음")
}
fun test7(a1:Int=200){
    println("test8 호출 - 매개변수 한 개(Int)")
}

 

Ex

package days01

import java.text.DecimalFormat

fun main(){
    //  코틀린의 화면 입력
    print("국어 점수 입력:  ")
    val kor:Int=readLine()!!.toInt()
    print("영어 점수 입력:  ")
    val eng:Int=readLine()!!.toInt()
    print("수학 점수 입력:  ")
    val mat:Int=readLine()!!.toInt()
    // 국어 영어 수학 점수를 입력 받아서 총점 평균을 성적표 양식에 맞춰 출력

    val tot:Int=sum(kor, eng, mat)
    val avg: Double=average(tot)

    prn(kor, eng, mat, tot, avg)
}

fun sum(kor:Int, eng:Int, mat:Int):Int{
    val tot:Int=kor+eng+mat
    return tot
}

fun average(tot:Int):Double{
    return tot/3.0
}

fun prn(kor:Int, eng:Int, mat:Int, tot:Int, avg:Double){
    val df1= DecimalFormat("#,##0.0")
    println("\t\t===성적표===")
    println("국어\t영어\t수학\t총점\t평균")
    println("------------------------------")
    print("$kor\t$eng\t$mat\t$tot\t${df1.format(avg)}\t")
}