자바

Study/이펙티브 자바

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

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

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/이펙티브 자바

[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] 배열보다는 리스트를 사용하라

💥 개요 배열과 제네릭 타입에는 중요한 차이가 두가지 있다. 배열의 경우 Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Superp[]의 하위 타입이 된다.(공변) 하지만 제네릭은 불공변이다. List가 List의 하위 타입이 아니다.(불공변) 그럼 제네릭이 더 안 좋은걸까? 배열의 문제점 Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라 넣을 수 없다."; // ArrayStoreException을 던진다. 위의 코드는 런타임에 실패한다. 하지만 다음 코드는 컴파일 시점에 실패한다. List ol = new ArrayList(); // 호환되지 않는 타입이다. ol.add("타입이 달라 넣을 수 없다."); 어느쪽이든 문자열을 넣..

Study/우아한 테크 코스

[우아한 테크 코스] 프리코스 - 1주차, 숫자 야구 회고

[1일차] 처음에 뭐부터 할지 고민하다 기능 목록을 먼저 정의하라는 요구사항에 따라 기능 목록을 작성했다. 기능 목록을 어떤식으로 나타내야 사용자에게 보기 좋을까? 를 생각했고, 나라면 그림이 제일 위에 있으면 좋겠다 라고 생각해서 다이어그램을 그리기로 했다. 그 전에 꼼꼼하게 진행방식, 미션 제출 방법, 체크리스트 등을 꼼꼼하게 다 읽고 기능 요구 사항을 살펴봤다. 간단해보이지만 단순하게 코딩테스트처럼 문제를 푸는것을 원하지 않기에, 그리고 자바를 통한 개발이 익숙하지 않아 학부때 배운 책을 다시 펴고 이 문제는 어떻게 해결하지? 라는 생각부터 했다. 그 이후에는 어느정도 정리가 돼서 내가 개발할 대략적인 그림을 플로우 차트를 통해서 그리기로 마음을 먹었고, 머메이드의 Docs를 통해 다이어그램을 그리..

Study/이펙티브 자바

[Effective Java 3E] 클래스와 멤버의 접근 권한을 최소화하라

💥 개요 잘 설계된 컴포넌트는 클래스 내부 데이터와 내부 구현 정보를 얼마나 잘 숨겼느냐 입니다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리합니다. 오직 API만을 통해 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 영향을 끼치지 않는데 이것을 정보 은닉, 혹은 캡슐화라고 합니다. ( 소프트웨어 설계의 근간이 되는 원리) 👍 정보 은닉의 장점 정보 은닉의 장점은 정말 많습니다. 그중 대부분은 컴포넌트를 서로 독립시켜서 개발, 테스트, 최적화, 적용, 분석, 수정을 개별적으로 할 수 있게 해주는 것과 연관이 되어있습니다. 시스템 개발 속도를 높인다. 각 컴포넌트를 병렬로 개발이 가능 시스템 관리 비용을 낮춘다. 작은 컴포넌트로 나눠 빨리 파악할 수 있고 디..

mntdev
'자바' 태그의 글 목록