PROGRAMMING LANGUAGE

    [Kotlin] Collections의 Iterable과 Sequences 차이점

    들어가기 전에 Java에서는 stream()을 통해 collection 요소를 하나씩 참조하여 반복적인 작업을 할 수 있습니다. Kotlin에는 Collections 자체에 filter(), map() 등의 API를 제공하고 있어 stream() 없이도 collection 요소에 하나씩 참조가 가능합니다. 위 내용만 보면, Java에서 collection에 stream() 붙여서 사용하는 경우와 Kotlin에서 collection의 API를 호출하는 경우 동일하게 연산이 이루어질 것 같지만 서로 상이하게 연산을 진행합니다. Java의 stream: Lazy Evaluation Kotlin의 collection 기본 연산(iterable): Eager Evaluation 이번 포스팅에서는 Kotlin의 c..

    [effective JAVA] 아이템6: 불필요한 객체 생성을 피하라

    객체를 만들어야 할때와 만들지 말아야 할 때를 구분하자. 올바른 객체 생성 방법과 불필요한 생성을 피하자. 객체가 제때 파괴됨을 보장하고, 파괴 전 수행해야 할 정리 작업을 관리하자. 아이템6: 불필요한 객체 생성을 피하라 기존 객체를 재사용해야 한다면 새로운 객체를 만들지 마라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을때가 많습니다. 특히, 불변 객체는 언제든 재사용할 수 있습니다. String s = "test"; 이 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용합니다. 위 구조로 String 인스턴스를 생성한다면, 동일한 문자열 리터럴을 사용하는 모든 코드가 같은 객체 재사용함이 보장됩니다. String 클래스는 public final..

    [effective JAVA] 아이템1: 생성자 대신 정적 팩토리 메소드를 고려하라

    객체를 만들어야 할때와 만들지 말아야 할 때를 구분하자. 올바른 객체 생성 방법과 불필요한 생성을 피하자. 객체가 제때 파괴됨을 보장하고, 파괴 전 수행해야 할 정리 작업을 관리하자. 아이템1: 생성자 대신 정적 팩토리 메소드를 고려하라 특정 클래스의 인스턴스를 얻는 방법 중 가장 먼저 떠오르는 건 public 생성자을 이용한 방법일 것입니다. 하지만, 모든 개발자들은 정적 팩토리 메소드(static factory method)를 통해 인스턴스를 얻는 방법 역시 알고 있어야 합니다. 정적 팩토리 메소드를 통해 인스턴스를 제공하는 방식에는 장단점이 존재합니다. 정적 팩토리 메소드 장점 1. 이름을 가질 수 있다. 정적 팩토리 메소드는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사가 가능합니다. 특정 자..

    [Pattern] Template Method Pattern 구현하기

    들어가기 전에 프로젝트를 진행하면서, 가독성 있게 코드를 작성하기 위해 메소드를 구성하다보니, 각각 다른 API에 대해 비슷한 형태의 로직이 중복적으로 발생하였습니다. 이 로직 중에는 공통 코드(예: 객체 만드는 코드)가 존재하기 때문에 중복을 제거하고, 추후 유지보수가 편할 수 있도록 Template Method Pattern을 적용하고자 합니다. 이번 포스팅에서는 소스코드 리팩토링 시 사용할 Template Method Pattern에 대해 알아보도록 하겠습니다. Template Method Pattern 템플릿 메소드 패턴은 알고리즘 골격을 정의합니다. 템플릿 메소드를 사용하면 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래..

    [Kotlin]enum class와 data class

    enum class enum 클래스는 미리 정의된 상수들로 이루어진 제한된 집합을 표현하는 클래스입니다. enum 클래스를 사용하면 정해진 상수들로 이뤄진 집합을 타입 안전(type-safe)하게 다룰 수 있습니다. 가장 단순한 형태는 아래와 같습니다. 빠뜨린 부분이 없는 when 식 enum 역시, 다른 타입과 유사하게 when을 사용해 변수 각각의 값을 비교할 수 있습니다. enum 사용 시 when 식에서 enum의 값이 될 수 있는 모든 enum 상수를 다룬다면, 따로 else를 작성하지 않아도 됩니다. 코틀린은 내부적으로 빠뜨린 부분이 없는 when 식에는 NoWhenBranchMatchedException 타입의 예외를 던지는 else가 암시적으로 추가됩니다. 빠뜨린 부분이 없는 when 식의..

    [Kotlin] 객체

    코틀린 객체 코틀린의 객체 선언은 클래스와 상수를 합한 것으로 객체 선언을 통해 싱글톤(singleton: 인스턴스가 단 하나 존재하는 클래스)을 만들 수 있습니다. 객체 선언 코틀린의 객체 선언은 class 대신 object를 사용합니다. 객체 선언은 클래스를 정의하는 동시에 인스턴스를 정의한다고 보면 됩니다. 객체 정의는 Thread-Safe하기 때문에 컴파일러는 실행되는 여러 스레드에 대해 하나의 인스턴스만 공유되고 초기화 코드 역시 한 번만 실행되도록 보장합니다. 초기화 작업은 싱글톤 클래스가 실제 로딩되는 시점까지 지연되며, 보통 프로그램이 해당 객체 인스턴스에 처음 접근할 때 초기화됩니다. 자바에서는 비공개 생성자와 정적(static) 상태를 조합한 클래스 정의를 통해 싱글톤을 만들고, 아래 ..

    [Kotlin] 널 가능성

    널이 될 수 있는 타입 자바와 마찬가지로 코틀린의 참조 값에는 아무것도 참조하지 않을 경우를 나타내는 null이라는 값이 존재합니다. 코틀린 타입 시스템에는 널 값이 될 수 있는 참조 타입과 널 값이 될 수 없는 참조 타입을 구분할 수 있어 컴파일 시점에 NullPointerException(NPE) 가능성을 상당 부분 줄여줍니다. 코틀린에서는 기본적으로 모든 참조 타입은 널이 될 수 없는 타입입니다. 따라서, String 같은 타입에 null을 대입할 수 없습니다. 코틀린에서는 널이 될 수 있는 값을 받는 함수를 작성하려면 아래와 같이 파라미터 타입 뒤에 물음표(?)를 붙여 널이 될 수 있음을 명시해주어야 합니다. fun isBooleanString(s: String?) = s == "false" ||..

    [Kotlin] 클래스 기초

    클래스 정의하기 JAVA와 마찬가지로 Kotlin에서는 클래스 정의를 통해 커스텀으로 정의된 연산들이 포함된 새로운 타입을 만들어줍니다. 기본적으로 클래스 선언은 참조 타입(referential type)을 정의합니다. Kotlin 1.3에 도입된 인라인 클래스(inline class)를 통해 참조 타입이 아닌 타입 역시 정의가 가능합니다. 클래스 내부 구조 자바와 마찬가지로, 코틀린 클래스도 class 키워드 다음에 클래스 이름이 오고 그 다음에 클래스 본문이 오는 형태입니다. 코틀린 클래스는 기본적으로 공개(public) 가시성입니다. 최상위 함수와 마찬가지로 최상위 클래스를 internal이나 private으로 설정할 수 있습니다. 코틀린 클래스 명은 자바와 달리, 소스 파일명과 동일하게 작성하지 ..