Java Stack/Kotlin
[Kotlin] stream API / 시퀀스(Sequence)
[Kotlin] stream API / 시퀀스(Sequence)
2017.12.04기본 filter, map 등은 인라인 함수로 정의되어 있어 알아서 인라이닝되므로 성능 신경쓰지말고 그냥 사용하면 된다. 연쇄해서 사용하는 경우 연산의 순서가 성능에 영향을 줄 수 있기 때문에 고려해야 한다. 보통 ``kt filter()``를 먼저 적용해 추리는게 도움이 되고, 메서드 체이닝 시 앞쪽에서 부터 적용되기 때문에 ``kt filter()``를 먼저 써주는게 좋다. ...고 하는데, 지연평가 기본적으로는 안되는게 맞다. collection에서 그냥 map, filter 사용 시 모든 원소에 대해 적용하고 다음으로 넘기는 방식. asSequence() 로 시퀀스 변경 후 map, filter 사용 시 lazy evaluation 됨. lazy eval && take, takeLast가 지원되는..
[Kotlin] 람다(lambda), 변수 포획과 클로저, 멤버 참조
[Kotlin] 람다(lambda), 변수 포획과 클로저, 멤버 참조
2017.12.04lambda ```kt { x: Int, y: Int -> x + y } ``` 코틀린 람다는 자바 람다와 달리 항상 중괄호 사이에 위치한다. 반면 메서드 참조는 중괄호 없이 써야 한다. 코틀린 람다 호출은 실행 시점에 아무런 부가 비용이 들지 않으며 기본 구성 요소와 비슷한 성능을 내기 때문에 적절하게 사용하는 것이 권장된다. 코틀린은 파이썬처럼 컬렉션의 최댓값을 찾거나 하는 기능이 기본적으로 구현되어 있기 때문에, 일단 한번 찾아보고 없으면 구현한다. 이런 컬렉션 라이브러리들이 보통 함수형으로 되어 있기 때문에 적용할 함수를 넘겨야 하는데, 이런 경우 람다를 사용하는 것이 좋다. ```kt >>> val people = listOf(Person("A", 23), Person("B", 25)) >>> ..
[Kotlin] 싱글턴 object(static) : 객체 선언, 동반 객체, 객체 식 / 익명, 무명
[Kotlin] 싱글턴 object(static) : 객체 선언, 동반 객체, 객체 식 / 익명, 무명
2017.12.03클래스를 정의하면서 동시에 인스턴스를 생성한다.!! 코틀린에는 ``java static``이 없고, 대신 이를 최상위 함수로 처리한다. 그러나 최상위 함수는 말 그대로 최상위에 존재하는 함수이기 때문에 어떤 클래스의 ``kt private``에는 당연히 접근할 수 없어 클래스 내부에 선언된 ``java static``이 클래스의 다른 멤버와 상호 작용하는 경우를 커버할 수 없다. 이렇게, ``java static``을 최상위 함수로 대체할 수 없을 때 ``kt object``를 고려한다. * ``kt object``를 사용하면 java로 변환시 ``java static``으로 컴파일된다. 1. 객체 선언(object declaration) : 싱글턴 객체 선언은 클래스 선언과 그 클래스에 속한 단일 인스..
[Kotlin] delegate 키워드 : by
[Kotlin] delegate 키워드 : by
2017.12.02클래스 delegation (컴포지션, composition) 상속을 허용하지 않는 클래스에 새로운 동작을 추가해야 할 때(Wrapping) 또는 메소드의 동작을 변경하고 싶을 때 위임을 사용하게 되는데 단점이 준비 코드가 너무 많이 필요하다는 점이다. 아래와 같이 `` innerList``를 Wrapping하게 되면 위와 같이 굳이 재정의하고 싶지 않은, 단순히 원래 클래스로 전달하고 싶은 코드도 모두 재정의해야 하기 때문에 상당히 난잡해진다. ```kt class DelegatingCollection0( private val innerList: ArrayList = arrayListOf() ) : Collection { override val size: Int get() = innerList.size..
[Kotlin/Java] data class
[Kotlin/Java] data class
2017.12.02Object / Any 상속 자바 플랫폼에서 모든 클래스는 ``java Object``(코틀린의 경우는 ``kt Any``) 클래스를 상속하고, 이 최상위 클래스가 ``kt equals()/hashCode()/toString()``를 가지고 있기 때문에 이를 상속하게 된다. equals() / hashCode() [Coding/Kotlin Java] - [Effective Java] 3장 모든 객체의 공통 메서드 코틀린에서 ``kt x.equals(y)``는 ``kt x == y``와 같다. (내부적으로 equals를 호출한다.) 참조 비교를 위해서는 ``kt x === y`` 를 사용한다. Data Classes 코틀린에서는 ``kt data`` 키워드를 붙여주면 equals() / hashCode()..
[Kotlin] 프로퍼티, 커스텀 접근자, 지연 초기화
[Kotlin] 프로퍼티, 커스텀 접근자, 지연 초기화
2017.12.02프로퍼티 = 필드 + 접근자 클래스 내부의 변수 선언은 자바에서는 필드 선언을 의미하지만 코틀린에서는 프로퍼티 선언을 의미한다. 즉, 필드 뿐만 아니라 접근자 메서드도 알아서 생성해준다. ```kt class Person( val name: String, // val은 읽기 전용 프로퍼티. private 필드와 getter. var isMarried: Boolean // private 필드와 getter, setter. ) /* 코틀린에서 호출할 때 (자동으로 getter, setter 호출로 변환해준다) */ person.name person.isMarried = true /* 자바에서 호출할 때 */ person.getName() person.isMarried() // boolean 프로퍼티 gett..
[Kotlin] Class, 생성자
[Kotlin] Class, 생성자
2017.12.01``java extends / implements`` 구분 없이 그냥 ``kt :``붙이고 적는데, 클래스 상속인 경우 super class의 생성자를 호출해야 하므로 ``kt ()``를 붙여주어야 하고 인터페이스 구현인 경우 생성자가 없기 때문에 붙이지 않아야 하므로 이를 보면 둘을 구분할 수 있다. 주 생성자(primary constructor) 주 생성자는 클래스 이름 뒤에 오는 `` ()``로 둘러싸인 코드를 의미한다. 주 생성자의 파라미터는 1. 초기화 블록, 2. 프로퍼티 초기화 식, 3. 주 생성자 자체 에서만 접근할 수 있다. 1. 정석대로 초기화하면 이런 식이다. 생성자를 정의할 때는 ``kt contsructor`` 키워드를 사용한다. 주 생성자의 body(초기화 블록) 지정은 ``kt..
[Kotlin] enum / when / sealed
[Kotlin] enum / when / sealed
2017.12.01enum 자바처럼 ``kt enum`` 클래스 안에 프로퍼티나 메소드를 정의할 수 있다. 메소드를 정의하는 경우 상수와 메소드 사이에 반드시 `` ;``를 적어주어야 한다. ```kt enum class Color(val r: Int, val g: Int, val b: Int) { RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255), INDIGO(75, 0, 130), VIOLET(238, 130, 238); fun rgb() = (r * 256 + g) * 256 + b } >>> Color.RED.ordinal // index 0 >>> Color.RED.r 255 ``` enum은 cla..
[Kotlin/Java] Inner Class / Nested Class
[Kotlin/Java] Inner Class / Nested Class
2017.12.01Kotlin 중첩 클래스 / 내부 클래스아무 변경자를 붙이지 않고 클래스의 내부에 다시 정의된 클래스는 자바의 ``java static`` 중첩 클래스와 동일하다.내부 클래스로 변경해 바깥쪽 클래스에 대한 참조를 포함하도록 하려면 ``kt inner`` 변경자를 붙여준다.내부 클래스에서 바깥쪽 클래스의 인스턴스에 접근하기 위해서는 ``kt this@``를 붙여주어야 한다.```ktclass Outer { inner class Inner { fun getOuterReference() : Outer = this@Outer }}``` Java 중첩 클래스 / 내부 클래스최상위에 정의하는 class에 ``java static``을 붙이면 에러가 발생하는데, 이는 ``java static`` class로 만들 수..
[Regex] Kotlin
[Regex] Kotlin
2017.12.01Kotlin정규식 간단히 만들기```ktprintln("12.345-6.A".split("""\.|-""".toRegex()))```그냥 ``kt "``를 하나만 적으면 escape를 위해 ``kt \\``를 사용해야 하기 때문에, 정규식을 사용하는 경우 ``kt """``를 사용하는 편이 좋다. 사실 이런 경우 굳이 정규식 쓰지 않아도 된다.```ktprintln("12.345-6.A".split(".", "-"))``` 간단한 정규식 예제```ktfun parsePath(path: String) { val regex = """(.+)/(.+)\.(.+)""".toRegex() val matchResult = regex.matchEntire(path) if (matchResult != null) { v..
[Kotlin] 확장 함수 / 확장 프로퍼티, 최상위 함수 / 최상위 프로퍼티
[Kotlin] 확장 함수 / 확장 프로퍼티, 최상위 함수 / 최상위 프로퍼티
2017.12.01확장 함수 / 확장 프로퍼티 Note ) 코틀린의 최상위 객체는 ``kt Any``이기 때문에, 여기에 추가하면 모든 객체에 확장 함수를 추가할 수 있다. 확장 함수를 사용하면 좋은 경우는 String 같은 기본 타입을 확장하고 싶을 때. e.g., String.appendSignature (public으로 쓰는 경우도 많고, 시그니처를 사용하는 부분이 제한되어 있다면 private으로 만들면 아주 깔끔) 내가 만든 클래스라 마음대로 메서드 정의가 가능한 상황일지라도, 클래스에 포함하자니 무언가 애매한 기능일 때. (역시 보통은 사용처가 제한되는 경우가 많아서 private) 확장 함수를 사용해도 실행 시점에 부가 비용이 들지 않는다. 확장 함수가 클래스를 노출시키면 안되므로, 확장 함수의 가시성은 클래..
[Kotlin] Tip2 + 문자열 템플릿
[Kotlin] Tip2 + 문자열 템플릿
2017.11.30가변 인수가변 인수를 받을 때는 앞에 ``kt vararg`` 키워드를 붙인다.```ktfun listOf(vararg values: T): List { ... }``` 이미 배열에 들어있는 원소를 가변 길이 인자로 넘길 때는 spread 연산자 ``kt *``를 붙인다.```ktval list = listOf("args: ", *args)```자바 코드로 변환해보면 호출하는 측에서 `` SpreadBuilder``라는 객체에 ``kt *``로 지정된 인자를 모두 풀어서 추가하고, 이를 배열로 만들어 넘기게 된다. infix(중위) 함수 호출 구문과 딕셔너리( 맵 )함수 선언 시에 ``kt infix``를 붙이면 ``kt 3.mul(10)``을 ``kt 3 mul 10``으로 쓸 수 있도록 하는 건데, ..