본문 바로가기
수업내용

20230727 Kotlin Function

by titlejjk 2023. 7. 27.

 

Java 에서는

public void a(){}

Kotlin에서는 

fun a( ):Unit{ } or fun a( ){ }

식으로 함수를 만든다

Kotlin에서 Unit은 원시 type이라고 지칭하고 Java의 void와 비슷한 역할을 한다.

함수명( ):return type{ }

 

 

이름이 없는 함수를 만들어서 그 참조값을 변수에 담을 수도 있다.

    var b = fun(){}

    var c = fun():Unit{}

위의 함수를 살펴보면

대입연산자 " = " 우측에 있는 함수는 return type이없는(Unit)함수이며 전달해야하는 인자는 없는 상태이다.

 

매개변수가 있는 함수와 없는 함수는 다른 함수로 판단한다.

    var c = fun():Unit{}
    
    c = fun(num:Int){}

함수의 타입이 동일하려면 매개변수와 return타입이 동일해야한다.

var c = fun():Unit{}

    c = fun()Int{
        return 10
    }

 

그럼 함수의 타입은 어떻게 명시할까?

그 코드는 아래와 같다.

var c:()->Unit = fun():Unit{}

매개변수명을 넣어서 하나의 함수를 만들어보자면 아래와 같다.

var d:(String)->Unit = fun(str:String):Unit{}

String을 넣어서 함수를 하나더 만들어보겠다.

var e:(String)->String = fun(str:String):String{return "hello"}

정리하자면

 //매개변수는 1개, type은 String, 리턴type은 Unit(없다)
    var d:(String)->Unit = fun(str:String):Unit{}
    //매개변수는 1개 type은 String, 리턴type은 String
    var e:(String)->String = fun(str:String):String{return "hello"}

간단한 + 연산함수를 만들면 이렇다.

//매개변수는 2개, type은 Int,Int 리턴type Int
    var sum:(Int, Int)->Int=fun(a:Int,b:Int):Int{
        return a+b
    }

 

 

함수를 변수에 담을 수 있다는 함수를 전달하면서 함수를 호출 할 수 있다는 의미이다.

Javascript의

.addEventListener("xxx", function(){})

를 떠올려보면 이해하기 쉽다.

 

package com.example.hellokotlin

//함수 type을 매개변수로 전달받는 함수를 정의 하고자 한다.
fun useFunc(a:()->Unit){
    //인자로 전달 받은 함수 호출하기
    
}

fun main(){
    //위의 useFunc()함수를 호출해 보세요
    useFunc (fun(){
        println("?")
    })
    
    //fun()생략가능
    useFunc ({
        println("!")
    })
    
    //함수를 호출하는 표현식( )생략 가능
    useFunc { 
        println("?!")
    }
}

 

//Read Only숫자 배열
    var nums:List<Int> = listOf(10, 20, 30)

index 배열에 있는 숫자들을 변경할 수 없다.

배열에는 한번 item이 들어가면 그대로 사용한다(수정할 일이 별로 없다.)

Kotlin은 수정가능한 배열과 수정불가능한 배열을 따로 나누어서 사용한다.

Read Only를 사용하면 빠른속도를 가지는 장점이있다.

수정자체를 막으려면 val을 사용하면 된다.

 

Read Only

nums라는 배열을 forEach를 사용해 출력해보겠다.

함수를 전달하여 호출시켜주면 된다.

 //Read Only숫자 배열
    var nums:List<Int> = listOf(10, 20, 30)

    nums.forEach(fun(item){
        println(item)
    })

 

fun부분을 생략해서 사용할 수 있다.

캡쳐의 it은 매개변수에 전달되는 바로 '그것(it)'을 가리킨다.

 

    //Read Only숫자 배열
    var nums:List<Int> = listOf(10, 20, 30)

    nums.forEach(fun(item){
        println(item)
    })

    nums.forEach ({
        //it은 매개변수에 전달되는 바로 '그것(it)'을 가리킨다.
        println(it)
    })

    nums.forEach {
        println(it)
    }

 

이번에는 배열 값에 2를 곱하는 함수를 만들면 아래와 같다.

 

val result = nums.map {
       //nums배열을 이용해서 모든 item 에 *2

        it*2
    }

 

여기에 filter라는 함수를 이용하면 아래와 같이 응용가능하다.

//nums배열을 이용해서 5보다 큰 item만 남겨놓은 새로운 배열 얻어내기
val result2=nums.filter {
        it > 5
    }
    //nums 배열을 이용해서 item에 모두 3을 곱한 후 10보다 큰 item만 남겨놓은 새로운 배열
    //얻어내기
    val result3=nums.map { it*3 }.filter{it>10}

 

Class

Class는 객체를 생성하기 위한 설계도이다.

 

여기에 main함수를 만들고 MyCar라는 클래스로 객체를 생성해서 참조값을 c1이라는 변수에 담아보겠다.

 

fun main(){
    //MyCar 클래스로 객체를 생성해서 참조값을 c1이라는 변수에 담기
    MyCar()
    var c1:MyCar = MyCar()
}

YourCar()클래스의 drive()메서드를 호출하려면 아래와 같이 코드를 작성하면된다.

 var c2 = YourCar()
    c2.drive()

 

객체를 생성하는 시점에 초기화 하고 싶은 작업이있으면 init이라는 메서드를 사용하면된다.

//대표(primary)생성자는 클래스명 우측에 선언한다.
class Ship constructor(){
    init {
        //객체를 생성하는 시점에 초기화 하고 싶은 작업이 있으면 여기서 한다.
        println("Ship클래스의 init")
    }
}
//constructor 예약어는 생략이 가능하다.
class Ship2 (){
    init {
        //객체를 생성하는 시점에 초기화 하고 싶은 작업이 있으면 여기서 한다.
        println("Ship2클래스의 init")
    }
}

//생성자의 인자로 전달 받을게 없으면 ()소괄호도 생략이 가능하다.
class Ship3 {
    init {
        //객체를 생성하는 시점에 초기화 하고 싶은 작업이 있으면 여기서 한다.
        println("Ship2클래스의 init")
    }
}

생성자의 인자로 전달받은 값을 매개 변수에 저장하고 싶으면 필드를 선언해주면 된다.

package com.example.hellokotlin

class Person constructor(name:String){
    //필드선언
    var name:String
    //초기화 블럭
    init {
        //생성자의 인자로 전달받은 값을 매개 변수에 저장
        this.name=name;
    }
}

위의 코드를 줄이면 아래와 같다.

class Person(var name:String)

 

'수업내용' 카테고리의 다른 글

20230728 Kotlin  (0) 2023.07.28
20230727 Android  (0) 2023.07.28
20230726 Android Fragment  (0) 2023.07.26
20230726 Kotlin  (0) 2023.07.26
20230725 Android 다른화면으로 넘어가기  (0) 2023.07.25

댓글