분류 전체보기 612

[Effective Java] 3. 모든 객체의 공통 메서드

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. equals()는 일반 규악을 지켜 재정의하라정의하지 않으면 참조 주소값만 가지고 동치여부를 따짐 재정의할 필요 없는 경우싱글턴 인스턴스일 경우상위 클래스에서 재정의한 equals()가 하위 클래스에도 동일AbstractSet - SetAbstractList - List 재정의할 필요 있는 경우상위 클래스가 equals()를 정의하지 않았을 경우값 클래스Map의 keySet의 원소 2. hashCode()도 재정의해라equals()만 재정의할 경우, hash값으로 동치성을 판별하는 컬렉션 사용 시 결과가 이상하게 나옴 hashCode() 규약hashCode()값을 생성할 때, 반드시 핵심 필드가 포함되어야 함hashCod..

Java 2024.12.27

[Effective Java] 2-8. 객체 생성과 파괴: 소멸자 사용을 피하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 소멸자 사용 피하기Finalizer자바에서 객체가 더이상 필요하지 않을 때 정리 작업을 수행하는 매커니즘권장되지 않음 예측 불가GC가 객체를 회수한 후에만 실행됨실행 시점이나 실행 여부를 보장할 수 없음GC 알고리즘에 따라 실행 타이밍이 달라질 수 있음 성능 문제추가적인 처리 비용 발생 대체 방안 존재명시적인 종료 메서드try-with-resources 구문 2. Try-With-Resourcestry ( InputStream in = new FileInputStream("input.txt"); OutputStream out = new FileOutputStream("output.txt")) { byte[..

Java 2024.12.27

[Effective Java] 2-7. 객체 생성과 파괴: 다 쓴 객체의 참조를 해제하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 자바의 메모리 관리GC를 통해 메모리를 자동으로 관리모든 상황에서 GC가 적절히 회수하도록 보장할 수 없음개발자가 메모리 누수를 방지하기 위한 추가 조치를 취해야 함 2. 메모리 누수 발생 사례Stackpublic 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) { ..

Java 2024.12.27

[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