Study

Study/이펙티브 자바

[Effective Java] 정확한 답이 필요하다면 float와 double은 피하라

💥 개요 float과 double은 과학과 공학 계산용으로 설계됐다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 정밀한 '근사치'로 계산하도록 설계됐다. 정확한 결과가 필요하면 사용하면 안되며, 특히 금융 관련 계산과 맞지않는다. 1.03 - 0.42 는 출력시 0.6100000000000001을 출력한다. 이건 특수한 사례도 아니다. ⚠️ 금융 계산에 잘못된 예시 public class Change { // 코드 60-1 오류 발생! 금융 계산에 부동소수 타입을 사용했다. (356쪽) public static void main(String[] args) { double funds = 1.00; int itemsBought = 0; for (double price = 0.10; funds >= p..

Study/이펙티브 자바

[Effective Java] 공개된 API 요소에는 항상 문서화 주석을 작성하라

💥 개요 API를 작성함에 있어서 잘 작성된 문서는 중요하다. 공식 언어 명세에는 없지만 자바 프로그래머라면 알아야하는 업계 표준 API라 할 수 있다. 자바에서는 이 귀찮은 작업을 자바독이라는 유틸리티가 도와준다. https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html How to Write Doc Comments for the Javadoc Tool Javadoc Home Page This document describes the style guide, tag and image conventions we use in documentation comments for Java programs written at Java Sof..

Study/Next Step

[Next Step] ATDD, 클린 코드 with Spring 8기 3주차 리뷰

🎈 테스트와 의존 의존은 무조건 나쁜가에 대해서 이야기했다. 물론 답은 아니다. 의존이 없으려면 하나의 객체가 모든걸 다 처리해야하고, 변경 요구사항이 발생할 때 복잡해진다. 이를 위해서 적절한 범위로 책임을 나누는게 좋고, 불필요한 의존 대상은 정리해야한다. 🔎 테스트와 관련한 궁금증 1.통합 테스트인 경우 외부 라이브러리를 테스트해야 할까? 외부 라이브러리의 기능을 검증할 필요는 없다. 하지만, 그 부분을 활용하는 로직에 대한 검증은 필요할 수 있고, 외부 라이브러리는 변경할 수 없으니 실제 객체를 활용하는게 좋다. 의존성 테스트를 할때는 실제 외부 의존성을 사용하거나, Stub 혹은 Fake로 대체하자. ❤️ 3주차 후기 외부에 의존하는 인수 테스트 미션을 통해 외부 의존성에 대한 고민을 했던 것 ..

Study/이펙티브 자바

[Effective Java] 스트림 병렬화는 주의해서 적용하라

💥 개요 자바에서 동시성 프로그램을 작성하기가 점점 쉬워지고 있지만, 이를 올바르고 빠르게 작성하는 일은 어렵다. 동시성 프로그래밍을 할 때는 안정성(safety)과 응답 가능(liveness) 상태를 유지하기 위해 애써야 하는데, 병렬 스트림 파이프라인 프로그래밍에서도 다를 바 없다. ☠️ 스트림을 잘못 사용하는 예 아이템 45에서 다룬 메르센 소수를 생성하는 프로그램을 살펴보자 public class MersennePrimes { static Stream primes() { return Stream.iterate(TWO, BigInteger::nextProbablePrime); } public static void main(String[] args) { primes().map(p -> TWO.pow(..

Study/Next Step

[Next Step] ATDD, 클린 코드 with Spring 8기 2주차 리뷰

🎈 인수테스트 격리하기 인수 테스트를 격리하는 방법은 아래와 같다. @Transactional 어노테이션 활용 @DirtiesContext 어노테이션 활용 @Sql 혹은 쿼리 수행 코드 상으로 테이블 truncate 나의 경우에는 3번째 방법 중 쿼리를 사용하고 @interface로 선언하여 클래스단에 어노테이션을 붙이면 쉽게 사용할 수 있도록 하였다. 이 방법은 DB마다 동작하지 않을 수 있지만, JPA에서 @Embeddable과 같이 중간 테이블이 생기는 경우도 초기화를 쉽게 할 수 있어서 이 방법을 선택했다. @Transactional RANDOM_PORT나 DEFINED_PORT 사용 할 경우 실제 서블릿 환경이 제공됨 HTTP Client와 Server는 다른 스레드에서 동작 따라서 @Trans..

Study/Next Step

[Next Step] ATDD, 클린 코드 with Spring 8기 1주차 리뷰

ATDD-Subway-Map 이라는 프로젝트를 Next Step에서 시작하게 되었다. Book-Crew 라는 기술서적을 읽고, 서로 리뷰하고 모르는걸 찾아보면서 공부하는 스터디를 진행하고 있는데, 스터디원중에 한분께서 Next Step을 추천하셨고, 정말 많은 도움을 얻었다고 들었다. 이번 교육의 일정은 아래와 같다. 📻 교육일정 교육 기간은 2024-01-22(월) ~ 2024-02-29(목) 입니다. 교육기간 동안 온라인 강의는 라이브로 진행될 예정이며 교육기간 중 매주 목요일에 5회 진행됩니다. 첫 강의 전에 교육이 시작되는 이유는 사전 미션 및 강의 수강 준비를 위해서입니다. 1월 25일: 1주차 강의 2월 1일: 2주차 강의 2월 3일: 모짝미(모여서 짝 프로그래밍 미션) 희망자에 한해서 오프라..

Study/이펙티브 자바

[Effective Java 3E] 제네릭과 가변인수를 함께 쓸 때는 신중하라

💥 개요 가변인수와 제네릭은 잘 어우러지지 않는다. 가변인수 메서드를 호출하면 가변인수를 담기 위한 배열이 자동으로 하나 만들어지는데(컴파일 시점에 변환됨) 내부적으로 처리해야하는 이 배열을 그만 클라이언트에 노출하는 문제가 생겼다. 그 결과 varargs 매개변수에 제네릭이나 매개변수화 타입이 포함되면 알기 어려운 컴파일 경고가 발생한다. 매개변수화 타입의 변수가 타입이 다른 객체를 참조하면 힙 오염이 발생한다. 이렇게 되면 typesafe하지 않아 형변환 에러가 발생하고 제네릭 타입의 타입 안정성이 흔들린다. ☠️문제상황 public class Dangerous { // 코드 32-1 제네릭과 varargs를 혼용하면 타입 안전성이 깨진다! (191-192쪽) static void dangerous(..

Study/이펙티브 자바

[Effective Java 3E] 한정적 와일드카드를 사용해 API 유연성을 높이라

💥 개요 이전 포스팅에서 얘기했듯이 매개변수화 타입은 불공변이다. 즉 서로 다른 타입 Type1 , Type2가 있을 때 List은 List의 상위타입도 하위 타입도 아니다. List에는 어떤 객체든 넣을 수 있지만 List은 문자열만 넣을 수 있다. 즉, List은 List가 하는 일을 제대로 수행하지 못하니 하위타입이 될 수 없다.(리스코프 치환 원칙에 어긋난다.) 때로는 불공변 방식보다 유연한 무언가가 필요하다. 🛠️ 와일드 카드 타입 적용 이런 경우 와일드 카드 타입으로 해결이 가능하다. public class Stack { private E[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 1..

mntdev
'Study' 카테고리의 글 목록 (2 Page)