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

java38

[Kotlin] Java와 Kotlin, 그리고 Lombok 목차 Java에서의 Lombok 자바에서는 기본적으로 클래스의 Getter, Setter, 생성자를 비롯한 기본적인 메소드나 Builder 패턴 등의 디자인 패턴을 개발자가 직접 작성하거나 IDE의 도움을 받아 작성해야 한다. 그런데 클래스에 새로운 필드를 추가하거나 기존 필드를 삭제하면 기존의 코드에도 영향을 주게 되어 굉장히 번거롭다. 이러한 번거로움을 Lombok이 등장하면서 덜어주게 되었다. 추가하고자 하는 기능에 대한 어노테이션만 추가해 놓으면 코드를 작성할 땐 클래스의 필드에 변경이 일어나더라도 전혀 신경 쓰지 않고 사용할 수 있게 된 것이다. 이러한 편의성으로 인해 자바를 이용한 개발에서 Lombok은 뗄 수 없는 관계라고 볼 수도 있을 것이다. Kotlin과 Lombok 코틀린은 클래스의 .. 2023. 4. 21.
[Kotlin] 불변 컬렉션과 가변 컬렉션 목차 서론 코틀린의 컬렉션은 기본적으로 자바의 그것을 그대로 사용하지만 불변 컬렉션과 가변 컬렉션으로 구분된다는 차이가 있다. 물론 자바에서도 불변 컬렉션을 만드는 것이 불가능하진 않지만 불변이라는 것을 컴파일 타임에 검증할 수 없고, 만드는 것도 조금 번거롭기 때문에 완전하다고 보기는 어렵다. 이 글에서는 코틀린의 불변 컬렉션과 가변 컬렉션에 대해 다룬다. 컬렉션(Collection)? 컬렉션은 수집이라는 단어 의미 그대로 다수의 객체를 수집해놓은 객체라고 볼 수 있다. 컬렉션은 크게 리스트(List), 집합(Set), 맵(Map)으로 나눌 수 있다. List : 인덱스를 통해 요소에 접근할 수 있는, 순서가 보장된 컬렉션. 중복 요소가 허용된다. 스택과 큐, 덱 등의 자료구조도 큰 의미에서 리스트에 .. 2023. 4. 18.
[Java] HashMap vs Hashtable(feat. ConcurrentHashMap) 목차 서론 스터디를 진행하던 도중 Hashtable에 대한 이야기가 조금 나왔었다. 사실 이전까진 Hashtable이라는 것이 있다는 것만 알고 Map의 구현체로 대부분 HashMap을, 아주 가끔 TreeMap을 사용했는데, Hashtable은 HashMap과 비슷하게 Key - Value 쌍의 Map 구현체인 것은 동일하지만 세부적인 내용에서 차이가 있는 구조라고 한다. 이 글에서는 HashMap과 Hashtable의 차이에 대해 조금 다뤄보려고 한다. HashMap HashMap은 자바 1.2에서 등장한 Map 인터페이스의 구현체이다. 기본적으로 HashMap은 동기화를 지원하지 않기 때문에 다중 스레드 환경에서는 동시성 이슈가 발생할 수 있다. 이러한 이유로 인해 HashMap에서는 연산 도중 M.. 2023. 3. 27.
[Spring] 유틸성 메소드를 작성할 때 Spring Bean과 정적 메소드를 모아놓은 클래스 중 무엇을 사용해야 할까? 목차 개요 프로젝트를 진행하다 보면 다양한 유틸성 메소드를 작성해서 사용하는 경우가 많다. 개인적으로는 이렇게 유틸성 메소드가 필요한 경우에는 Java라면 별도의 클래스에 유틸성 메소드를 static 메소드로 작성하고 Kotlin이라면 별도의 파일에 Top-Level 메소드로 작성해서 사용하고 있었다. 그러다가 단순히 계산만 하는 유틸성 메소드가 작성된 클래스를 스프링 빈으로 등록하여 사용하고 있는 코드를 보면서 스프링 빈으로 등록해도 싱글톤으로 동작하는데 이 방법도 틀린건 아니지 않나?라는 생각이 들어 구글링을 해봤는데 비슷한 생각을 했던 분들이 계셔서 한 번 정리해보려고 한다. 이하 유틸성 클래스라고 언급하는 것은 정적 메소드만을 모아놓은 별도의 클래스를 지칭한다. Spring Bean과 유틸성 클래.. 2023. 3. 15.
[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/Java] 개인적인 Enum 활용기 목차 클린 코드(로버트 C. 마틴 著)를 읽거나 개발 강의를 듣다 보면 리터럴 대신 Enum을 사용하는 것을 권장하는 경우가 많다. 최근 프로젝트를 진행할 때 Enum을 사용하면서 느낀 점에 대해서 정리해보고자 한다. Enum? Enum이란 관련된 요소들을 모아놓은 집합 또는 단어 의미 그대로 열거해 놓은 것이라고 볼 수 있다. 사실 자바를 처음 배울 당시에만 해도 Enum에 대한 내용은 뭔가 잘 와닿지 않았다. 대부분 Enum에 대해서는 짧고 간단하게 다루는 경우가 많았고, 심지어 아예 Enum을 다루지 않은 책들도 있었다. 그러던 도중 배민 기술 블로그에서 Enum을 다룬 글과 최근 수강한 Spring Boot 강의에서 Enum을 활용하는 것을 보고 어떻게 Enum을 활용할 수 있을지 와닿은 점이 있.. 2023. 2. 4.