BE/Java

· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 50. 적시에 방어적 복사본을 만들라 클라이언트가 객체의 불변식을 깨뜨리지 못하도록 프로그래밍을 해야한다. 어떤 객체든 그 객체의 허락 없이는 외부에서 내부를 수정하는 일은 불가능하지만, 자칫 잘못하면 내부를 수정하도록 허락하는 경우가 생긴다. ex 1) 기간을 표현하는 클래스 (불변을 지키지 못함) // 기간을 표현하는 클래스 public final class Period { private final Date start; private final Date end; /** * @param start 시작 시각 * @param end 종료 시각. 시작 시각보다 뒤여야 한다. * @throws IllegalA..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 49. 매개변수가 유효한지 검사하라 메서드와 매개변수 메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족해야 한다. ex) 인덱스 값은 음수가 아니어야 하며, 객체 참조는 null이 아니어야 한다 등등 이러한 제약은 반드시 문서화를 해야 하며 메서드 몸체가 시작되기 전에 검사해야한다. 메서드 몸체가 실행되기 전에 매개변수를 확인한다면 잘못된 값이 넘어왔을 때 즉각적으로 예외 처리를 할 수 있다. 매개변수 검사를 제대로 못했을 때의 문제점 메서드가 수행되는 중간에 모호한 예외를 던져 원인을 찾는 데 헤맬 수 있다. 메서드가 잘 수행되지만 잘못된 결과를 반환할 수 있다. public 과 prote..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 48. 스트림 병렬화는 주의해서 적용하라 병렬화 자바 8부터 parallel 메서드만 한 번 호출하면 파이프라인을 병렬 실행시할 수 있는 스트림을 지원한다. 동시성 프로그래밍을 할 떄는 안정성과 응답 가능 상태를 유지해야 하는데, 병렬 스트림 파이프라인 프로그래밍에서도 마찬가지이다. ex 1) 스트림을 사용해 처음 20개의 메르센 소수를 생성하는 프로그램 public static void main(String[] args) { primes().map(p -> TWO.pow(p.intValueExact()).subtract(ONE)) .filter(mersenne -> mersenne.isProbablePr..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 47. 반환 타입으로는 스트림보다 컬렉션이 낫다. 원소 시퀀스 일련의 원소를 반환하는 메서드 ex) Collection, Set, List, Iterable, 배열 기본은 컬렉션 인터페이스이다. 자바 8이 스트림을 지원하기 시작하면서 적합한 타입을 선택하는 것은 복잡해졌다. 스트림은 반복을 지원하지 않기 때문에, 스트림과 반복을 알맞게 조합해야 좋은 코드가 나온다. ex 1) 자바 타입 추론 실패 예 for (ProcessHandle ph : ProcessHandle.allProcesses()::iterator) { // 프로세스를 처리한다. } 이 코드는 컴파일 오류가 발생한다. ex 2) 스트림을 반복..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 46. 스트림에서는 부작용 없는 함수를 사용하라 스트림 패러다임 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성 하는 부분이다. 이 때, 각 변환 단계는 가능한 한 이전 단계의 결과를 받아 처리하는 순수 함수여야 한다. 순수 함수 오직 입력만이 결과에 영향을 주는 함수 다른 가변 상태를 참조하지 않고, 함수 스스로도 다른 상태를 변경하지 않는다. 이렇게 하려면 중간 단계든 종단 단계든 스트림 연산에 건네는 함수 객체는 모두 부작용이 없어야 한다. ex 1) 스트림 패러다임을 이해하지 못한 예 Map freq = new HashMap(); try (Stream words = new Scanner(fi..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 45. 스트림은 주의해서 사용하라 스트림 다량의 데이터 처리 작업(순차 or 병렬)을 돕고자 자바 8에 추가되었다. 스트림(stream)은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다. 스트림 파이프라인(stream pipeline)은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다. 스트림의 원소들은 어디서로부터 올 수 있다. ex) 컬렉션, 배열, 파일, 정규표현식 패턴 matcher, 난수생성기 등 스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값이다. 기본 타입 값으로는 int, long, double 세 가지를 지원한다. 스트림 파이프라인 소스 스트림에서 시작해 종단 연산으로 끝나며, ..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 44. 표준 함수형 인터페이스를 사용하라 자바가 람다를 지원하면서 API를 작성하는 모범 사례가 바뀌었다. 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 템플릿 메서드 패턴의 매력이 크게 줄었다. 이를 대체하는 현대적인 해법은 같은 효과의 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 것이다. 이 내용을 일반화해서 말하면 함수 객체를 매개 변수로 받는 생성자와 메서드를 더 많이 만들어야 하는데, 이 때 함수형 매개변수 타입을 올바르게 선택해야 한다. ex 1) LinkedHashMap의 removeEldestEntry protected boolean removeEldestEntry(Map..
· BE/Java
이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다. 아이템 43. 람다보다는 메서드 참조를 사용하라 메서드 참조(method Reference) ex 1) 임의의 키와 Integer 값의 매핑을 관리하는 프로그램의 일부 map.merge(key, 1, (count, incr) -> count + incr); 이 코드는 키가 맵 안에 없다면 키와 숫자 1을 매핑하고, 있다면 기존 매핑값을 증가시킨다. 값이 키의 인스턴스 개수로 해석된다면, 이 프로그램은 멀티셋을 구현한게 된다. merge : 키, 값, 함수를 인수로 받으며 주어진 키가 맵 안에 없다면 주어진 {키, 값} 쌍을 그대로 저장한다. 반대로, 키가 있다면 인자로 받은 함수를 현재 값과 주어진 값에 적용한 ..
멍목
'BE/Java' 카테고리의 글 목록 (9 Page)