728x90
문제 상황자바 코드를 코틀린 코드로 마이그레이션 하는 과정에서 "이거 자바 코드로 바꾸면 어떻게 되지?" 라는 의문이 들었다. 특히 상수 선언 방법이 2개인 코틀린에서 companion object, const 를 각각 사용하여 상수 선언 시둘의 결과는 같은 지, 아니면 내가 아는 것과 조금 다르게 동작할 지에 대한 의문으로 디컴파일 방법을 탐색하여 알게 되었다. Kotlin to Java 디컴파일(Decompile)이란?Kotlin 을 Java로 디컴파일 한다는 것은Kotlin으로 작성된 언어를 .class 파일로 컴파일한 다음, 다시 Java로 디컴파일을 수행한다는 것을 의미한다. 결국 Kotlin으로 작성된 코드가 Java로 보면 어떤 지 확인할 수 있기 때문에 Java -> Kotlin 마이그..
문제 상황자바 코드를 코틀린으로 마이그레이션 하는 과정 중, 상수 선언 과정에서 문제 상황을 겪게 되었다. public class SampleClass { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); //...}자바에서 객체를 static final을 통해 상수로 선언하는 것은 일반적으로 가능한 일이다. private const val DATE_TIME_FORMATTER: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")class SampleClass(하지만 상..
문제상황 Java/Spring을 Kotlin/Spring으로 마이그레이션 하는 과정에서 Kotlin의 Lombok 사용에 어려움을 겪었다.그리고 그 이유 Lombok이 Javac의 Annotation Processing 과정에서 처리되는데, Javac보다 Kotlinc가 더 먼저 작동하여 Javac에서 Annotation Processing 과정을 통해 생성되는 코드를 Kotlin 코드에서는 알 수가 없기 때문임을 알게 되었다. 이 과정에서 Javac의 Annotation Processing을 포함한 전반적인 과정을 흝어보고 싶어 학습하여 기록해 두게 되었다. javac의 동작 과정 javac의 동작과정에 대해 자세히 파헤쳐보자. javac는 대략 아래 7가지 단계로 컴파일을 수행한다. 1. Parsi..
미션 도중 생긴 고민 💭public Cars(List carNames) { ArrayList cars = new ArrayList(); for (String carName : carNames) { cars.add(new Car(carName)); } this.cars = cars; } Cars 객체를 생성할 때, List형태의 carNames를 입력받은 뒤,For-Loop 문을 통해 cars 필드를 초기화 해주었다. 하지만 For-Loop문을 생성자 로직에 적용하니 개인적으로 생성자 로직이 지저분하다는 생각이 들었다.때문에 Stream을 사용하여 짧고 가독성있는 코드로 리팩토링하여 사용하고자 하였다. 그리고 이때 머릿속에 한가..
Fluent API는 API의 패턴 중 하나이다.Fluent API는 메서드 체이닝 형태로 설계된 API이며, 그 목표는 도메인별 언어 (DSL)를 생성하여 코드 가독성을 높이는 것이다.이 용어는 Eric Evans 와 Martin Fowler 가 2005년에 만들어냈다고 한다. Fluent API를 사용하는 대표적인 라이브러리로 AssertJ가 존재한다.이전에는 Junit을 통해 하나의 메서드로 처리해야 했던 코드를Fluent API 패턴을 적용한 AssertJ를 통해, 직관적인 형태로 메서드를 풀어내어 테스트 코드를 작성할 수 있도록 구현되어 있다. // JunitAssertions.assertTrue(true);// assertJAssertions.assertThat(true).isTrue();/..
생성자 체이닝(Constructor Chaining)이란?생성자 체이닝은 생성자가 2개 이상일 경우, 전체 인스턴스 필드의 값 초기화를 담당하는 하나의 주 생성자를 두고 이 외의 부 생성자들은, 자신보다 상위의 부 생성자를 호출하는 체이닝 구조를 거쳐 최종적으로 주 생성자를 호출하여 객체를 생성하도록 만드는 방식이다.즉, 실제 객체 초기화를 담당하는 주 생성자 이 외에는 상위 생성자를 호출해나가는 구조인 것이다. 적용 기존 코드public Player(final String name) { super(Cards.createEmpty()); this.name = new Name(name);}public Player(final String name, final Cards cards) { super(cards..