
로또 미션 2단계 코드 리뷰에서 다음과 같은 리뷰를 받았다. 처음에는 진짜 띠용?? 이었다. 😨 이걸 어떻게 검색해봐야하지..? 하는 고민이 들었었다. 그러다 크루들과 로또 미션 코드 회고를 할 기회가 생겼는데, 당시 이에 대해 아는 크루가 있는지 물어봤었다. 감사하게도 로마가 @ParameterizedTest에도 name 인자를 지정해 넘겨줄 수 있다는 것을 알려줬다!! 👍 회고를 통해 알게 된 것도 많고, 공부할 것들도 늘어나고, 아직 진짜 모르는게 많다는 생각도 들고.. 좋다.. 😹 JUnit5 User Guide를 확인해보니 "2.15.6. Customizing Display Names"라는 소주제로 해당 내용을 다루고 있었다. 왜 JUnit5 문서를 찾아볼 생각은 안 하고 검색부터 할려고 했을까..

[개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴] 7-1. 전략(Strategy) 패턴 로또 미션 1단계 코드 리뷰에서 나는 다음과 같은 리뷰를 받았다. 당시 자동차 경주 미션에서는 인터페이스를 사용하지 않았어서.. 어떻게 해야하는거지?? 🤔 하는 당혹스러움이 있었다. 테코블에 "인터페이스를 분리하여 테스트하기 좋은 메서드로 만들기"라는 주제의 글이 있었고 많은 도움을 받았다. 해당 글에는 자동차 경주 미션을 예시로 보여줬기에 "아 이런 방식을 로또 미션에 적용해보면 되겠다"라는 생각으로 적용을 해봤었다. LottoGenerator 랜덤 로또 생성을 테스트하기 어렵기 때문에 랜덤이 아니라 고정된 로또를 생성하는 기능이 필요하다고 생각했다. 둘 모두 "로또를 생성"한다는 점에서 같으므로 일단 Lot..
[이펙티브 자바 3/E] 아이템 21 : 인터페이스는 구현하는 쪽을 생각해 설계하라 Java8 이전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 수 있는 방법이 없었다. Java7까지만 해도 "현재 인터페이스에 새로운 메서드가 추가될 일은 영원히 없다"고 가정하고 작성됐다고 하니 말 다했다. 만약 요구사항이 추가되면서 인터페이스에 메서드를 추가해야하는 상황이 온다면, 해당 인터페이스의 구현체 클래스를 모두 변경해야줘야한다. 이게 작은 프로그램이라면 문제가 없겠지만 해당 인터페이스를 상속 받은 클래스가 무수히 많다면.... 변경 사항이 걷잡을 수 없이 많아질 것이다. 이러한 문제를 해결하기 위해 Java8 부터는 기존 인터페이스에 메서드를 추가할 수 있는 "디폴트 메서드"가 추가되었다. ..
[이펙티브 자바 3/E] 아이템 1 : 생성자 대신 정적 팩터리 메서드를 고려하라 핵심 정적 팩터리 메서드와 public 생성자는 각자의 쓰임새가 있으니 상대적인 장단점을 이해하고 사용하는 것이 좋다. 그렇다고 하더라도 정적 팩터리를 사용하는 게 유리한 경우가 더 많으므로 무작정 public 생성자를 제공하던 습관이 있다면 고치자. 정적 팩토리 메서드(Static Factory Method) 정적 팩토리 메서드란 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드를 말한다. (new 없이 객체를 생성한다) 우리가 평소 습관적으로 public 생성자로 객체를 생성했다면 이제는 정적 팩토리 메서드를 이용해 객체 생성를 할 수 있다는 것을 알아야한다. // public 생성자 이용 Car car = new C..

이전에 우테코 크루들과 “final이 보장하는 불변은 어디까지인지?”에 대해 얘기를 나누었을 때, 어떤 크루가 본인은 컬렉션의 불변을 보장해야할 때는 unmodifiable 상태로 명시한다는 이야기를 했었다. "unmodifiable" 사실 Java 인생에서 처음 들어보는 단어였다. 그래서 그런지 뭔가 머릿속에서 휘발되고 말았는데.. "일급 컬렉션(First Class Collection)"에 대해 학습을 하다보니 다시 "객체의 불변"에 대한 내용이 나왔고, 불변과 관련해서 컬렉션에서는 unmodifiable이라는 상태를 지원한다는 것을 알게되었다. Unmodifiable Collection Unmodifiable Collection은 수정할 수 없는 컬렉션임을 뜻하며, "Read-Only" 용도로만 사..

[이펙티브 자바 3/E] 아이템 9 : try-finally 보다는 try-with-resources를 사용하라 핵심 close 메서드를 호출해 직접 닫아줘야하는 자원에 "try-with-resources"를 적용해 안전하게 닫아주자!! 예) InputStream, OutputStream, java.sql.Connection 등 ** 자원을 닫지 않으면 성능 문제로 이어질 수 있다. try-finally (Java7 이전) 변수1 = null; 변수2 = null; try { 변수1 = new 자원객체1(); 변수2 = new 자원객체2(); 변수1.작업(); 변수2.작업(); ... } finally { if (변수1 != null) 변수1.close(); if (변수2 != null) 변수2.clos..

로또 미션을 진행하면서 로또 번호 하나를 포장하는 클래스인 LottoNumber 클래스를 생성하게 됐다. LottoNumber 클래스는 다음과 같이 정수 타입의 number 멤버 변수 하나만을 갖는 간단한 클래스이다. public class LottoNumber { private final int number; public LottoNumber(int number) { validateRange(number); this.number = number; } } 이제 로또에서 사용하는 모든 로또 번호에 대해서는 LottoNumber 클래스를 사용하게 된다. 이때 우리는 "당첨 번호와 보너스 번호의 중복을 검사"하거나 "당첨 번호와 로또 티켓의 로또 번호가 몇개가 동일한지를 검사"하는 등 LottoNumber 객..

사용자 입력값(String)에 대한, 검증(validation)을 하다보면 Null, Empty, Blank에 대한 검사는 필수적으로 들어간다고 생각한다. 나도 현재 진행 중인 미션에서 이에 대한 검증이 필요했으며, 다음과 같은 코드 리뷰를 받게됐다. 생각해보면 이때의 나는 Null, Empty, Blank에 대한 구분을 넘어서 구분의 필요성 자체를 못 느꼈던 것 같다... 이제는.. 안다.. 😊 분명 어디인가에 나와 같은 사람이 있을것이라 생각하며 이 글을 쓴다. Null, Empty, Blank가 각각 무엇을 의미하는지 살펴보고, 어떻게 검사하는지, 또 사용자 입력값 검증에 어떻게 적용해야할 지 살펴보자!! Null 변수에 아무것도 할당되지 않은 상태를 의미한다. String nullString = ..
생성자가 2개 이상일 경우, 하나의 주생성자를 지정하고 주생성자에서만 초기화를 진행하고, 그 외의 부생성자에서는 주생성자를 호출하는 방식이 추천된다고 한다. ✅ 이렇게 생성자에서 또 다른 생성자를 호출하는 방식을 생성자 체인 기법(Constructor Chainning)이라고 한다. (생성자 체인 기법 참고 블로그) ✅ 주생성자는 모든 부생성자 뒤에 위치시키는 것이 유지보수측면에서 좋다. before public Car(final String name) { this.name = name; position = 0; } public Car(final String name, final int position) { this.name = name; this.position = position; } after Ca..
리뷰어 희봉이 "Random과 ThreadLocalRandom의 차이점이 무엇일까요?"라는 질문을 던져주셨다. 🙇♀️ 나는 그동안 Random를 사용하면서도 이에 대한 정확한 학습이나 이것 보다 더 적절한 라이브러리는 없는지에 대한 생각을 한적이 없었다. 덕분에 Java 표준 라이브러리에서 제공하는 랜덤 넘버 생성 기능이 Random, ThreadLocalRandom, SecureRandom 등 다양하다는 것을 알게 되었다. (추가 학습이 필요하다!!) Java7부터 다중 스레드 프로그램을 위한 ThreadLocalRandom이 추가되었다. ThreadLocalRandom는 Random과 같은 기능을 제공하면서도 다음과 같은 장점을 가진다. 스레드 세이프(Thread Safe)하다. 다중 스레드 프로그..