💌 변수와 함수

📌 변수 선언 및 초기화

💜 변수 선언

  • val (value) : 한 번 초기화하면 더는 변경할 수 없는 변수 (Read-only)
  • var (variable) : 언제든지 변경할 수 있는 변수 (Mutable)
val data1: Int = 10
val data2 = 20
var data3 = 30

💜 Nullable 변수

  • 어떤 변수에 null값을 대입하려면 타입에 물음표(?) 기호를 이용하여 명시적으로 null이 될 수 있는 변수로 선언
val nullableData1: String? = null
var nullableData2: String? = null

💜 상수변수 선언

- const

  • 일반적으로 처음에 대입한 초깃값을 변경하지 않고 그대로 사용하는 변수
const val myConst: Int = 10 
const var myConst2: Int = 10  // ← 에러

class MyClass{
	const val myConst3 = 30  // ← 에러
}

fun some(){
	const val myConst4 = 40   // ← 에러
}
  • 변수를 최상위 레벨로 선어하거나 object로 선언한 클래스에서만 사용할 수 있다.

📌 함수 사용법

💜 함수 선언

- fun

fun sum(a: Int, b: Int): Int {
	return a+b
}

fun sum(a: Int, b: Int): Unit{ // 반환값 없을 때 Unit 명시
	//...
}
fun sum(a: Int, b: Int){ // Unit 생략가능
	//...
}
  • 단일 표현 함수
fun some(a: Int, b: Int): Int = a+b

💜 함수 오버로딩

  • 같은 이름의 함수를 매개변수 부분을 다르게 하여 여러 개 정의하는 기법
fun some(a: String){
	println("some(a: String) call...")
}
fun some(a: Int){
	println("some(a: Int) call...")
}
fun some(a: Int, b: String){
	println("some(a: Int , b: String) call...")
}

💜 중위 표현식

- infix

  • 연산자를 피연산자의 중간에 놓는다는 개념

    다음의 경우만 사용 가능
    ∙ 클래스의 맴버 함수로 선언하거나 클래스의 확장(extension)함수일 때
    ∙ 매개변수가 하나인 함수일 때

// 함수 확장
infix fun Int.myFun(x: Int): Int{
	return x*x
}
class FunClass{
	infix fun infixFun(a: Int){
    	println("infixFun call...")
    }
}
fun main(args: Array<String>){
	val obj = FunClass()
    obj.infixFun(10)
    obj infixFun 10 // 중위표현식
    
    println(10 myFun 10)
    println(10.myFun(10))
}

🖥
infixFun call...
infixFun call...
100
100

💜 가변인수

- vararg
인수의 개수나 타입에 상관 없이 아무렇게나 지정해도 함수 호출

fun <T> varargsFun(a1: Int, vararg array: T){
	for(a in array){
    	println(a)
    }
}

fun main(args: Array<String>){
	varargsFun(10, "hello", "world")
    varargsFun(10, 20, false)
}

🖥
hello
world
20
false

💜 재귀함수

- tailrec

  • 자기가 자기를 호출하는 함수
  • 재귀함수가 반복문으로 구현된 일반 함수로 컴파일되므로 StackOverflowError 발생 방지
  • 자신을 다시 호출하는 구문은 함수 맨 마지막 작업으로 작성해야 함
// 재귀 함수
fun recPrint(no: Int = 1, count: Int = 1){
	println("recPrint..")
    return if(no == count) return else recPrint(no -1, count)
}

fun main(args: Array<String>){
	recPrint(3)
}


// tailrec 재귀 함수
tailrec fun tailrecPrint(no: Int = 1, count: Int = 1){
	println("tailrecPrint..")
    return if(no==count) return else tailrecPrint(no -1, count)
}

fun main(args: Array<String>){
	tailrecPrint(3)
}

🖥
recPrint..
recPrint..
recPrint..

tailrecPrint..
tailrecPrint..
tailrecPrint..

📋 자바 vs 코틀린 ✏️

💛 코틀린에서는 const로 최상위 레벨에 상수변수를 선언한다.

코틀린에는 static 예약어 자체가 없다.

[java]
public static final int CONST_VAL = 10;

[kotlin]
const cal CONST_VAL = 10

💛 코틀린의 final은 자바의 final과 다르다.

class Test{
	final var myVal = 10
    
    fun some(){
    	myVal = 30
    }
}

-> 아무 문제 없이 잘 실행된다. 변경할 수 없는 변수 정의시 val 사용

💛 코틀린은 변숫값이 자동으로 초기화되지 않는다.

-> 코틀린은 초깃값 없더라도 lateinit를 사용하여 나중에 명시적으로 초깃값을 대입하여 사용하거나, 물음표(?) 기호를 이용해 null 허용(nullable)으로 선언하여 null값으로 초기화하고 사용해야 한다.

💛 코틀린에서는 자바에서 제공하지 않는 함수의 다양한 이용방법을 제공한다.

-> 함수 내에 함수를 정의하거나 함수를 중위 표현식으로 이용하거나 기본 인수 등을 제공

profile
Android Developer..+ iOS 슬쩍 🌱 ✏️끄적끄적,,개인 기록용 👩🏻‍💻

0개의 댓글