본문 바로가기
Kotlin 공부 노트

코틀린의 기본 문법 2(함수,람다,When,생성자)

by 지게요 2021. 12. 15.
728x90
반응형

# Kotlin의 함수

함수는 상자로 생각하면 이해가 쉽다

Kotlin의 함수는 fun으로 시작하고 함수 이름과 소괄호, 중괄호를 붙인다

함수를 만드는 이유는 코드를 여러 번 반복하게 될 때 만들어 놓고 실행만 시키면 시간 단축이 되어서이다

함수 이름 뒤 소괄호 안에여러 개의 파라미터가 들어간다

파라미터의 기본 모양은 파라미터 이름 : 파라미터의 자료형이다

Ex) fun add (a:Int, b:Int) { }

그리고 함수를 축약도 할 수 있다.

파라미터가 정확하게 몇 개가 들어올지 모를 때는 파라미터 앞에다가 vararg를 붙여준다.

Ex) fun add(varary a:Int){ }

 

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main) 
          
        val result = add(20,20)// add함수를 실행하고 결과를 result 변수에 넣어준다
        println("더하기 값은 : $result") // 출력 값은 "더하기 값은 : 40"이 나온다

        var result2 = add4(10,20,30,40) // vararg 때문에 파라미터 여러개 입력 가능
 }
    fun add(a:Int,b:Int) : Int { // Int형 파라미터 두개가 있는 함수를 선언
        return a + b // a + b 값을 return을 해준다
    }

    fun add2(a:Int,b:Int):Int = a + b // 중괄호를 없애고 = 기호 뒤에 문장을 넣으며 return 생략

    fun add3(a:Int,b:Int) = a + b // 반환 자료형을 추론할 수 있으면 반환 자료형 생략 가능

    fun add4(vararg a:Int) // vararg를 붙여 여러개의 파라미터를 받는게 가능
    {
        var output = 0
        for(num in a){  // 반복문으로 a로 들어오는 값들을 하나씩 num에 넣어준다
            output = output + num // num에 들어간 값을 output에 누적 시켜 준다 
       {
       return output // 총 누적된 값을 return 해준다
    }
}

# Kotlin의 람다식

람다식은 중괄호 안에 실행 코드가 들어간 익명 함수라 할 수 있다 즉 이름이 없는 함수로 이해하면 편하다

기본 모양으로는 {<실행될 문장>} ex) {x, y -> x + y}

화살표 기호 왼쪽은 파라미터, 오른쪽은 실행 코드이다

람다식에는 함수의 이름이 없다

람다식을 쓰면 람다식으로 된 익명 함수를 다른 함수의 파라미터로 전달할 수 있다

다른 함수의 파라미터로 전달할 때에는 함수의 이름과 파라미터의 이름을 빼고 기록하면 그것이 함수의 자료형이 된다

ex) fun add(a:Int, b:Int)를 다른 함수의 파라미터로 전달 (Int, Int)->Int 이런 식으로 변환을 해준다.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main) 
      
        var show = { println("show 함수 호출됨") } // 람다식으로 show에다가 함수 생성

        val sum = fun (a:Int, b:Int):Int{  // 익명 함수를 생성한다
            return a + b
        }
        sum(10,10) // 익명 함수 실행
        doAction(fun (){
          println("전달된 함수 호출됨")
        })

        doAction {    // 위에 doAction코드와 동일하다 이런식으로 축약이 가능하다
           println("전달된 함수 호출됨")
           10        // 값을 리턴하고 싶으면 그냥 적어주면 리턴이 된다
        }

         doAction {    // 위에 doAction코드와 동일하다 이런식으로 축약이 가능하다
           println("전달된 함수 호출됨")
           return@doAction 10 // return을 명확하게 하고 싶으면 @(라벨)을 붙여서 리턴을 해준다
        }
        
    }

    fun doAction(action:()->Unit){ // 파라미터가 없고 반환 자료형이 없는 함수를 파라미터로 받아온다
        println("doAction 호출됨.")
        action()
     }
}

# When 조건문

코틀린에서는 when이라는 조건문이 있다 이 when은 기존 자바의 switch ~ case를 대체를 한다

변수의 값이 어떤 값인지를 비교하여 각각의 값에 맞는 코드를 실행한다.

ex) when (변수) {

값 1 -> 코드 1

값 2 -> 코드 2

}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main) 
        
        val a = 1
        val b = 2
       
        when(a){           // when을 기본적으로 이렇게 사용한다
        1 -> {
          println("들어있는 값은 1입니다")
        }
        2 -> {
          println("들어있는 값은 2입니다")
        }
        else -> {
          println("들어있는 값이 1도 아니고 2도 아닙니다")
         }
        }

       when(a){           // 1,2이 똑같은 값을 출력한 경우에는 이런식로 가능
        1,2 -> {
          println("들어있는 값은 1이거나 2입니다")
        }       
        else -> {
          println("들어있는 값이 1도 아니고 2도 아닙니다")
         }
        }

        when(a){           // 범위를 지정해주고 싶으면 in을 붙이고 숫자 사이에 ..을 붙여주면 된다
        in 1..10 -> { // 이것은 1부터 10까지라는 뜻이다
          println("들어있는 값은 1부터 10까지 중의 하나입니다")
        }       
        else -> {
          println("들어있는 값이 1도 아니고 2도 아닙니다")
         }
        }
    }
}

# 생성자 직접 정의 / 초기화

코틀린에서는 constructor 키워드를 사용하여 생성자를 직접 정의할 수 있다

<Person.Kt>

class Person{
   var name:String? = null
   var age:Int? = null
   lateinit var adress:String

   constructor(){
      println("첫번째 생성자 호출됨")
    }

   constructor(name:String?){
      println("두번째 생성자 호출됨")
      this.name = name
    }
        
   constructor(name:String?, age:Int?, address:String?){
      println("세번째 생성자 호출됨")
      this.name = name
      this.age = age
      this.address = address
    }        


    }

<MainActivity.kt>

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main) 
        
        val person = person("홍길동",20,"서울시") // person의 객체를 만드는 동시에 만들어놓은
                                                  // 생성자를 통해 생성을 한다
    }
}

자바에서 생성자의 파라미터로 받은 값의 유효성을 검사하고 초기화하는 경우가 많다. 

Kotlin에서는 init 키워드를 사용한다.

class Person(var name:String, var age:Int, var adress:String){
	init{
    	println("${this.name}님은 ${this.age}살이고 ${this.adress}살고 있습니다.")
    }
 }

 

반응형