[Kotlin] 기초 문법

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에 대한 안정성과 코드를 더 짧게 가져가서 간결하고 가독성이 높아지는 장점이 있고, 

문법를 사용할 때의 느낌은 파이썬과 자바를 합친 것 같다.