Java Stack
[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``으로 쓸 수 있도록 하는 건데, ..
[Kotlin] Tip
[Kotlin] Tip
2017.11.28Kotlin. Java 대비 장점이 무엇인가? Java도 버전 올라가면서 """ string, when expression, utility stream API 등 코틀린을 쓰면서 느꼈던 장점들이 보완되고 있다. 그렇다면 코틀린을 써야 할 이유가 있는가? 코틀린과 Java의 가장 큰 차이는, 자바는 모든 타입이 Nullable이라는 명확한 한계를 가지고 있다는 점이다. Optional이 있지만 제한적이다. 컴파일 타임에 아예 널이 될 수 없음을 강제하는 코틀린의 컨셉과는 확실한 수준 차이가 있다. Coroutine이라는 더 나은 동시성 처리 방법을 지원한다. java도 많이 편해졌지만, 결국 Mono, Flux. reactive까지다. 마지막으로 Java가 많이 좋아졌다고는 하지만 아직도 default a..
외장 메모리 쓰기 금지
외장 메모리 쓰기 금지
2017.05.20킷캣(4.4)에서는 ES파일 탐색기 등으로 외장 메모리에 파일을 쓰는 것이 기본적으로 불가능하도록 되어있다. 외장 메모리에 파일을 쓰기 위해서는 다음 세 가지 방법을 사용할 수 있다.루팅기본 내장 파일 매니저/android/data/{app package name} #3각 어플리케이션은 외장 메모리의 자신의 패키지 폴더 /android/data/{app package name} 에 RW권한을 가지고 있어 파일을 쓸 수 있다. {app package name}은 com.bittorrent.client 같은 형식의 package name을 말한다.단순히 폴더만 만들어 주면 안되는 경우가 있어, 내장 메모리의 /android/data/{app package name} 를 그대로 복사해 외장 메모리에 복사해주면..
JVM 관련
JVM 관련
2017.05.05JVM 전체 구조 Class Loader 런타임(최초 호출 시점)에 .class(바이트코드) 읽어 class load Execution Engine Interpreter, JIT 둘 다 사용 Memory Layout PC register JVM level에서 현재 실행하고 있는 instruction의 주소 보관. CPU level의 PC와 기능은 같지만 추상화 수준이 다름. thread 별로 각각 가지고 있음. (CPU register가 thread local 한 것 처럼 당연히) Method Area Memory layout 상 PermGen, MetaSpace 안에 속하는 일부 영역. OS의 text segment와 유사함. (결국 실행 대상 code, instructions를 보관하는 영역이라는 뜻..
[Java] Stream API 노트
[Java] Stream API 노트
2017.03.09Stream API [Languages & Frameworks/Kotlin Java] - [Effective Java] 7장 람다와 스트림 생성, 중개 연산, 최종 연산까지 정리가 잘 되어 있으니 넘기면서 볼 것. 10 subtle mistakes when using the streams api http://iloveulhj.github.io/posts/java/java-stream-api.html 항상 stream이 나이스한건 아니다. for가 더 나이스한 경우가 분명히 존재한다. 구구절절 적기는 좀 애매한데... 아무튼 코드 짜다 보면 느껴질 때가 있음. stream API의 최종 연산 1. 요소의 출력 : forEach(), forEachOrdered() {병렬연산으로 순서 틀어질 때} 2. 요소의..
[Java] lambda 기본 개념
[Java] lambda 기본 개념
2017.02.07Lambda ```java // 기본 형식. 2줄 이상일 때 ( parameters ) -> { expression body } // 별다른 내용 없이 바로 return할 수 있는 경우 ( parameters ) -> expression ``` Lambda를 활용한 Thread 보통 자바에서 Thread는 다음과 같이 Thread로 사용할 class에 Runnable interface를 implements하여 Thread객체에 파라미터로 전달하여 사용한다. ```java class TestThread implements Runnable { @Override public void run() { System.out.println("newTHread"); } } ``` ```java Thread t = new..