1. 함수
코틀린의 함수는 선언 시에 함수명 앞에 fun 키워드를 붙인다.
return 타입은 : type을 사용해서 표현하고 return 값이 없을 때는 Unit 키워드 또는 생략해준다.
return 값이 있을 때는 생략할 수 없다.
파라미터는 [변수명 : 타입] 형식으로 준다.
fun helloWorld(){
println("Hello World!!")
}
fun add(a: Int, b: Int) : Int{
return a + b
}
2. val / var
val은 value로 상수를 뜻한다 = 변경할 수 없다. / var은 variable로 변수를 뜻한다 = 변경할 수 있다.
val, var는 동적 타입을 사용할 수 있기 때문에 값을 지정해주면 뒤에 타입 지정을 생략할 수 있다.
//kotlin에서 변수 선언 방법
val a: Int = 10
val b = 10
3. String template
코틀린에서는 기본적으로 문자열 안에 변수를 넣을 때 ${변수}를 사용할 수 있다.
자바에서는 String.format을 사용해야 $를 사용할 수 있었다.
val name = "홍길동"
println("My name is ${name}")
4. 조건문
if문은 자바와 비슷하고, switch문 대신 when을 사용한다.
자바보다 더 간결하고 보기 쉬운 것 같다.
fun check(a: Int, b: Int){
if(a > b){
println("a")
}else{
println("b")
}
}
fun check2(a: Int, b: Int) = if(a>b) a else b
//위 두 함수는 동일한 뜻이다.
//코틀린에서는 (a>b) ? a : b 와 같은 삼항 연산자가 없기 때문에 위와 같이 쓸 수 있다.
fun check3(score: Int){
val result = when(score){
1 -> 1
2 -> 2
3, 4 -> 3
in 5..10 -> 10
else -> 0
}
}
5. 배열과 리스트
코틀린의 배열은 any타입을 사용해서 여러 타입의 값을 넣을 수 있다.
val array = arrayOf(1, "2", 3.0f)
6. 반복문
자바와 유사하다
//1~100
for(i in 1..100){
println(i)
}
//100~1
for(i in 100 downTo 1){
println(i)
}
//인덱스와 함께 사용할 수 있다.
for((index, name) in students.withIndex()){
println("${index}번째 학생 = ${name}")
}
7. Nullable / NonNull
변수가 널 값을 가질 수 있는지 없는지 지정할 수 있다. Null 가능성이 있다면 컴파일 시 에러를 띄워줘서 NPE를 방지할 수 있다.
기본적으로 NonNull 타입이기 때문에 null을 넣을 수 없다. Null을 사용하기 위해서는 타입 뒤에 ?를 붙여서 Nullable로 바꿔줘야한다.
fun nullCheck(){
var name : String? = null
//var name : String = null는 사용할 수 없다.
//Nullable 상태로는 함수를 호출할 수 없기 때문에
//?를 붙여서 null일 경우 실행하지 않도록 명시해줘야 함수를 호출할 수 있다.
name?.toUpperCase()
}
// ?:
// 값이 null이라면 뒷 내용 실행
val lastName : String? = null
val fullName = name + " " + (lastName ?: "No lastName")
// !!
// 해당 자리에 절대 null이 올 수 없다면 개발자가 직접 Null이 아니라고 명시해줌
fun ignoreNull(str: String?) {
val notNull : String = str!!
notNull.toUpperCase()
}
8. 클래스
생성자 생성 시 constructor키워드를 사용한다(생략 가능)
생성자의 파라미터에 디폴트 값을 넣어주면 파라미터가 없는 기본 생성자도 사용할 수 있다.
open class Human constructor(name: String = "default"){
val name = name
//자바에서 오버로딩을 통해 생성했던 부 생성자를 클래스 내부에서 constructor를 사용해서 생성할 수 있다.
//파라미터에 값을 넣기 위해서는 this를 사용해서 주 생성자를 호출해줘야한다.
constructor(name: Stirng, age: Int) : this(name){
println("${name}은 ${age}살 입니다")
}
//init을 사용해서 객체 생성 당시 바로 호출 시킬 수 있다.
init{
println("객체 생성 성공!")
}
open fun eatingCake(){
println("YUMMMYYYYYYY!!!")
}
}
fun main(){
//객체 생성 당시 new 키워드가 필요없다.
val human = Human()
val human2 = Human("홍길동", 86)
human.eatingCake()
}
9. 상속
클래스를 상속받기 위해서는 무분별한 상속을 막기위해 상속하는 클래스 앞에 open이라는 키워드를 붙여줘야한다.
override도 마찬가지로 open을 붙여줘야한다.
class Korean : Human() {
override fun eatingCake(){
println("~!~~~~~~~~~~~~~~~")
}
}
//기존 Human 클래스 앞과 eatingCake함수 앞에 open을 붙여줌
후기
코틀린은 자바에서 null에 대한 안정성과 코드를 더 짧게 가져가서 간결하고 가독성이 높아지는 장점이 있고,
문법를 사용할 때의 느낌은 파이썬과 자바를 합친 것 같다.