자바로 프로젝트를 진행할 때, 보통 에러 처리의 일관성과 가독성, 로깅, 디버깅, 예외 처리 유연성을 위해서 CustomException 클래스를 정의하여 자주 사용한다. 그러나 여러 이점들이 있음에도, 자바에서는 Exception의 처리 비용이 매우 비싸다는 문제가 있다. 이번 글에서는 JVM이 Exception을 처리하는 순서와 생성 비용이 비싼 이유, 마지막으로 비용 절감 방법에 대해서 알아보도록 하겠다. JVM Exception 처리 순서이 글을 참고해보면, Exception이 발생하면 다음과 같이 JVM에서 Exception을 수행한다. 예외 발생: 예외가 발생하면 JVM은 예외 객체를 생성하고, 예외를 발생시킨 메서드의 호출 스택을 추적한다.예외 객체 전파: JVM은 해당 예외를 발생시킨 메서..
Language.
Unit Java의 void와 동일하다. 함수가 유용한 것을 반환하지 않거나 리턴해줄 값이 아무것도 없으면 암시적으로 Unit을 반환한다고 말합니다. 그리고 이러한 기능은 부작용이 있는 작업을 수행할 수 있습니다. 무언가 기록/인쇄하거나 반환 값 없이 조작을 수행합니다. fun printHelloUnit(name: String?): Unit { if (name != null) println("Hello $name") else println("Hi there!") } //The Unit return type declaration is also optional. The above code is equivalent to: fun printHello(name: String?) { if (name != null)..
Kotlin Delegation으로 결합도 낮추기 Delegation Delegation은 interface의 구현이나 Property의 Accessor의 구현을 다른 객체에 위임하도록 해주는 패턴이다. Delegator -> Delegate 형태로 책임이나 처리를 넘긴다. Composition + Forwarding 이라고도 할 수 있다. Composition Composition은 상속 대신 객체를 내부 private 변수로 두어 구성요소로써 동작하게 하는 것을 의미한다. Forwarding 부모 메서드의 전달을 의미한다. 상속과 비슷하게 한 객체의 기능 일부를 다른 객체에 넘겨서 대신 수행하도록 한다. 위임을 활용하면 결합도를 낮출 수 있다. 코틀린에서는 기본적으로 클래스가 final을 붙이기 때문..
강한 참조 Strong Reference 이것은 우리가 가장 일반적으로 사용하는 참조 유형입니다. 강한 참조가 객체에 연결되어 있으면, 가비지 컬렉터는 그 객체를 회수하지 않습니다. 약한 참조 Weak Reference WeakReference 클래스를 사용해 객체에 대한 약한 참조를 만들 수 있습니다. 가비지 컬렉터가 실행되면, 약한 참조만이 남아있는 객체는 메모리에서 제거됩니다. 소프트 참조 Soft Reference SoftReference 클래스를 사용해 만듭니다. 소프트 참조는 메모리가 부족할 때까지 가비지 컬렉션의 대상이 되지 않습니다. 즉, 가비지 컬렉터가 실행되더라도 충분한 메모리가 있는 경우에는 소프트 참조가 가리키니는 객체는 회수되지 않습니다. 팬텀 참조 Phantom Reference..
자바는 과거 finalize() 메서드를 사용해서 가비지 컬렉션에 의해 객체가 회수되기 직전에 실행되는 코드를 작성할 수 있었다. 그러나 finalize()는 실행 시점을 정확히 예측할 수 없으므로 사용하는 것이 권장되지 않아 Java 9부터는 deprecated가 되었다. 그리고 Java 12에서 Cleaner, PhantomReference를 사용한 대안이 제시되었다. Cleaner Cleaner 클래스는 객체에 도달할 수 없을 때, 그리고 가비지 수집되기 직전에 수행해야 하는 정리작업을 등록하는 데 사용된다. 가비지 수집기에서 개체를 회수하기 전에 실행해야 하는 리소스 정리 또는 기타 작업을 수행하는 방법을 제공한다. Cleaner의 주요 목적은 예측 불가능성과 잠재적인 성능 문제로 인해 권장되지 ..
kapt kapt는 Kotlin언어를 사용해 annotaion processor를 실행하기 위한 Gradle 플러그인이다. annotation processor annotation processor는 컴파일 타임에 소스 코드에 있는 주석을 읽어들이고, 그에 따라 추가적인 코드를 생성하거나 변형할 수 있다. 이를 통해서 자동화된 코드 생성이나 런타임에서 퍼포먼스 향상 등 다양한 이점을 얻을 수 있다. kapt 플러그인은 kotlin-gradle-plugin 플러그인을 사용하는 코틀린 프로젝트에서만 사용할 수 있으며, kapt를 사용하기 위해서는 먼저 kotlin-kapt 라이브러리를 프로젝트 의존성이 추가해야한다. plugins { id("org.jetbrains.kotlin.jvm") version "1..
스코프 함수 스코프함수란 객체의 범위를 지정하는 데 사용되는 특수한 함수로, 객체 지향 프로그래밍에서 객체의 메서드와 유사하게 작동하지만, 스코프 함수는 객체의 범위를 한정하는 것이 목적이다. 코틀린에서는 다음 5가지의 스코프 함수를 제공한다. let, apply, run, als, with 이 그림을 참고하며 보도록 하자. let let 함수는 객체를 인자로 받아 람다식을 실행하고 결과를 반환한다. 예를 들어, 아래의 코드는 nullableVariable이 null이 아닌 경우 println을 실행한다. nullableVariable?.let { value -> println(value) } let 함수는 null 값 처리에 유용하며, 예를 들어, 아래의 코드는 nullableVariable이 null..
고차 함수 코틀린은 함수형 프로그래밍을 지원하기 위해서 고차 함수를 지원한다. 고차함수는 다른 함수를 매개변수로 받거나 함수를 반환하는 함수를 말한다. 이를 통해 코드의 재사용성과 추상화 수준을 높일 수 있다. 오늘은 고차 함수 중 map, filter, reduce, fold, forEach, any, all, groupBy, sortedBy, zip, flatmap, takeWhile, dropWhile까지 알아보겠다. map() map()은 컬렉션의 각 요소에 대해 주어진 함수를 적용하여 새로운 컬렉션을 반환한다. val numbers = listOf(1, 2, 3, 4, 5) val doubled = numbers.map { it * 2 } // [2, 4, 6, 8, 10] filter() fi..
개요 코틀린 인 액션 책 내용중 람다 파트에서 함수를 인자로 사용했을때, 무명객체를 사용했을때 차이와 여러 중요해보이는 지식들이 많아 글을 정리해보려고 한다. 람다 Lambda 람다는 함수형 프로그래밍에서 함수를 간결하게 표현하는 방법 중 하나다. 보통 함수를 정의하고 호출하는 과정을 생략하고, 함수의 내용만을 직접 표현한다. 람다는 함수형 인터페이스를 구현하는 익명 함수다. 즉, 람다는 함수형 인터페이스를 구현하기 위한 구현체로서, 람다 식을 사용해 구현된 함수형 인터페이스는 일반적인 인터페이스를 구현한 클래스와 같이 사용될 수 있다. 무명 객체 자바에서는 과거 클릭과 같은 이벤트 처리를 위해서는 인자로 무명객체를 생성해 받아야했다. button.setOnClickListener(new View.OnC..