본문 바로가기

Kotlin9

kotlin 라이브러리의 성능 우위에 있는 것들 정리 같은 기능을 하지만, 성능이 더 빠른 것들을 기록한다. 굵은 글씨가 더 빠름 if ~ if else ~ else when substring(intrange) substring(startIndex, endIndex) String + String StringBuilder().append(String).append(String).toString() 2022. 3. 31.
message 통신으로 문자열 데이터를 주고 받기 로봇 상위제어기가 n개 실행되는 케이스가 발생해 제어기 간 문자열 데이터를 주고 받을 수 있는 메세지 통신 기능을 만든 적이 있다. 그걸 조금 다듬어 V2.0으로 개선했는데 해당 부분을 간략하게 기록한다. 먼저 구조는 다음과 같다. 1. 컨트롤러 - 메세지를 보내는 기능(제일 많이 개선됨) - 요청 명령을 구분하여 정의된 함수를 찾아(generic) 실행해주는 기능 2. 요청 명령 구분자 - 보내는 요청의 종류를 정해놓은 기능 - 중복 요청을 막아야하는 리스트 관리 - 그 외 구분이 필요한 그룹을 생성해서 관리하기 용이하도록 구조 1. 컨트롤러(많은 부분은 생략했지만...) @Suppress("unused", "UNUSED_PARAMETER", "RedundantSuspendModifier") class.. 2021. 11. 12.
[Kotlin] enum값을 순차적으로 이동(앞,뒤)하여 가져올 수 있는 코드 enum값을 메뉴의 flow에 따라 배치하거나 enum에 parameter를 주고 다른 용도로 활용할 경우 다음 값, 이전 값을 가져올 필요가 있을 때가 발생한다. 그 경우 활용할 수 있는 코드를 공개한다. 확장함수로 Enum.함수명 으로 사용하면 된다. 현재 값이 enum의 마지막인데 next()를 콜 할경우 첫번째 값으로 순회하여 리턴한다. 마찬가지로 첫번째 값인데 previous()를 호출할 경우 마지막 값으로 순회하여 리턴한다. inline fun T.next(): T { val values = enumValues() val nextOrdinal = (ordinal + 1) % values.size return values[nextOrdinal] } inline fun T.previous(): T.. 2021. 4. 19.
LoggerFactory 함수에 getLogger() 사용 클래스 이름은 설정하기 쉬운데 함수에만 거는 방법은? fun aa() { val logger = LoggerFactory.getLogger(::aa.javaClass) } 요렇게 쓴다. 함수로 걸림!! 2020. 1. 7.
클립보드 문자열 붙여넣기 with(copy){ setOnMouseClicked { val clipboard = Toolkit.getDefaultToolkit().systemClipboard val dataFlavor = DataFlavor.stringFlavor if(clipboard.isDataFlavorAvailable(dataFlavor).not()) return@setOnMouseClicked val li = clipboard.getData(dataFlavor).toString().split("-") if(li.size != 7) return@setOnMouseClicked if((li[0].length == 5 && li[6].length == 4).not()) return@setOnMouseClicked } } 이런 .. 2019. 12. 12.
kotlin 압축과 압축해제(zip, unzip, tar, unTar, gzip, unGzip, tarGzip, unTarGzip) 나중에 보면 까먹는다. 미리 기록해 놓자. Upzip fun unZip(zipFilePath: String, targetPath: String) { ZipFile(zipFilePath).use { zip -> zip.entries().asSequence().forEach { entry -> if(entry.isDirectory){ File(targetPath, entry.name).mkdirs() }else{ zip.getInputStream(entry).use { input -> File(targetPath, entry.name).outputStream().use { output -> input.copyTo(output) } } } } } } Zip은 고생을 좀 했다. 인터넷에 있는 소스들을 기반으로 .. 2019. 11. 12.
HEX와 Base64 암호화의 차이 코드를 보다보니 두 가지 방식에 대한 암호화가 존재하더라. 무슨 차이인가 싶어 알아보았다. 우선, 두 가지 모두 암호화의 의미보다는 Byte에 대한 인코딩 개념으로 많이 사용한다고 한다. 즉, 여러 시스템에서의 다양한 문자 포맷에 대응하기 위해 공통 개념으로 사용한다는 의미. 물론 암호화의 의미가 없진 않겠지. 두가지 차이를 기술하기 전에 우선 HEX는 Base16이라고 해도 무방하다. HEX는 16진수로 표현하고 Base64는 64진수로 표현한다. 찾으면서 살펴봤을 때는 암호화에 대한 안전 레벨은 크게 다르진 않은 것 같다. 그래도 64쪽이 낫지 않을까. 두가지의 또다른 차이는 길이이다. HEX는 1바이트(한글자)를 2바이트 16진수로 표현한다. Base64는 3바이트(세글자)를 4바이트 64진수로 표.. 2019. 7. 23.
return label(block) 코틀린의 모든 블록은 라벨 설정이 가능하다. 그래서 return할 때 반환할 블록을 임의로 설정하여 여러가지 효과를 나타낼 수 있다. case 1) 일반적인 return. 3을 만나면 forEach를 종료한다. fun foo() { listOf(1, 2, 3, 4, 5).forEach { if (it == 3) return // non-local return directly to the caller of foo() print(it) } println("this point is unreachable") } 결과값 12this point is unreachable case 2) forEach에 람다를 적용한다. 블록에 라벨을 설정하여 해당 블록만 반환하도록 변경. 3을 제외하고 다 출력 fun foo() {.. 2019. 5. 23.
유용한 함수 let, apply, run, with let : 호출하는 객체를 이어지는 블록의 인자로 넘기고 블록의 실행 결과를 반환(인자가 한 개 일 경우 it으로 대체 가능) class A { fun get() { println("get A") } } A?.let { it.get()// "get A" } apply : 호출하는 객체를 이어지는 블록의 리시버로 전달하고 객체 자체를 반환 class A { var a : Int var b : Int var c : Int fun setA(n : Int) { a = n } fun setB(n : Int) { b = n } fun setC(n : Int) { c = n } } val result = A.apply { setA(1) setB(2) setC(3) } // 아래처럼 쓰는 것을 위 apply로 간단하게.. 2019. 5. 21.