Java 92

[Effective Java] 4-2. 클래스와 인터페이스: 상속보다는 컴포지션을 사용하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 상속 주의사항재정의할 수 있는 메서드들이 내부적으로 어떻게 사용되는지 문서화하기API 호출에 사용되는 경우/** * Removes all elements from this collection. * * Implementation Requirements: * This method internally calls `removeRange(0, size())`. * If `removeRange` is overridden in a subclass, the behavior of this method * will change accordingly. */public void clear() { removeRange(0, size()..

Java 2024.12.27

[Effective Java] 4-1. 클래스와 인터페이스: 클래스와 멤버의 접근 권한을 최소화하라

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 내부 정보를 외부로부터 잘 숨기기캡슐화구현과 API를 분리컴포넌트들을 서로 분리시켜 개별적인 작업 수행 가능테스트, 최적화, 분석 등 정보 은닉 (접근 제한자)모든 클래스와 멤버의 접근성을 가능한 좁혀야 함 2. 접근성 제약사항리스코프 치환 원칙상위 클래스의 메서드를 재정의할 때, 접근 수준을 상위 클래스에서보다 더 좁게 설정 불가상위 클래스의 인스턴스는 하위 클래스의 인스턴스로 대체가 가능해야 하기 때문어길 경우, 컴파일 타임에서 오류 발생 3. public 필드를 지양하라값 제한 불가불변식 위반외부 코드에서 필드에 직접 접근하여 부적절한 값으로 설정할 수 있음 스레드 안정성외부에서 직접 수정할 수 있다면 멀티스레드 환..

Java 2024.12.27

[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

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