본문 바로가기
코틀린/공부

코틀린 정리

by 므시칸곰틔군 2018. 4. 4.

코틀린


너무 어렵게 생각하지 말고 기존에 사용하던 자바언어에서 조금 더 편리하게 사용하기 위해

변경된 부분이 있다. 



변수 선언.

코틀린 에서는 모든 변수는 반드시 최초(한번) 초기화가 되야 한다.


변수에 의미가 없으면(기본형이던 참조형이던 변수 생성 후 타입을 적용해야한다.) 선언 할 수 없다.


val 및 var 키워드는 형식 추론이 가능할 때만 사용할 수 있다.

그렇지 않은 경우 형식을 선언해야 한다. 형식 추론은 각 코틀린 릴리즈가 나올 때마다 개선되고 있는 것으로 보인다.


지역 변수(local variable) 이며 전역 변수(global variable)의 개념이 없다.


val 읽기 전용 변수(불변, 상수).

var 읽기 쓰기 변수(가변, 변수).


값의 변경이 불가능한 변수 생성.

val temp :(type) = 1 

val temp  = 1 //Int

val temp  = "String" //String

(처음 초기화가 되면 값의 변경이 불가능하다. 자바에서의 상수 final 과 비슷하다. value의미.)


값이 변경 가능한 변수 

var temp : (type) = 1

var temp  = 1 //Int

var temp  = "String" //String

(지정한 type 로 값을 변경할 수 있다. 다른 타입의 형변환도 가능하다. variable 의미.)


null을 가지는 변수 가능.

val temp : String? =null // 상수로써 1회에 한하여 초기화를 해야한다.

var temp : String? =null 

(변수가 null 값을 가질 수 있고 null이 아닌지 확인이 가능하다 . temp? 일경우 null 체크를 한다.)


println(temp.length) // Compilation error

println(temp?.length) // safe code // temp의 변수가 null일경우 null 반환 아니면 length 반환.



배열


val item = arrayOf("가","나","다") //스트링 타입으로 추론이 가능한 배열 변수 선언.


Array 생성자를 이용하여 배열을 생성.

val item = Array<String>(5, {i-> (i*i).toString})

val item = Array<String>(5) {i-> (i*i).toString}




for문 

 val arrayTemp = ArrayList<String>();


        arrayTemp.add("a1")

        arrayTemp.add("a12")

        arrayTemp.add("a13")

        arrayTemp.add("a14")

        arrayTemp.add("a15")


        arrayTemp.add("a16")

        arrayTemp.add("a17")

        arrayTemp.add("a21")

        arrayTemp.add("a31")

        arrayTemp.add("a41")


        arrayTemp.add("a421")

        arrayTemp.add("a431")

        arrayTemp.add("a441")

        arrayTemp.add("a451")



        //어레이 리스트를 for문으로 동작 시킬때

        for (item in arrayTemp) {

            println("Arraylist item : $item")

        }


        //기본 for 문 동작

        //1부터 100까지 1씩 증가

        //for(int i= 0 ; i <=100 ;i++) 과 같다..

        //배열의 사이즈를 넣을 경우 14이면 배열 인덱스 익셉션이 일어난다

        for (i in 0..100) {

            println("i가 증가하는 값이   = $i")

            // 0 부터 100 까지 101 개가 출력된다

        }

//

//

        // 0부터 반복하나 마지막 자리는 제외한다.지정된 사이즈에서 -1 된다

        // for(int i = 0 ; i < 100 ;i++)

        for (i in 0 until 100) {

            println("i가 증가하는 값이   = $i")

        }


        // for(int i = 0 ; i < arrayTemp.size ;i++)

        for (i in 0 until arrayTemp.size) {

            println("i가 증가하는 값이   = $i")

            println("arrayTemp가 가진 값이 = ${arrayTemp[i]}")

        }


        //0부터 시작하여 step로 지정한 간격으로 반복한다..

        //for(int  i = 0 ; i<= 10 ;i+=2)

        for (i in 0..10 step 2) {

            Log.v("bear", "iiii  = $i")

        }

        //for(int  i = 0 ; i< 10 ;i+=2)

        for (i in 0 until 10 step 2) {

            Log.v("bear", "iiii  = $i")

        }


        //10에서 시작하여 0까지 1씩 자동 감소한다.

        // 총 11개의 개수가 찍힌다

        //for(int i = 10 ; i>= 0 ; i--)

        for (i in 10 downTo 0) {

            Log.i("bear", "iiii  = $i")

        }


        //10에서 시작하여 0까지 1씩 자동 감소한다.

        // 총 11개의 개수가 찍힌다

        //for(int i = 10 ; i>= 0 ; i-=3)

        for (i in 10 downTo 0 step 3) {

            Log.i("bear", "iiii  = $i")

        }







함수


함수선언

자바는?

//리턴값 없이 함수 aaa 로 정함

void aaa(){

}

//리턴값 없이 함수 aaa 로 정하고 매개변수로 int a, int aa 를 받는다.

void aaa(int a, int aa){


}


//리턴값을 int로 정하고 함수 aaa 로 정하고 매개변수로 int a, int aa 를 받는다.

//그리고 int로 값을 내보낸다.

int aaa(int a, int aa){

return a+aa;

}


코틀린은?

// 함수라는 것을 선언하기 위해 맨처음 fun 이라고 지정하여 준다.

// 함수의 이름은 aaa 이고 매개변수가 없으며 리턴값도 없다.

fun aaa(){

}

// 둘다 같은 반환값이 없는 (void) 함수이며 Unit를 생략할 수 있다.

// 반환값이 없으면 return문도 생락할 수 있다.

fun aaa():Unit{

}


//함수 선언 후 함수이름은 bbb이며 매개변수로 Int b 값을 가지고 반환타입을 Int로 지정한다.

//리턴된 값은 Int로 함수 내부에서 계산된 값이 반환된다.

fun bbb(b : Int):Int {

return b*b

}


// 함수의 매개변수는 괄호안에서 선언되며 2개이상일 경우에는 쉼표(,)로 매개변수를 추가할 수 있다.

fun bbb(b : Int, bb: Int):Int {

return b*bb

}


***

매개변수(parameter)는 함수를 정의할 때 지정한 후 함수 내부의 코드에서 사용하는 변수를 말하며,

인자(argument)는 함수를 호출할 때 매개변수에 전달하는 값을 말한다. 그러나 엄격하게 구분하지 않고

사용하기도 한다.


fun bbb(b : Int, bb: Int):Int {

// 매개변수는 b, bb 이고 타입이 있고.

return b*b

}


var bb = bbb(2,2)

// bbb 함수 괄호안에 넣은 값이 인자 이다.

// 타입을 말할때 매개변수 인것 같고 실제 값을 넣을 때 인자 인것 같다.

***


코틀린 함수의 축약된 형태로 선언이 가능.

// 반환 타입이 없지만 =의 오른쪽에서 값의 추론이 되었기 떄문이고, 표현식의 코드를 수행하고

// 값을 반환할때 함수 몸체를 나타내는 중괄호{}를 생략할 수 있다.

fun bbb(b :Int , bb: Int) = b*bb 

fun bbb(b :Int , bb: Int) ={ b*bb }


//함수에 지명인자를 사용하여 매개변수의 기본값을 정의할수 있다.

fun bbb(b :Int = 1 , bb: Int = 1) ={ b*bb }  // 여기에 리턴된 값은 1*1이므로 1 이다.


bbb(2,2) // 일반적 함수사용 

bbb(2)   // 매개변수의 순서에 따라 b에 2가 대입되며, bb는 기본값을 가진다. 

bbb()    // 두 매개변수 모두 기본값이 0이 대입되어 기본값 1*1이된다.


bbb(b=2,bb=2) // 지명인자를 사용하여 b의 값엔 2,bb의 값에 2가 대입된다.

bbb(bb=2,b=2) // 지명인자를 사용하면 순서에 상관없이 값을 넣을 수 있다. 

bbb(b=2)        // 하나의 지명인자만 가지고 b=2가 되고 bb= 1이된다.












클래스


클래스 생성은 자바와 비슷..


class Test{


val temp:Int = 0 ;


}


클래스 생성자 만들기.

코틀린에서는 하나의 기본 생성자와 하나 이상의 보조 생성자를 지정할수 있다.


//이름과 타입이 생성자 인자와 동일한 속성을 자동으로 생성하고 초기화 한다.

class Test01(var name: String, var tel: String) {


}


//이름과 타입이 생성자 인자와 동일한 속성을 자동으로 생성하고 초기화 한다.

//기본생성자에서는 constructor 생략할수있지만

//private 같은 가시성 제한자를 사용할때는 반드시 constructor를 지정해야 한다.

class Test02 constructor(var name: String, var tel: String) {


}


//생성자 인자와 클래스 속성을 별개로 선언하는 것이므로 생성자 인제에 val 또는 var

//지정하지 않으며 클래스 속성을 클래스 몸체 내부에 지정하고 생성자 인자의 값으로

//초기화 코드를 직접 작성한다.

class Test03(name: String, tel: String) {

    var name = name

    var tel = tel

}


//init 라는 초기화 블럭으로 속성을 초기화 할 수 있다.

//객체 생성시에 자동으로 싱행되며 생성자 인자로 전달되는 속성의 값을

//검사하고 초기화 하는 코드가 필요할때 사용한다.

// type 에 값을 확인하여 4이상의 값이면 4로 고정하는 초기화 블럭이다.

class Test04(name: String, tel: String, type: Int) {


    var name: String

    var tel: String

    var type: Int


    init {

        this.name = name

        this.tel = tel

        this.type = if (type < 4) type else 4

    }

}


// 보조 생성자.

// 기본생성자와 다르게 클래스 몸체에 정의한다.

class Test05 {


    var name: String

    var tel: String


    constructor() {

        name = "No Name"

        tel = "No Tel"

    }


    constructor(name: String) {

        this.name = name

        this.tel = "No Tel"

    }


    constructor(name: String, tel: String) {

        this.name = name

        this.tel = tel

    }

}



계속 업데이트 중.