본문 바로가기

이펙티브 자바

(61)
[이펙티브 자바] 아이템 53. 가변인수는 신중히 사용하라 가변인수 : 메서드에 전달하는 인수의 개수를 유연하게 할 수 있는 편리한 기능. 장점 : 유연성, 가독성단점 :오버로드의 모호성 : 메서드 오버로드 시 가변인수가 다른 오버로드된 메서드와 충돌할 수 있다성능 : 가변인수는 배열로 변환되기 때문에 성능에 약간의 오버헤드가 있다.타입 안정성 : 컴파일 타임에 타입 안정성이 완전히 보장되지 않는다. 핵심 정리 : 인수 개수가 일정하지 않은 메서드를 정의해야 한다면 가변인수가 반드시 필요하다. 메서드를 정의할 때 필수 매개변수는 가변인수 앞에 두고, 가변인수를 사용할 때는 성능 문제까지 고려하자.
[이펙티브 자바] 아이템 52. 다중정의는 신중히 사용하라 다중정의 : 메서드 이름은 같지만 매개변수의 타입이나 개수가 다른 여러 메서드를 정의하는 것.public class Calculator { // 두 개의 정수를 더하는 메서드 public int add(int a, int b) { return a + b; } // 세 개의 정수를 더하는 메서드 public int add(int a, int b, int c) { return a + b + c; } // 문자열을 더하는 메서드 (문자열 연결) public String add(String a, String b) { return a + b; }} 다중정의를 피할 수 없는 경우 :  매개변수 타입 변환public clas..
[이펙티브 자바] 아이템 51. 메서드 시그니처를 신중히 설계하라 메서드 이름을 신중히 짓자.표준 명명 규칙을 따라야 한다. 이해할 수 있고, 일관되게 지어야 한다.편의 메서드를 너무 많이 만들지 말자.메서드가 너무 많은 클래스는 익히고, 사용하고 문서화하고, 테스트하고, 유지보수하기 어렵다.매개변수 목록은 짧게 유지하자.4개 이하가 좋다. 4개가 넘어가면 기억하기 쉽지 않다. 같은 타입의 매개변수 여러 개가 연달아 나오는 경우가 특히 해롭다.매개변수의 타입으로는 클래스보다는 인터페이스가 더 낫다.매개변수로 적합한 인터페이스가 있다면 그 인터페이스를 직접 사용하자. 예를 들어 메서드에 HashMap을 넘길 일은 전혀 없다면 Map을 사용하자.boolean보다는 원소 2개 짜리 열거 타입이 낫다.열거 타입을 사용하면 코드를 읽고 쓰기가 더 쉬워진다.
[이펙티브 자바] 아이템 50. 적시에 방어적 복사본을 만들라 방어적 복사(defensive copying) : 가변 객체를 다룰 때, 해당 객체를 외부로부터 보호하기 위해 사용되는 기법이다. 이 기법은 객체의 내부 상태를 변경할 수 없도록 하기 위해 객체를 복사하여 사용하는 것을 의미한다. 악의적인 의도를 가진 사람들이 시스템의 보안을 뚫으려는 시도가 늘고있는만큼, 클라이언트가 내가 작성한 코드의 불변식을 깨뜨리려 혈안이 되어 있다고 가정하고 방어적으로 프로그래밍해야한다. 생성자에서 받은 가변 매개변수 각각을 방어적 복사하고, 이 복사본으로 유효성을 검사해야한다. 그리고 인스턴스 안에서는 원본이 아닌 복사본을 사용한다. 그리고 이때 매개변수가 제3자에 의해 확장할 수 있는 타입이라면 방어적 복사본을 만들 때  clone을 사용해서는 안 된다.clone() 메서드는..
[이펙티브 자바] 아이템 49. 매개변수가 유효한지 검사하라 매개변수 유효성 검사는 메서드나 함수가 실행되기 전에 입력 값이 기대한 조건을 충족하는지 확인하는 과정이다. 이를 통해 잘못된 입력이 메서드나 함수에 전달되는 것을 방지할 수 있다. 아래 코드처럼 문서화하고 명시적으로 검사할 수 있다./** * 두 개의 양수를 더하는 메서드 * @param a 첫 번째 양수 * @param b 두 번째 양수 * @return 두 양수의 합 * @throws IllegalArgumentException 매개변수가 음수인 경우 발생 */public int add(int a, int b) { if (a  핵심 정리 : 메서드나 생성자를 작성할 때면 그 매개변수들에 어떤 제약이 있을지 생각해야 한다. 그 제약들을 문서화하고 메서드 코드 시작 부분에서 명시적으로 검사해야 한..
[이펙티브 자바] 아이템 48. 스트림 병렬화는 주의해서 사용하라 병렬화를 사용하면 여러 프로세스 또는 스레드를 동시에 실행하여 작업을 처리한다. 이렇게 함으로써 여러 프로세서 또는 코어를 활용하여 작업을 분산시키고 병렬적으로 실행함으로써 전체 작업을 효율적으로 처리할 수 있다. 하지만 스트림 병렬화는 절대 시도조차 하지 말자. 데이터 소스가 Stream.iterate 거나 중간 연산으로 limit을 쓰면 파이프라인 병렬화로는 성능 개선을 기대할 수 없다. Stream.iterate 메서드는 무한한 요소 시퀀스를 생성하므로 병렬 처리가 어렵다. 또한 limit 메서드는 요소의 수를 제한하기 때문에 요소를 나누어 병렬 처리하는 것이 어려워진다. 이러한 상황에서는 파이프라인 병렬화로 성능 향상을 기대하기 어렵다.  스트림을 잘못 병렬화하면 (응답 불가를 포함해) 성능이 나..
[이펙티브 자바] 아이템 47. 반환 타입으로는 스트림보다 컬렉션이 낫다 컬렉션(Collection):일련의 객체를 저장하고 관리하는 자료구조.주요 컬렉션 인터페이스에는 List, Set, Queue 등이 있으며, 각각 ArrayList, LinkedList, HashSet, TreeSet, PriorityQueue 등의 구현체가 있다.컬렉션은 데이터를 저장하고 필요할 때 검색, 추가, 삭제 등의 작업을 수행할 수 있다.컬렉션은 데이터의 저장 순서가 보장될 수 있고, 중복된 요소를 허용할 수도 있다.스트림(Stream):데이터를 처리하는 파이프라인 형태의 API.자료 처리 연산을 지원하며, 이를 이용하여 데이터를 필터링, 매핑, 정렬, 그룹화하는 등의 작업을 수행할 수 있다.스트림은 컬렉션, 배열, 파일 등의 데이터 소스에서 데이터를 가져와서 연속된 연산을 수행한다.스트림은 ..
[이펙티브 자바] 아이템 46. 스트림에서는 부작용 없는 함수를 사용하라 수집기(collector) : 스트림의 최종 연산(terminal operation) 중 하나로, 스트림의 요소를 수집하여 다양한 형태로 결과를 생성하거나 반환하는 역할을 한다.  toList(): 스트림의 요소를 리스트로 수집한다.toSet(): 스트림의 요소를 집합(Set)으로 수집한다.toMap(): 스트림의 요소를 맵(Map)으로 수집한다.joining(): 문자열 요소를 하나의 문자열로 연결한다.groupingBy(): 지정된 기준에 따라 스트림의 요소를 그룹화한다.스트림과 수집기를 사용한 예시import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class Main ..