5월, 2019의 게시물 표시

코틀린 (Kotlin) 확장 함수와 확장 프로퍼티

코틀린 확장 함수 코틀린는 기존 클래스에 메소드를 추가할 수 있습니다. 이를 확장 함수라고 합니다. 확장 함수는 static 메소드 입니다. 자바의 String 클래스에 lastChar() 라는 메소드를 추가해서 "zerog".lastChar() 처럼 기존 클래스의 메소드인것처럼 사용할 수 있습니다. fun String . lastChar ():Char = this. get ( this . length - 1) //this 생략 가능 fun String . lastChar ():Char = get ( length - 1) String 자바 클래스에는 lastChar() 라는 메소드가 없지만, 확장 함수로 생성해서 String 클래스의 메소드인것처럼 사용합니다. String . lastChar () 중 String 을 수신 객체 타입 (receiver type) 이라고 합니다. lastChar ():Char 중 lastChar () 는 확장 함수의 이름 이고 :Char 는 반환 타입 입니다. this. get (this. length - 1) 중 this 를 수신 객체 (receiver object) 라고 합니다. 확장 함수의 블럭 안에서는 this.get(this.length - 1) 처럼 원래 갖고 있던 메소드를 호출할 수도 있으며 this 는 생략이 가능 합니다. 단, 클래스의 메소드 중 private , protected 접근자인 경우 호출할 수 없습니다 . 확장 함수 이름은 짧게 하는 것이 좋습니다. 제네릭을 이용하면 좀 더 유연한 확장 함수가 됩니다. fun < T > Collection< T >. joinToString (separator: String = "," ,                                    prefix: String = "(" ,                          

코틀린 (Kotlin) 루프와 예외처리 정리

코틀린 루프문 코틀린의 루프문에는 while, for 가 있습니다 while은 자바와 비슷하기때문에 패스하기로하고 for문에 대해 알아보겠습니다. 코틀린의 for 문에는 in 이 사용됩니다. i in N..M : N 이상 M 이하 범위 지정 i in 0..10 step N : N 만큼 올리거나 내림 i in N downTo M : N부터 M까지 역방향으로 내림 i in N until M : N부터 M 미만까지 for (i in 1..5) {  //1,2,3,4,5  ... } for (i in 5 downTo 1 step 2) { //5,3,1  ... } val list = listOf ("1", "2", "3") for (i in 0 until list.size) {   //"1","2","3"  ... } for (i in 0 .. (list.size-1)) {    //0,1,2  ... } map과 for 반복문 맵에 대한 루프는 for in 으로 간단하게 구현이 가능합니다. 맵에 put 할때는 map[key] = value 로 자바보다 간단하게 사용할 수 있습니다. for in 으로 key, value 를 (key, value)처럼 한번에 뽑아낼 수 있습니다. map 을 key, value로 가져오는것을 구조분해 라고 합니다. val map = TreeMap () for (m in 'A'..'F') {     val b = Integer.toBinaryString(m.toInt())     map[m] = b //map.put(m, b) 과 동일 } //key value 를 뽑을수 있음 for ( (key, value) in map ) { //구조분해 사용      "${key}=${va

코틀린 (Kotlin) 조건문과 enum, when, 캐스팅 정리

코틀린 enum 코틀린 enum 은 자바의 enum 처럼 사용 가능합니다. 코틀린 enum 은 enum class 입니다. 그리고 프로퍼티와 함수를 선언할 수 있습니다. enum class Color( val r: Int, val g: Int, val b: Int) { //상수 프로퍼티 정의     RED (255,0,0),          //상수 생성시 프로퍼티 값 지정     ORANGE (111,111,111),     GREEN (222,222,222),     BLUE (333,333,333) ; //<- 세미콜린 필수. 구분 역할     fun rgb () = (r * 256 + g) * 256 + b //함수 정의 } Color.BLUE.rgb () //rgb 함수호출 위 코드처럼 상수 프로퍼티를 선언하고 함수를 호출할 수 있습니다. 기억해야될 점은 상수와 함수 사이에 세미콜론(;) 이 꼭 들어가야된다는 것입니다. 코틀린 when 조건문 자바의 switch 문을 코틀린에서는 when 이 대신할 수 있습니다. fun getColorStr (color: Color) =  when (color) {     Color. RED -> "red"     Color. ORANGE -> "orange"     Color. BLUE , Color. GREEN -> "blue and green" // or 임     else -> "unknown" } when 은 switch 처럼 break 가 필요없습니다. 여러 조건을 매칭하고 싶은경우 콤마(,) 으로 구분할 수 있습니다. else 로 조건에 맞지 않을때 행동을 정의할 수 있습니다. fun getColorMixStr (color1: Color, color2 : Color) =     when ( setOf (color1, color

코틀린 (Kotlin) 패키지 정리

코틀린 패키지 코틀린의 패키지 구조는 자바와 비슷합니다. 자바와 동일하게 import 로 가져올 수 있으며 클래스와 함수까지 임포트가 가능합니다. 코틀린도 package 로 패키지 경로를 선언합니다. 그리고 클래스 없이 패키지 레벨의 함수도 선언할 수 있습니다. package com.zerogdev.mykotlin.basic.other /**  * 패키지 레벨 함수  */ fun createRandomRectangle () : Rectangle {     val random = Random()     return Rectangle(random.nextInt(), random.nextInt()) } class Test1 { } class Test2 { } 아래 코드는 createRandomRectangle() 의 함수를 임포트했습니다. 그리고 Test1, Test2 클래스를 임포트했습니다. 각 패키지별 클래스와 함수를 따로 임포트되지만, * 을 사용해서 해당 파일 모두를 임포트 할 수 있습니다. package com.zerogdev.mykotlin.basic import com.zerogdev.mykotlin.basic.other.createRandomRectangle import com.zerogdev.mykotlin.basic.other.Test1 import com.zerogdev.mykotlin.basic.other.Test2 import com.zerogdev.mykotlin.basic.other.* //* 사용가능 fun onCreate(savedInstanceState: Bundle?) {     //createRandomRectangle()는 다른 패키지에 있는 함수     createRandomRectangle ().isSquare     val testClass1 = Test1 ()     val testClass2 = Test2 () } 코틀린에서는 자바

코틀린 (Kotlin) 클래스와 프로퍼티 정리

코틀린의 클래스 사용 코틀린은 public 이 기본으로 생략 가능 합니다. 코틀린의 클래스 선언은 자바의 멤버변수 선언없이 아래와 같이 사용합니다. class Person ( val name : String, var isCareer : Boolean) 위 코드는 자바에서 Person 클래스안에 String name과 boolean isCareer 멤버변수가 있는것과 같습니다. 프로퍼티 선언 코틀린에서는 자바의 private String name 을  프로퍼티 라고 합니다. class Person (     val name : String,        //읽기 전용 val     var isCareer : Boolean //쓸수있는 var     ) val 프로퍼티 읽기 전용 프로퍼티 private name: String 프로퍼티 생성 public getName() : String 함수 생성 var 프로퍼티 쓰기 가능 프로퍼티 private isCareer: Boolean 프로퍼티 생성 public isCareer() 함수 생성 public setCareer() 함수 생성 코틀린에서 클래스만 생성하면 멤버변수와 setter/getter 가 자동으로 생성되어 아래처럼 바로 사용할 수 있습니다. val person = Person ("zerogdev", true) person. name                 //getter() 사용(자바-> person.getName() ) person. isCareer = false    //setter() 사용(자바-> person.setCareer(false) ) 자바 코드에 setter(), getter() 가 있는경우에는 var 처럼 사용되고 getter() 만 존재하는경우 val 처럼 사용합니다. 프로퍼티 - val 커스텀 접근자 클래스의 프로퍼티는 위에서 본것처럼 기본으로 생성되는 getter/sette

코틀린 (Kotlin) 변수와 문자열 정리

코틀린의 변수 사용 코틀린은 변수 지정시 타입을 생략할 수 있습니다. val text = "hello~" val doubleValue = 2.1e6 초기화를 하지 않을 경우에는 컴파일러가 타입을 추론할 수 없기때문에 변수 선언시 타입을 명시해야 됩니다. val intValue: Int //초기화를 하지않은 경우 타입 명시 필요 intValue = 17    //나중에 초기화 변경 가능한 변수 val(value) 자바의 final 과 동일합니다. 코틀린에서는 기본적으로 val 을 사용해서 불변 변수를 사용하여 함수형 코드로 개발하는 것을 권장합니다. 한 번만 초기화가 가능하므로 아래와 같이 조건에따라 한 번만 초기화 할 수 있습니다. val text : String if (isTrue()) {     text = "true" } else {      text = "false" } var(variable) 값을 대입 후 변경가능하지만 다른 타입을 대입할 수는 없습니다. var message = "message" message = 1234 //컴파일 오류(다른 타입) message = "ok"  //정상 문자열 문자열 내에서 변수에 접근이 가능합니다. 변수 접근 : $변수명 중괄호 사용 : ${ if (조건식) value }                   중괄호 안에서 "" 사용도 가능합니다. 변수만 접근하더라도 중괄호를 사용하여 접근하는 것이 안전합니다. val message = "Hello, kotlin ${ aValue } , $ bValue ,            ${if ( aValue > bValue ) aValue else " bValue is big ( ${ bValue } ) "}"

코틀린 (Kotlin) 함수 정리

식이 본문인 함수 코틀린은 루프를 제외한 대부분의 제어구조가 식입니다. if, when, try ...와 같은 제어문이 식으로 표현될 수 있습니다. 1. return 에 식으로 대입 할 수 있다. fun max (a: Int, b: Int) : Int {       return if (a > b) a else b } 2. '=' 으로 식을 대입할 수 있습니다. fun max (a: Int, b: Int) : Int = if (a > b) a else b 3. 함수에 반환타입을 생략하면 컴파일러는 리턴 타입을 추론하여 리턴할 수 있습니다. 식이 본문이 함수만 생략가능합니다. fun max (a: Int, b: Int) = if (a > b) a else b 블록이 본문인 함수 중괄호로 둘러 쌓인 함수를 블록이 본문인 함수라고 합니다. 블록인 경우 return 으로 값을 반환해야됩니다.  fun max (a: Int, b: Int) : Int {         if (a > b) {             return a         } else {             return b         }  } 코틀린 함수 - 이름 붙인 인자 함수에 파라메터가 많은 경우 파라메터를 순서에 맞게 잘 넣었는지 혼란스러울 때가 있습니다. 그런경우 코틀린 함수에서는 파라메터 인자에 이름을 붙여 명확하게 사용할 수 있습니다. 함수(파라메터 이름 = 값, 파라메터 이름 = 값, ... ) 처럼 사용할 수 있습니다. 다만, 두번째 파라메터부터 '파라메터 이름 = 값' 을 사용했다면, 이후 뒤에 있는 파라메터들은 모두 '파라메터 이름 = 값' 을 붙여야합니다. //파라메터가 복잡합니다. fun makeText (text: String, prefix: String, postfix: String, separator: Stri