2024/12 77

[Effective Java] 8-2. 메서드

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 다중정의는 신중히 사용하라다중정의한 메서드는 정적으로 선택됨오버로딩의 호출 메서드는 컴파일 타임에 정해짐public class CollectionClassifier { public static String classify(Set s) { return "set"; } public static String classify(List list) { return "list"; } public static String classify(Collection c) { return "collection"; } public static void main(String[] args) { Collecti..

Java 2024.12.31

[Effective Java] 8-1. 메서드

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 매개변수가 유효한지 검사하라메서드 몸체가 실행되기 전에 오류 검출하기 Null Checkjava.util.Objects.requireNonNull유연하고 사용하기 편함입력을 그대로 반환 Assertprivate static void sort(long[] a, int offset, int length) { assert a != null; assert offset >= 0 && offset = 0 && length 인자의 값 유효성 체크 2. 적시에 방어적 복사본을 만들라자바는 불변식을 지켜주는 언어메모리 충돌 오류버퍼 오버런, 배열 오버런, 와일드 포인터 프로그래밍 방식클라이언트가 불변식을 깨뜨리려 한다 가정하..

Java 2024.12.31

[Effective Java] 7-3. 람다와 스트림

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 반환 타입으로는 스트림보다 컬렉션이 낫다원소 시퀀스 반환시, 스트림 처리와 반복 처리 모두를 만족시키도록 노력하자스트림은 반복을 지원하지 않음Iterable 확장 X반복문에서 사용하기 어려움그러나, Iterable이 정의한 추상 메서드를 모두 정의함 Collection이나 그 하위타입을 쓰자Iterable의 하위타입stream 메서드도 지원함 하위 타입 사용 시 주의점메모리가 큰 시퀀스를 무작정 메모리에 올리면 안됨 예멱집합 원소 배열public class PowerSet { public static final Collection> of(Set s) { List src = new ArrayList(..

Java 2024.12.31

[Effective Java] 7-2. 람다와 스트림

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 스트림은 주의해서 사용하라스트림데이터 원소의 시퀀스유한 혹은 무한컬렉션, 배열, 파일, 정규표현식 패턴 매처 등다량의 데이터 처리 작업을 돕고자 추가됨 (Java 8) 파이프라인원소들로 수행하는 연산 단계순차적으로 수행됨플루언트 API로 메서드 연쇄를 지원 시작소스 스트림으로 시작 중간연산한 스트림을 다른 스트림으로 변환함 종단 연산마지막 중간 연산이 내놓은 스트림에 최후의 연산을 수행함지연 평가무한 스트림이 이루어지도록 함 주의사항재사용 불가Stream stream = Stream.of("a", "b", "c");stream.forEach(System.out::println);// 재사용하려 하면 예외 발생stream..

Java 2024.12.31

[Effective Java] 7-1. 람다와 스트림

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. 익명 클래스보다는 람다를 사용하라람다 함수Collections.sort(words, new Comparable() { public int compare(String s1, String s2) { return Integer.compare(s1.length(), s2.length()); } }Collections.sort(words, (s1, s2) -> Integer.compare(s1.length(), s2.length()));함수형 인터페이스의 인스턴스를 짧게 즉시 구현 장점간결함매개변수형의 타입 생략 가능컴파일러가 타입을 추론함직접 명시 가능 단점이름이 없어, 문서화 못함코드 자체로 동작이 명확..

Java 2024.12.31

[Effective Java] 6-3. 열거 타입과 애노테이션

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. @Override 애너테이션을 일관되게 사용하라@Override상위 타입의 메서드를 재정의하였음을 뜻함추상메서드를 재정의한 경우, 애너테이션을 달지 않아도 됨 2. 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라마커 인터페이스public interface Auditable {}public class User implements Auditable { private String name; private int age; // 생성자와 Getter/Setter public User(String name, int age) { this.name = name; this.age = ..

Java 2024.12.31

[Effective Java] 6-2. 열거 타입과 애노테이션

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. ordinal 인덱싱 대신 EnumMap을 사용하라EnumMap열거 타입을 키로 사용하도록 설계한 Map 구현체데이터와 열거타입을 매핑 장점 (vs 배열)효율성내부에서 배열을 사용타입 안전성생성자에 키에 대한 클래스 리터럴(한정적 타입 토큰) 전달런타임 제네릭 타입 정보 제공인덱스 계산 오류 X내부적으로 인덱스 범위와 계산을 처리해줌스트 Stream 사용그룹화Arrays.stream(garden) // garden 배열을 스트림으로 변환 .collect(groupingBy( // groupingBy를 사용해 그룹화 ..

Java 2024.12.31

[Effective Java] 6-1. 열거 타입과 애노테이션

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다.1. int 상수 대신 열거 타입을 사용하라정수 열거 타입public final class IntEnumPattern { public static final int APPLE_FUJI = 0; public static final int APPLE_PIPPIN = 1; public static final int APPLE_GRANNY_SMITH = 2; public static final int ORANGE_NAVEL = 0; public static final int ORANGE_TEMPLE = 1; public static final int ORANGE_BLOOD = 2;}타입 안정적이지 않음..

Java 2024.12.30

[Effective Java] 5-3. 제네릭: 고려 사항

조슈아 블로크 님의 "Effective Java" 책을 정리한 포스팅 입니다. 1. 제네릭과 가변인수를 함께 쓸 때는 신중하라제네릭 varargs 배열 매개변수에 값을 저장하는 것은 안전하지 않음가변인수는 내부적으로 타입의 배열을 생성함제네릭 타입의 배열은 생성 불가생성 시, 힙 오염 발생 힙 오염public class Example { public static void unsafeMethod(T... args) { Object[] array = args; // args는 T[] 타입 배열로 생성됨 array[0] = "String"; // 런타임에는 Object로 처리되어 컴파일 가능 T t = args[0]; // ClassCastExc..

Java 2024.12.30

[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