기본 요소 : 함수
- 함수선언은 'fun'을 사용
- 함수를 최상위에 정의 가능(반드시 클래스 안에서 함수를 정의해야할 필요가 없음)
- 타입 명시는 변수명 뒤
- 식이 본문인 함수가 자주 쓰인다.
- cf) if는 문장이 아니라 식이다. 본래 자바에서 if문은 값을 만들어내는 식이 아니라 문장이었다. 반면 대입문은 자바에서 식이었으나 코틀린에서는 문이 되었다.
//'블록이 본문인 함수'-block body
fun max(a: Int, b: Int): Int {
return if(a > b) a else b
}
//'식이 본문인 함수'-expression body
fun max(a: Int, b: Int) Int = if(a>b) a else b
//위는 동일
- kotlin의 '타입추론'
- 식이 본문인 함수의 반환 타입생략. but ! 블록이 본문이 함수는 반드시 반환타입을 지정하고 return문을 명시해야 한다.
- 코틀린은 정적타입 지정 언어로, 컴파일 시점에 모든 식의 타입을 지정해야 한다. 이때 컴파일러가 함수 본문 식을 분석해 식의 결과 타입을 함수 반환 타입으로 정해준다. => '타입추론'
fun max(a: Int, b: Int) = if (a>b) a else b
기본 요소 : 변수
- 초기화 식이라면 변수 타입 명시를 생략해도 된다.
//초기화 식을 기반으로 타입 추론을 통해 자동적으로 타입을 지정해준다.
val a: Int = 10
val b = 10
val c = "good"
//만약 초기화 식이 아니라면 타입 추론이 불가능하다.
val answer: Int
answer = 10
- 변경 가능한 변수 / 변경 불가능한 변수
- val
- value에서 따옴
- immutable: 변경 불가능한
- 해당 키워드로 변수를 선언하고 초기화 하면 이후 재대입은 불가능하다.
- java의 final 변수와 동일
- 정확히 한번만 초기화 해야한다. 하디만 블록이 실행될 때 오직 한 초기화 문장만 실행됨을 컴파일러가 확인할 수 있다면 조건에 따라 val 값을 다른 여러 값으로 초기화도 가능하다.(#1.1)
- 참조 자체는 불면일지라도 그 참조가 가르키는 객체 내부의 값은 변경될 수 있다.(#1.2)
- var
- variable
- mutable: 변경 가능
- java의 일반 변수
- 값의 변경은 가능하지만 변수 타입은 바꿀 수 없다(#1.3)
//1.1
val a: String
if(abc()){
a = "zzz"
} else {
a = "xxx"
}
//1.2
val a = arrayListOf("Java")
a.add("Kotlin")
//1.3
var a = 42
a = "abc"