전체 글 609

[Effective Java] 2-6. 객체 생성과 파괴: 불필요한 객체 생성을 피하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. Stringnew실행될 때마다 인스턴스를 생성함 literal생성된 인스턴스를 재사용상수 풀에 캐싱됨 (interned된 문자열만 관리) 2. 정적 팩토리 메서드팩토리 메서드는 호출할 떄마다 객체를 생성하지 않음가변객체이더라도 사용중에 변경되지 않는다면, 재사용이 가능함불필요한 객체 생성을 피할 수 있음 3. 캐싱생성 비용이 비싼 객체인 경우 캐싱하여 재사용 Patternpublic class RomanNumerals { private static final Pattern ROMAN = Pattern.complie( "^(?-.)M*(C[MD]|D?C{0,3})" + "(X[..

Java 2024.12.27

[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) 예시더보기Mathpublic final class Math { private Math() {} // ... @IntrinsicCandidate public static double sin(double a) { return StrictMath.sin(a); // default impl. delegates to StrictMa..

Java 2024.12.27

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

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 싱글턴특정 클래스의 인스턴스를 오직 하나만 생성하는 디자인 패턴항목내용주요 목적- 전역적으로 공유되는 인스턴스 제공- 인스턴스 생성 비용 절감주로 사용되는 곳- 시스템 설정 관리자- 로깅 객체- 설계상 유일해야 하는 객체 (DB 커넥션 풀 등)특징- 일반적으로 무상태(stateless) 객체로 설계- 함수적 역할 수행이 많음 (입력 → 출력만 있음)- 전역 접근 지점 제공 (Class.getInstance()) 2. 생성 방식예) 인스턴스 필드더보기public class Yundle { public static final Yundle INSTANCE = new Yundle(); private Yundle() ..

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. 장점장점설명이름을 가질 수 있음생성자와 달리 이름으로 의미 전달 가능동일 시그니처 생성자 문제 해결매개변수만 다르고 타입이 같으면 컴파일 에러 발생 → 정적 메서드로 해결인스턴스 캐싱매번 새 객체를 생성하지 않고, 재사용 가능인스턴스 생성 통제싱글턴, 불변 객체, 생성 불가 등 구현 가능반환 타입을 하위 타입으로 지정 가능인터페이스 반환 → 실제 구현은 감춤입력값에 따라 다른 클래스 인스턴스 반환서브클래스를 숨기고, 조건 따라 인스턴스 선택반환 객체 클래스가 미리 없어도 됨정적 팩터리 메서드 작성 시점에 구현체가 없어..

Java 2024.12.26

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 스레드 구현OS 스레드다양한 하드웨어와 운영체제에서 운용할 수 있는 통합된 개념핵심 메서드 모두가 네이티브 코드로 구현됨항목커널 스레드 (1:1)사용자 스레드 (1:N)하이브리드 스레드구현 위치커널(운영체제 수준)사용자 공간 (라이브러리 수준)커널 + 사용자 공간매핑 방식사용자 스레드 1개 ↔ 커널 스레드 1개여러 사용자 스레드 ↔ 1개 커널 스레드여러 사용자 스레드 ↔ 여러 커널 스레드시스템 콜 필요모든 스레드 작업에 필요필요 없음상황에 따라 사용비용높음 (커널 호출 발생)낮음 (컨텍스트 스위치 빠름)중간병렬 처리가능 (다중 CPU 활용 가능)불가능 (동시 실행 불가)가능유연성낮음높음 (유저가 직접 관리)높음단점커널 자원 한정..

Java 2024.12.26

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

저우즈밍 님의 "JVM 밑바닥까지 파헤치기" 책을 정리한 포스팅 입니다 1. 자바 메모리 모델다양한 하드웨어와 운영체제의 서로 다른 메모리 모델로부터 자바 프로그램을 보호하기 위함플랫폼에 상관없이 메모리를 일관된 방식으로 이용할 수 있음 2. 메모리 간 상호 작용항목메인 메모리 (Main Memory)작업 메모리 (Working Memory)정의모든 공유 변수가 저장되는 공간각 스레드가 가지는 고유한 메모리 공간접근 가능성모든 스레드가 접근 가능해당 스레드만 접근 가능역할프로그램 전역 상태 저장메인 메모리의 복사본으로 작업 수행데이터 이동read/write 명령어로 작업 메모리와 상호작용load/store 명령어로 메인 메모리와 동기화특성데이터 일관성을 위한 기준점계산은 여기서 수행되고, 결과는 메인 메..

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. 내장 컴파일러구분특징목적/사용 시점클라이언트 컴파일러 (C1)빠른 컴파일 속도기본적인 최적화 적용GUI 프로그램빠른 응답성 중시서버 컴파일러 (C2)상대적으로 느린 컴파일복잡하고 고급 최적화 수행- 죽은 코드 제거, 범위 검사 제거, null 검사 제거- 루프 언롤링, 루프 호이스팅서버 환경장시간 실행되는 애플리케이션 최적화 3. 계층형 컴파일서버 모드의 기본 컴파일 전략계층컴파일러 종류프로파일링최적화 수준설명0없음 (인터프리터)❌❌초기 실행. 빠른 시작을 위한 인터프리터 실행1클라이언트 컴파일러(C1)❌기본 최적화간단한 최적화로 빠른 컴파일2클라이언트..

Java 2024.12.25