분류 전체보기 414

[Effective Java] 2-5. 객체 생성과 파괴: 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 정적 유틸리티 클래스와 싱글턴 패턴의 한계강한 결합 발생구현에 의존함 테스트 어려움 각 테스트 케이스별로 독립적으로 실행되어야 함테스트 간 상태 공유가 일어날 수 있음공유 자원이 존재할 경우, 다른 테스트에서 영향을 받을 수 있음 멀티스레드 환경여러 스레드가 동시에 자원을 접근하고 수정할 수 있음상태를 공유하는 방식이 경쟁 상태가 발생할 수 있음 2. 의존 객체 주입협력 객체의 인스턴스 생성 시, 생성자에 필요한 자원을 넘겨주는 방식협력하는 객체를 직접 인스턴스로 생성 X 느슨한 결합 인터페이스 타입으로 협력 객체를 받도록 선언어떤 구현체이든 주입하여 사용할 수 있음 테스트 대역 확보테스트 시 mock 객체를 넘겨주어 진..

Java 2024.12.27

[Effective Java] 2-4. 객체 생성과 파괴: 인스턴스화를 막으려거든 private 생성자를 사용하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. private 생성자인스턴스를 생성하지 못하게 막기위한 효과적인 방법컴파일러가 자동으로 생성자를 생성하지 않게 만듬외부에서 생성자 호출이 불가 2. 유틸리티 클래스주로 메서드만 모아놓은 클래스클래스 자체에서 직접 메서드를 호출해서 사용하려 설계됨인스턴스 생성 X

Java 2024.12.27

[Effective Java] 2-3. 객체 생성과 파괴: private 생성자나 열거 타입으로 싱글턴임을 보장하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 싱글턴특정 클래스의 인스턴스를 오직 하나만 생성하는 디자인 패턴 특징무상태 객체함수 설계상 유일해야 하는 객체시스템 컴포넌트 2. 생성 방식인스턴스 필드static final 필드값이 초기화됨public class Yundle { public static final Yundle INSTANCE = new Yundle(); private Yundle() {} public static void main(String[] args) { Yundle yundle = Yundle.INSTANCE; }} 정적 팩토리제네릭 활용 가능public class MetaElvis { private st..

Java 2024.12.27

[Effective Java] 2-2. 객체 생성과 파괴: 생성자에 매개변수가 많다면 빌더를 고려하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 점층적 생성자 패턴매개변수에 따라 만들 수 있는 생성자를 만드는 방법선택적 매개변수가 많을 때 적절한 대응을 위해 사용됨 단점개수가 많아지면 읽거나 쓰는 것이 어려움런타임때 엉뚱한 동작을 해야 잘못되었음을 알게됨 2.자바빈즈 패턴기본 생성자로 객체를 만들고 setter를 호출하여 값을 설정하는 패턴 단점객체를 불변으로 만들 수 없음객체가 완전히 생성되기 전까지는 일관성이 무너진 상태일관성이 깨진 객체가 생성되면, 프로그램에 문제가 생김이를 찾기 위한 디버깅이 어려움 3. 빌더 패턴동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는 방법필수 매개변수만으로 이루어진 생성자를 가지고 빌더 객체를 얻음 장점매개변수를 여러개..

Java 2024.12.26

[Effective Java] 2-1. 객체 생성과 파괴: 생성자 대신 정적 팩토리 메서드를 고려하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 정적 팩토리 메서드클래스는 생성자와는 별도로 static factory method 제공이 가능함 2. 장점이름을 가짐반환될 객체의 특성이 묘사되도록 할 수 있음public static Order primeOrder(Product product) { Order order = new Order(); order.prime = true; order.product = product; return order;}public static Order urgentOrder(Product product) { Order order = new Order(); order.urgent = true; orde..

Java 2024.12.26

[JVM 밑바닥까지 파헤치기] 12-3. 자바 메모리 모델과 스레드: 스레드

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 스레드 구현OS 스레드다양한 하드웨어와 운영체제에서 운용할 수 있는 통합된 개념핵심 메서드 모두가 네이티브 코드로 구현됨플랫폼 독립적으로 구현되기 어려운 점이 있음 커널 스레드 구현1:1 구현운영체제 커널에서 직접 지원각 프로세서에 스레드의 작업이 매핑됨사용할 수 있는 수가 제한적임시스템 콜로 스레드 연산이 이루어짐비용 높음 사용자 스레드 구현1:N 구현사용자 공간에서 구현되는 스레드 라이브러리사용자 스레드의 생성, 소멸, 동기화, 스케줄링은 커널의 도움없이 온전히 사용자 공간에서 처리됨 하이브리드 구현커널 스레드와 사용자 스레드를 함께 이용하는 방법 자바 스레드운영체제의 커널스레드로 구현됨 (HotSpotVM) 스케줄링시스템이..

Java 2024.12.26

[JVM 밑바닥까지 파헤치기] 12-2. 자바 메모리 모델과 스레드: 자바 메모리 모델

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 자바 메모리 모델다양한 하드웨어와 운영체제의 서로 다른 메모리 모델로부터 자바 프로그램을 보호하기 위함플랫폼에 상관없이 메모리를 일관된 방식으로 이용할 수 있음 2. 메모리 간 상호 작용메인 메모리모든 변수가 저장는 공간다양한 변수에 접근하는 규칙을 정의 작업 메모리각 스레드가 가지는 자체 작업 메모리격리되어 있음프로세스의 캐시와 비슷한 역할 프로토콜메인 메모리와 작업 메모리 간 상호작용을 위해 프로토콜이 정의됨read: 메인 메모리에서 데이터를 읽어 작업 메모리에 저장write: 작업 메모리에서 데이터를 읽어 메인 메모리에 저장load / store: 메인 메모리와 작업 메모리 간의 데이터 이동 VolatileJVM이 제공하..

Java 2024.12.26

[JVM 밑바닥까지 파헤치기] 12-1. 자바 메모리 모델과 스레드: 동시성

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 컴퓨터가 여러 작업을 동시에 수행하는 이유연산 성능과 저장 및 통신 성능의 격차가 크기 떄문프로세서가 요청한 자원의 대기 시간을 활용서버는 여러 클라이언트 요청을 동시에 처리하므로 동시 처리가 필수적 JVM은 동시성 프로그래밍의 어려움을 낮춰줌하드웨어 자원 분배동시성 프로그래밍 2. 하드웨어의 효율과 일관성캐시메모리 I/O는 연산작업에 비해 매우 느림이를 보완하고자 메모리와 CPU 사이의 계층을 둠필요한 데이터를 캐시에 복사해 두어 작업을 빠르게 수행작업이 완료되면 결과 데이터를 캐시에서 메모리로 동기화 공유 메모리 멀티프로세스 시스템프로세서별 캐시는 각각 존재캐시 일관성 프로토콜공유 공간인 메인 메모리와 동기화를 수행MSI, ..

Java 2024.12.25

[JVM 밑바닥까지 파헤치기] 11-2. 백엔드 컴파일과 최적화: JIT 컴파일러

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 적시 컴파일러핫코드들을 탐지하여 컴파일하고 최적화하여 실행 효율을 높임 2. 내장 컴파일러클라이언트 컴파일러빠른 컴파일과 기본 최적화 서버 컴파일러서버측 성능을 극대화하도록 설정된 컴파일러 고급 최적화죽은 코드 제거, 순환문 언롤링, 순환문 표현식 호이스팅범위 검사 제거, null 검사 제거 3. 계층형 컴파일서버 모드의 기본 컴파일 전략 계층 0인터프리터로 실행프로파일링 X 계층 1클라이언트 컴파일러 사용프로파일링 X기본 최적화만 계층 2클라이언트 컴파일러 사용기본 프로파일링만 (메서드 통계) 계층 3클라이언트 컴파일러 사용모든 프로파일링 계층 4서버 컴파일러 사용모든 프로파일링모든 최적화 4. 컴파일 대상과 촉발 조건핫코드자..

Java 2024.12.25

[JVM 밑바닥까지 파헤치기] 11-1. 백엔드 컴파일과 최적화: 백엔드 컴파일

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다1. 백엔드 컴파일클래스 파일을 로컬 환경에 맞는 네이티브 코드로 변환하는 과정성능을 결정하는 핵심 지표필수 X (명세 존재하지 않음) 2. 인터프리터컴파일 단계없이 즉시 실행초기 실행 속도가 빠름소량의 메모리 환경에서 유리컴파일러의 최적화 동작이 잘못될 경우 차선책으로 사용됨프로파일링 수행 (최적화된 컴파일을 위함) 3. 컴파일러프로그램이 실행되는 시간이 길 경우 유리자주 실행되는 코드를 네이티브 코드로 컴파일해 실행 효율이 높임

Java 2024.12.25