분류 전체보기 414

[Effective Java] 5-2. 제네릭: 권고 사항

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 배열보다는 리스트를 사용하라배열은 공변Object[] objArray = new Long[1];objArray[0] = "hello"; // 런타임에 ArrayStoreException 발생구현 타입으로 변경됨잘못된 타입이 할당될 경우, 런타임에 예외 발생  제네릭은 불공변List ol = new ArrayList(); // 호환 X. 컴파일 타임에 오류 발생!ol.add("hello");매개변수 타입과 관련없이 제네릭 타입은 서로 다른 타입일치하지 않을 경우, 컴파일 타임에 오류 2. 이왕이면 제네릭 타입으로 만들라클래스 선언에 매개변수 타입을 추가하기 3. 이왕이면 제네릭 메서드로 만들라타입 매개변수 목록 메서드의 ..

Java 2024.12.28

[Effective Java] 5-1. 제네릭: 제한 사항

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 로 타입은 사용하지 말라타입제네릭 타입제네릭 클래스: 클래스 선언에 타입 매개변수가 쓰인 클래스제네릭 인터페이스: 인터페이스 선언에 타입 매개변수가 쓰인 인터페이스 매개변수화 타입타입 매개변수의 타입 로 타입제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때호환성 때문에 남아있음 제네릭 타입 권고타입 안정성컬렉션에서 원소를 꺼내는 모든 곳에 보이지 않는 형변환을 추가 디버깅오류는 가능한 컴파일 타임에 발견하는 것이 좋음런타임에 발견 시, 원인 제공 코드를 발견하기 어려움 제네릭 규칙소거 방식컴파일 후, 런타임에 타입 정보가 제거되는 방식하위 호환성을 위해 소거 방식으로 구현되었음 하위 타입 규칙List objectLi..

Java 2024.12.27

[Effective Java] 4-4. 클래스와 인터페이스: 클래스

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 태그 달린 클래스보다는 클래스 계층구조를 활용하라태그 달린 클래스public class Shape { // 태그 필드 public enum ShapeType { CIRCLE, RECTANGLE } private final ShapeType type; // CIRCLE에만 필요한 필드 private double radius; // RECTANGLE에만 필요한 필드 private double width; private double height; // 생성자: 원 public Shape(double radius) { this.type = ShapeType.CIR..

Java 2024.12.27

[Effective Java] 4-3. 클래스와 인터페이스: 인터페이스

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 추상 클래스보다는 인터페이스를 우선하라추상클래스상속을 통한 재사용기본적인 구현을 제공일부 메서드를 abstract로 선언하여 하위 클래스가 이를 구현하도록 요구추상클래스가 정의한 타입을 구현한는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 함 인터페이스믹스인 정의주된 기능에 선택적 기능을 혼합기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 추가 가능 계층구조가 없는 타입 프레임워크 생성 가능인터페이스가 선언한 메서드를 정의하고 규약을 지킨다면 어떤 클래스를 확장했던 같은 타입현실세계의 다양한 모델을 표현하는데 유용 2. 인터페이스는 구현하는 쪽을 생각해 설계하라디폴트 메서드인터페이스 메서드의 기본 구현을 제공하는..

Java 2024.12.27

[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