du.study기록공간

코틀린 기본 문법 정리 - 1 본문

kotlin

코틀린 기본 문법 정리 - 1

du.study 2020. 6. 14. 22:07
728x90

 

 

앞으로 좀 자세하게 작성해 나갈 내용들에 대해서 간략한 요약을 작성하려합니다. 내부적으로 확인해봐야할게 매우 많지만, 우선 코드가 조금 익숙치 않아 기본부터 간략하게 정리하려 합니다.

 

현재 코틀린을 다루는 기술 이라는 책을 보면서 필요한 부분은 추가로 작성중입니다.

 

 

1. 필드 및 변수

 

- 다음과 같이 val, var 을 통해서 변수를 선언할 수 있다. 차이점이 있다면, val은 java 기준 final처럼 불변을 보장하며, var의 경우 가변필드로 사용할 수 있다.

    val test  = "hello world"
    var test2 = "hello world2"

 

 

- 타입을 생략 할 수 있다.

다음과 같이 변수에 대해서 타입을 생략할 수 있다. 단, 추론한 타입과 내가 원한 타입이 다를수 있음에 주의하고 왠만하면 명시하자 ( IDE에서는 경고를 뱉어줍니다 명시하라고..)

    val test : String = "hello world"
    var test2 = "hello world2"

    println(test)
    println(test2)
    
    --------------------------------
    result
    hello world
    hello world2

 

- null을 허용하는 타입이 따로 있다.

null을 사용할때 선언부에서 ? 를 추가함으로써 null을 허용하겠다라고 지정합니다. ?사용을 하지않은 상태에서 null을 지정하는경우 컴파일단에서 에러가 발생된다.

 

- 지연된 초기화를 제공한다.

by lazy 를 통해서 불변 변수인 val을 지연된 초기화를 진행할 수 있습니다.

이외에도 var 변수에 대해서 lateinit 이라는 문구를 통해 by lazy와 같은 기능을 제공합니다.

fun main() {
    val test : String by lazy { testFun() }
    val test2 : String by lazy { test}
    println(test)
    println(test2)

}
fun testFun() : String {
    println("초기화 중")
    return "test 1"
}

 

2. TYPE

- 원시타입이 별도로 존재하지 않는다.

해당말을 조금 풀어보면 java에서 primitive type과 reference type ( ex int ,Integer )를 직접 선언해야 했다면, 코틀린은 이런 부분이 별도로 존재하지 않고 컴파일 하는과정에서 적절한 타입으로 변환해줍니다.

ex ) List<Int> 에 추가되는것들은 reference type, 단순 선언은 primitive type

 

참고 페이지 : https://kotlinlang.org/docs/reference/java-interop.html

 

 

3. 컬렉션 유형

- 가변, 불변이라는 두가지 유형이 있다.

이건 자바에서도 사용하던 기능이라 익숙한 기능.. 근데 list add같은경우 다음과 같은 연산을 지원하고있다.

(아래 예시를 보면 꼭 파이썬을 보는 느낌이다..)

    val list1 = listOf(1,2,3)
    val list2 = list1 + 4
    val list3 = list2 + list1

    println(list1)
    println(list2)
    println(list3)
    ---------------------------------
    [1, 2, 3]
    [1, 2, 3, 4]
    [1, 2, 3, 4, 1, 2, 3]
    
   ---------------------------------   

가변 컬렉션의 경우, 타입을 지정하지 않은상태에서 add를 대입하면 클레스가 Boolean으로 매핑해주는것을 볼 수 있다.

 

 

4. 패키지

- java 와 다른 package 구조를 가진다.

 

java 에서는 저장된 디렉토리 구조와 패키지 이름이 모두 일치해야 했다면, 코틀린에서는 그럴 필요가 없습니다. 어떤 폴더에서 생성하였던간에 package를 명시하지 않으면 default package로 인식하며 개발자가 명시한 package대로 인식되게 됩니다. (단 같은 파일에 있는 여러 개의 클래스는 모두 그 파일에서 지정한 패키지로 인식합니다.)

 

하지만 개발적으로도 디렉터리 구조를 일치시키는 것은 파일을 찾거나, 협업함에 있어서도 중유하다고 생각하며

그리고 우리의 IDE에서는 디렉토리가 다른것을 용서하지 않습니다. 끊임없는 경고를 보기싫다면..!

 

참고할 페이지 : https://acaroom.net/ko/blog/youngdeok/%EC%97%B0%EC%9E%AC-%EC%BD%94%ED%8B%80%EB%A6%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%BD%94%ED%8B%80%EB%A6%B0-%ED%8C%A8%ED%82%A4%EC%A7%80

 

5. 가시성

- public , private ,protected ,internal

코틀린은 자바와는 명칭은 같지만 조금 다른 접근 제어자를 가집니다.

 

접근제어자  설명
public  어디에서나 접근 가능, 별도 명시가 없다면 디폴트
private 자신이 정리된 클래스 안에서만 볼 수 있습니다.
protected 클래스 자신과 자신을 상속받은 클래스에서 사용가능
ex) 메인에서 해당 클래스를 선언하여 호출 불가능.
internal  프로젝트의 모듈 안에서 누구나 접근이 가능합니다.

추가 특이사항이 있다면 자바처럼 package 단위로 공개하는 제어자 (default)가 없습니다.

 

6. 함수

- 선언 방법

패키지 수준이나 클래스, 객체 내부에 정의할 수 있으며, fun이라는 명령어 사용.

로컬함수, 오버라이드, 확장함수 등이 있지만 이 부분은 다른 글을 통해서 좀 자세히 작성할 예정이라 넘어가겠습니다.

 

7. NULL

- 널이 될 수 있는 타입과, 될 수 없는 타입의 구분

잠깐 앞에서 언급했드시 변수 타입 선언부분에서 ? 유무에 따라 null을 허용, 불허용 이 결정이 됩니다.

또한 null을 허용시킨 변수를 허용하지 않은 변수에 대입하는 경우, 반드시 null 체크를 하게되는데, 다음과 같이 간단한 방식으로 가능하다.

val s : String = "~Somethins"
val l = s?.length

해당부분은 매우 간단한 예제이지만, 만약 맵에서 꺼내서 null을 체크하고 다시 꺼내고..... 이런 과정을 반복한다 해도 한줄로 끝낼 수 있는 장점이 있다. ( 중간에 Exception을 던질수도 있다.), 또한 Optional.getOrElse()에서 제공하는 엘비스 연산자도 지원한다. (null 대신 다른 값을 추가하는 로직이 가능하다.)

 

8. 제어 구조 구문

 

- if 문

기본적으로 자바랑 비슷한 문법을 가지고 있습니다. 다만 변수에 직접 if / else를 사용하여 대입할 수 있습니다. 

block으로 되어있는경우, 맨 마지막 값을 return 값으로 사용합니다.

    val a : Int = 10;
    val b : Int = 5;

    val s = if ( a > b){
        val tmp = a/b;
        tmp+100
    }
    else{
        0
    }
    println(s)
    -------------------------------------
    result
    102

- switch -> when

switch 문이 많이 간결해 졌습니다. (자바 신버전에서도 간결해진것 같던데) 우선 break를 사용하지 않아도 되는 간결함이 편하게 다가옵니다. 내부에서 다른곳에서 사용한 boolean타입 변수등을 사용할 수도 있습니다.

    val s = "test"
    val str = when(s){
        "test1" -> "test1";
        "test2" -> "test2";
        else -> "Default"
    }
    println(str)
    ---------------------------------
    result
    Default

- loop

포문의 변화는 거의 없습니다. 대신 내부적으로 labels를 통해 중첩된 for문을 간단하게 끝내거나 할 수 있습니다.

    for(i in 0 until  10 step 2){
        println(i)
    }

    for(i in 0.until(10).step(2)) println(i)
    ------------------------------------------
    0
    2
    4
    6
    8

 

 

8. 스마트 캐스트

-  자바에서 instanceof 연산자를 사용하여 객체의 자료형을 하고,다시 변환하는 과정을 거치는 두번의 작업이 진행됩니다. 코틀린은 이 과정이 좀 더 단순화 되었습니다.

동일하게 when 구조에서도 is를 통하여 스마트 캐스트가 가능합니다.

val tt : Any = "String"

val len : Int = if(tt is String){
    tt.length
}else{
    0
}

 

9. 동등성 , 동일성

자바에서 == 의 경우 객체는 동일성, 원시타입은 동등성을 계산하게 됩니다.

코틀린에서는 === 는 동일성, == (equals 호출)는 동등성을 검사하게 됩니다. 

728x90

'kotlin' 카테고리의 다른 글

Kotlin 시작하기  (0) 2020.05.29
Comments