본문 바로가기

Kotlin

(66)
Android Studio: CreateProcess error=206, The filename or extension is too long 해결 방법 : Win + R 에서 "resmon" 사용중인 cpu 목록에서 java.exe 프로세스를 종료해주고 다시 빌드하니 동작한다. 파일 이름이 길어서 발생하는 오류인 건 알겠는데 왜 컴퓨터를 재부팅하거나 프로세스를 종료시키면 정상적으로 돌아가는 지 모르겠다. 구글링했을 때 가장 많이 나오던 해결 방법은 말그대로 파일 이름이 길기 때문에 C드라이브/User/AndroidStudioProject ... 이런 식의 경로를 D나 E드라이브로 옮겨주어 파일명을 줄이는 방법이었지만 괜히 git 연동 잘못될까봐 폴더 경로 바꾸기는 시도해보지 않았다. 그래도 컴퓨터 재부팅보다는 나은 방법이라서 다행 ㅠㅠ * clean build나 cache 삭제도 아무 소용없었다. ** 참고로 이 오류 말고도 가끔 해당 디렉토..
Kotlin 클래스 위임 코틀린에서 클래스는 기본적으로 final이다. (상속할 수 없다는 뜻) 따라서 상속하고 싶은 클래스는 명시적으로 open 키워드를 써줘야 한다. 하지만 상속할 수 없는 클래스에 기능을 추가하거나 수정, 활용하고 싶은 경우 위임을 사용하면 좋다. "decorate pattern" 기반 클래스를 property로 가지고 변경이나 추가를 원하는 기능을 재정의한다. "by" 신규, 변경되는 값 외의 나머지를 기반 객체로 연결하는 작업을 컴파일러가 해준다.
Kotlin 스코프 함수 object itself call chain에 속할 수 있다. / return문에도 속할 수 있다. .also{ } .apply{ } .also{ } lambda value의 값을 지정하는 데에 쓸 수 있다. 그 안에서 chain operation으로 쓸 수 있다. val numbers = mutableListOf("one", "two", "three") val countEndsWithE = numbers.run { add("four") add("five") count { it.endsWith("e") } } apply context object : this return : object itself 리턴이 필요없고 수신 객체 자신을 반환하는 경우 사용한다. ex) 객체 초기화 val adam = Pers..
Kotlin Delegated Property 프로퍼티 필드에 접근하는 로직을 다른 객체에게 맡기는 것. 즉, setter와 getter를 가진 객체를 만드는 것
Kotlin field 뜬금없이 field라는 키워드가 등장해서 뭐지? 했다. 원래 자바에서는,, 필드 = 클래스 내 멤버 변수 프로퍼티(속성) = field + getter + setter 하지만 코틀린에서는,, 필드(멤버 변수) = 프로퍼티 왜냐하면 클래스를 생성하면 getter와 setter가 자동으로 생성되기 때문이다. 즉, field는 프로퍼티의 실제 값을 저장하는 변수를 칭하는 키워드 setter 와 getter 코드이다. 아마 이 부분이 코틀린에서는 자동으로 생성되는 듯 set(value){ field = value } get() = field
Kotlin 지연 초기화 lateinit / by lazy 늦은 초기화를 하는 이유 : 변수를 꼭 사용하지 않을 경우 메모리 낭비 lateinit과 by lazy의 차이 lateinit var getter/setter 정의 x 초기화 꼭 하고 사용해야함 직접적 프로퍼티 by lazy val (생성 후 값을 변경 할 수 없다.) 선언시 초기화 코드 선언된 프로퍼티를 위임하는 것 필드에 최초 접근했을 때만 값을 초기화 "지연 초기화" by lazy처럼 위임하지 않지 않는 방법도 있다. class LazyProperty(val initializer: () -> Int) { var age:Int ?= null val lazy: Int get() { if(age == null){ age = initializer() } return age!! } }
Kotlin map flatmap .flatMap() 각 요소에 대해 map을 수행한 후 결과를 새로운 배열로 평평하게 펴준다. 즉, iterable을 평평하게 펴준다는 뜻 map처럼 결국은 배열을 리턴한다. 대상 배열의 요소가 3개라면 flatMap은 내부적으로 3번 호출된다. map은 무조건 1대1 매핑이지만 flatMap은 1대1 뿐만 아니라 1대다 매핑이 가능하다. flatmap에 넣어주는 값은 iterable한(반복 가능한) 값이어야 한다.
Kotlin fold reduce Collection내의 데이터를 모두 모으는(accumulate) 역할 reduce는 초기값이 없이 첫번째 요소부터 시작하고, fold는 초기값을 지정할 수 있다. 빈 Collection에서는 fold는 정상출력이 되지만 reduce는 에러가 발생한다. (초기값이 없어서일듯)