Java

Study/이펙티브 자바

[Effective Java] 스레드 안전성 수준을 문서화하라

💥 개요한 메서드를 여러 스레드가 동시에 호출할 때 그 메서드가 어떻게 동작하느냐는 해당 클래스와 이를 사용하는 클라이언트 사이의 중요한 계약과 같다. 아무 언급도 없으면 가정을 해야하고, 그 가정이 틀리면 동기화를 충분히 못하거나 지나치게한 상태일 것이며, 두 가지 심각한 오류로 이어질 수 있다. ⚠️ 자바독 기본 옵션 생성 API 문서는 synchronized가 포함되지 않는다.메서드 선언에 synchronized 한정자를 선언할지는 구현 이슈일 뿐 API에 속하지 않는다.멀티 스레드 환경에서도 API를 안전하게 사용하게 하려면 클래스가 지원하는 스레드 안전성 수준을 정확히 명시해야 한다. 일반적인 경우 스레드 안전성이 높은 순서는 아래와 같다.불변(immutable) : 이 클래스의 인스턴스는 마..

Study/이펙티브 자바

[Effective Java] 과도한 동기화는 피하라

💥 개요과도한 동기화는 성능을 떨어뜨리고, 교착상태에 빠뜨리고 심지어 예측할 수 없는 동작을 낳기도 한다.응답 불가와 안전 실패를 피하려면 동기화 메서드나 동기화 블록 안에서는 제어를 절대 클라이언트에 양도하면 안 된다.아래는 동기화 영역 안에서 해서 안되는 예시이다.재정의할 수 있는 메서드 호출클라이언트가 넘겨준 함수 객체 호출 ⚠️ 구체적인 예시// Broken - invokes alien method from synchronized block!public class ObservableSet extends ForwardingSet { public ObservableSet(Set set) { super(set); } private final List> observers ..

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(..

Languege/Java & Spring

[String Constant Pool] Heap? PermGen? 오해와 진실

🎈 개요 기술 면접을 준비하고 보던 도중, 한 면접관님께서 이런 질문을 하셨습니다. Q.문자열을 String str = "hello"; 라고 선언하면 어떻게 되나요? A.JVM 메모리 내의 Heap 영역에 있는 String Constant Pool에 저장이 됩니다. Q.String Constant Pool이 Heap영역에 저장되는게 맞아요?? 저는 당연히 Heap 영역 내부에 저장되는거 아니야? 라고 생각했습니다.(블로그를 통해서 학습 하신분은 반은 맞다. 라고 생각하실 수 있을거 같아요, 보통 Heap안에 PermGen안에 String Constant Pool이 있다고 설명함) 정확히, JAVA 7까지는 Permgen에 저장되고 JAVA 8 이후부터는 NativeMemory 내부의 Metaspace에 ..

Study/이펙티브 자바

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

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

Study/이펙티브 자바

[Effective Java 3E] 이왕이면 제네릭 타입으로 만들라

💥 개요 JDK가 제공하는 제네릭 타입과 메서드를 사용하는 일은 일반적으로 쉬운 편이지만, 제네릭 타입을 새로 만드는 일은 조금 더 어렵다. 그래도 배워두면 값어치는 충분히 한다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public Object pop() { if (size =..

mntdev
'Java' 태그의 글 목록