본문 바로가기
  • 개발하는 곰돌이

Programming Language/Kotlin & Java28

[Effective Java] 상속보다는 컴포지션을 사용하라(Feat. Stack) 목차 상속보다는 컴포지션을 사용하라 - 이펙티브 자바 3/E 아이템 18 상속은 자바가 갖는 유연한 구조의 기반이 되는 기법이다. 잘 사용한 상속 구조는 애플리케이션의 확장과 유지보수를 수월하게 해주지만, 잘못 사용한 상속 구조는 예상하지 못한 문제를 일으킬 수 있다. 이번 포스트에서는 자바의 Stack 클래스를 예시로 잘못 사용한 상속 구조에서 발생할 수 있는 문제와 컴포지션을 통해 이러한 문제를 해결하는 것을 다룰 것이다. 상속 일단 여기서 다루는 상속은 오직 클래스에서 클래스로의 상속만 해당된다. 상속을 사용하면 기본적으로 자식 클래스는 부모 클래스의 public과 protected 속성 + 자식 클래스만의 속성을 갖게 된다. 이 과정에서 상속은 캡슐화를 깨트리게 된다. 자식 클래스는 부모 클래스에.. 2023. 2. 27.
[Kotlin] 빌더 패턴과 코틀린, 그리고 Default Parameter와 Named Argument를 이용하여 코틀린에서 빌더 패턴의 효과를 내보기 Builder Pattern 이펙티브 자바(조슈아 블로크 著)에서는 생성자의 파라미터가 많다면 빌더를 고려하라는 내용이 있다. 클래스의 필드가 많아져서 생성자의 파라미터가 많아질수록 파라미터의 순서를 뒤바꾸거나 엉뚱한 값을 집어넣는 실수를 하기 쉬워지고, 이는 파라미터의 타입과 파라미터의 개수만 같다면 컴파일 시점에는 아무 문제가 없기 때문에 런타임에 예상치 못한 에러를 유발할 수 있다. 이런 문제를 해결하기 위해 나온 디자인 패턴이 바로 빌더 패턴(Builder Pattern)이다. 빌더 패턴은 일반적으로 클래스 내부에 해당 클래스의 필드를 그대로 갖는 Builder라는 정적 클래스를 생성한 후 객체를 생성하고자 하는 클래스에서 builder() 메소드로 빌더를 생성한다. 이후 각 파라미터마다 값을 삽.. 2023. 2. 13.
[Java/Kotlin] 자바 Stream을 통해 리스트의 요소를 특정 key 기준으로 grouping하여 다른 객체로 합치기 및 코틀린으로 변경해보기 목차 Stream이란? 자바의 Stream은 자바 8버전에 새로 추가된 기능으로, 컬렉션 객체에서 요소들을 순회하면서 람다 함수를 통해 이 요소들을 가공하거나 요소의 특정 필드를 추출, 또는 컬렉션 객체의 요소들을 토대로 한 새로운 객체를 생성하는 것 외에도 다양한 방법으로 활용할 수 있는 강력한 기능이다. 다양한 기능들이 있지만 map()과 filter()정도만 해도 다채롭게 사용할 수 있다. 이 포스트에서는 업무 중 마주했던, 리스트의 요소들을 특정 key를 기준으로 한 새로운 객체로 병합하여 이 새로운 객체들의 리스트로 변환한 내용과 스트림을 통해 이 코드들을 개선해나간 내용, 나아가서 이렇게 개선된 코드를 코틀린으로 표현하면 어떻게 되는지에 대해 정리할 것이다. 문제의 시작 DB에 위와 같은 형태.. 2023. 2. 9.
[Kotlin] Kotlin에서의 형변환과 스마트 캐스트(Smart Cast) feat. as, is 개요 코딩을 하다보면 필연적으로 자료형을 변환해야 하는 경우가 생긴다. Java에서는 숫자형의 경우에는 변수의 자료형에 따라서 자동으로 형변환이 일어나서 저장되었고, 변수나 객체 앞에 (자료형)을 붙여주는 것으로 강제로 형변환을 할 수도 있었다. Kotlin도 마찬가지로 형변환이 가능한데 이에 대해 정리하고자 한다. 기본 자료형의 형변환 Kotlin의 기본 자료형들은 기본적으로 변수에 대입할 때 자동 형변환을 지원하지 않는다. 예를 들어, Java에서는 실수형에 정수형을 대입하거나 정수형에 문자형을 대입하려고 하면 자동으로 형변환이 일어나서 다음과 같은 코드가 모두 동작했다. double a = 10; boolean c = a == 10;// true int b = 123; a = b;// OK 하지만 .. 2023. 1. 16.
[Kotlin] 기본 매개변수(Default parameter)와 명명된 인자(Named Arguments) 기본 매개변수(Default Parameter) Kotlin 기본 문법 1 : 개요 및 변수와 함수 Default Parameter는 이전에 함수에 대해 정리할 때 짧게 정리한 적이 있다. Kotlin에서는 함수의 파라미터에 기본값을 지정하여 함수 호출 시 기본값이 지정된 파라미터를 생략하면 해당 기본값을 사용하게 만들 수 있다. 이러한 Default Parameter는 함수의 불필요한 오버로딩을 줄일 수 있다는 장점이 있다. 예를 들어 두 정수의 합을 계산하는 함수가 있다. 이 때, isAbsolute라는 파라미터를 추가하여 true를 전달하면 두 정수의 합의 절대값을 반환하게 만들고 싶을 경우에 Java에서는 다음과 같이 함수를 오버로딩해서 구현해야 했다. // Java public int add(i.. 2022. 12. 27.
Kotlin 기본 문법 11 : 스코프 함수(let, run, also, apply, with) 목차 개요 Kotlin에는 Java에는 존재하지 않는 스코프 함수(Scope Function)라는 특수한 함수가 있다. 스코프 함수는 단어 의미 그대로 번역하면 범위 함수가 되는데, 어떠한 객체에 대하여 이 객체가 다루는 특정 범위를 생성하여 프로퍼티나 메소드를 처리하는 코드를 간결하게 만들거나, 메소드 체이닝에 활용하는 함수를 의미한다. 이번 포스트에서는 스코프 함수의 종류와 그 특징에 대해서 정리한다. 스코프 함수의 종류 스코프 함수에는 let, run, also, apply, with와 같이 총 5개의 종류가 있다. 이 스코프 함수들은 모두 함수를 파라미터로 받아서 동작하는데, with를 제외한 나머지 4 종류는 반환값과 파라미터로 받는 함수의 형태에 따라 다음과 같이 분류할 수 있다. 여기서 람다.. 2022. 12. 26.
Kotlin 기본 문법 10 : 커스텀 getter와 setter 목차 개요 Kotlin의 클래스 역시 Java와 마찬가지로 각 필드에 대한 getter와 setter가 존재한다. 이번 포스트에서는 Kotlin 클래스의 기본적인 getter와 setter 및 Kotlin 클래스의 커스텀 getter와 setter에 대해 정리한다. Kotlin 클래스의 기본 getter와 setter Kotlin에서 클래스를 작성하는 방법은 Kotlin 기본 문법 6 : 클래스와 접근 지정자 포스트에서 이미 다룬바가 있다. Kotlin 클래스의 필드는 기본적으로 Java와 달리 별도의 getter, setter 메소드로 접근하지 않는다. 대신 Kotlin에서는 클래스의 생성자를 작성하면 필드의 종류(val, var)에 따라 자동으로 getter와 setter를 생성해주고, 일반적으로 필.. 2022. 12. 22.
Kotlin 기본 문법 9 : Kotlin의 다양한 클래스(Data Class, Enum Class, Sealed Class) 목차 개요 Kotlin에는 기본적인 클래스, 추상 클래스, 인터페이스 외에도 Data Class, Enum Class, Sealed Class가 존재한다. 물론 Enum Class는 Java에도 존재하는 개념이지만 Data Class와 Sealed Class는 Java에는 존재하지 않는 Kotlin만의 특별한 클래스이다. 이번 포스트에서는 이러한 Kotlin의 특별한 클래스에 대해 정리한다. Data Class Data Class는 주로 DB를 다루는 앱을 개발할 때 각 DTO(Data Transfer Object)나 VO(Value Object)를 작성할 때 사용할 수 있는 특수한 클래스이다. Java에서 DTO나 VO를 작성할 때 getter, setter를 비롯하여 equals(), hashCode.. 2022. 12. 16.