본문 바로가기

이펙티브자바35

[Effective Java] 아이템51 메서드 시그니처를 신중히 설계하라 ■ 메서드 이름을 신중히 짓자 항상 표준 명명 규칙을 따라야하고, 같은 패키지에 속한 다른 이름들과 일관되게 짓는게 최우선 목표이다. 그 다음 목표는 개발자 커뮤니티에서 널리 받아들여지는 이름을 사용하는 것이다. ■ 편의 메서드를 너무 많이 만들지 말자 모든 메서드는 각각 자신의 소임을 다해야한다. 메서드가 너무 많은 클래스는 익히고, 사용하고, 문서화하고, 테스트하고 유지보수하기 어렵다. 메서드가 너무 많으면 이를 구현하는 사람과 사용하는 사람 모두를 고통스럽게한다. ■ 매개 변수 목록은 짧게 유지하자 4개 이하가 좋다. 특히 같은 타입의 매개변수가 연달아 여러개 나오는 경우가 특히 해롭다. 순서를 바꿔 입력해도 그대로 컴파일되고 실행된다. 첫번째로 여러 메서드로 쪼개서 매개변수를 줄이는 방법이있다. .. 2021. 7. 4.
[Effective Java] 아이템49 매개변수가 유효한지 검사하라 ■ 매개 변수가 유효한지 검사하라 메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바란다. 이런 제약은 반드시 문서화해야 하며 메서드 몸체가 시작되기전에 검사해야 한다. 안그러면 실행되다가 예외가 발생할 수 있고, 더 나쁜 경우는 잘못된 값을 반환할 수 있다. public, protected 메서드는 매개변수 값이 잘못됐을 때 던지는 예외를 문서화 해야한다. /** * Returns a BigInteger whose value is {@code (this mod m}). This method * differs from {@code remainder} in that it always returns a * non-negative BigInteger. * * @param m the mod.. 2021. 7. 4.
[Effective Java] 아이템48 스트림 병렬화는 주의해서 적용하라 자바 8부터는 parallel 메서드만 한 번 호출해서 파이프라인을 병렬 실행할 수 있는 스트림을 지원한다. 다음은 메르센 소수를 생성하는 프로그램에서 속도를 높이기 위해서 스트림 파이프라인의 parallel()을 호출 해봤다고하자. import java.math.BigInteger; import java.util.stream.Stream; public class StreamPallelExample { public static void main(String[] args) { //20개의 메르센 소수 생성 primes().map(p -> (BigInteger.TWO).pow(p.intValueExact()).subtract(BigInteger.ONE)) .parallel() .filter(mersenne .. 2021. 6. 29.
[Effective Java] 아이템47 반환 타입으로는 스트림보다 컬렉션이 낫다 ■ 반환타입 선택 원소 시퀀스, 즉 일련의 원소를 반환하는 메서드는 많다. Collection, List, Set과 같은 컬렉션 인터페이스, 혹은 Iterable이나 배열을 사용했다. 자바 8에서는 스트림이 도입되면서 선택지가 복잡해졌다. 스트림은 반복을 지원하지 않는다. 따라서 스트림과 반복을 알맞게 조합해야 좋은 코드가 나온다. 여기서 재밌는 사실 하나는 Stream인터페이스는 Iterable 인터페이스의 추상 메서드를 모두 정의해 놓았지만 Iterable을 확장하지 않았다는 문제가 있다. 어댑터 메서드를 사용하면 스트림을 iterate로 변경할 수 있다. //Stream를 Iterable로 중개해주는 어댑터 public static Iterable iterableOf(Stream stream) { .. 2021. 6. 29.
[Effective Java] 아이템46 스트림에서는 부작용 없는 함수를 사용하라 ■ 스트림에서는 부작용 없는 함수를 사용하라 스트림은 함수형 프로그래밍에 기초한 패러다임이다. 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 부분이다. 이때 각 단계는 가능한 한 이전 단계의 결과를 받아 처리 하는 순수 함수여야 한다. 순수 함수란 입력만이 결과에 영향을 주는 함수이다. 다른 가변 상태를 참조하지도 않고, 함수 스스로도 다른 상태를 변경하지 않는다. 이렇게 하려면 스트림 연산에 건네는 함수 객체는 모두 부작용이 없어야한다. 아래 코드는 텍스트 파일에서 단어별 수를 세어 map에 저장하고 있는 코드이다. 메서드 참조도 사용했고, 결과도 올바르지만 이는 스트림 코드라 할 수 없다. 스트림 API의 이점을 살리지 못하여 같은 기능의 반복 코드 보다 길고, 읽기 어렵고 유지보수 에도.. 2021. 6. 28.
[Effective Java] 아이템45 스트림은 주의해서 사용하라 ■ 스트림 API 핵심 스트림은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻한다. 스트림 파이프 라인은 이 원소들이 수행하는 연산 단계를 표현하는 개념이다. 스트림 원소들은 어디로부터든 올 수 있다. 대표적으로는 컬렉션, 배열, 파일, 정규표현식 패턴 매치, 난수 생성기, 혹은 다른 스트림이 있다. ■ 스트림 파이프라인 특징 스트림 파이프라인은 소스스트림 -> (중간연산) -> 종단연산 으로 이루어진다. 중간연산을 합친 다음에 합쳐진 중간연산을 최종 연산으로 한번에 처리 -> Lazy ◈ 중간연산 스트림을 변환하며 결과 스트림의 원소 타입은 시작 스트림의 원소 타입과 같을 수도 있고, 다를 수도 있다. 1. sorted Stream sorted = operands.stream().sorted(); 2. f.. 2021. 6. 27.