본문 바로가기

Effective Java

(5)
[이펙티브 자바] 아이템 20. 추상 클래스보다는 인터페이스를 우선하라 1) 추상 클래스 vs 인터페이스-자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스, 이렇게 두 가지다.  자바 8부터 인터페이스도 디폴트 메서드(default method)를 제공할 수 있게 되어,  이제는 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있다.  - 한편, 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는  반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다.  자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는데   커다란 제약을 안게 되는 셈이다. - 반면, 인터페이스가 선언한 메서드를 모두 정의하고  그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다.  2) 인터페이스의 장점..
[이펙티브 자바] 아이템 65. 리플렉션보다는 인터페이스를 사용하라 1) 리플렉션(reflection)이란?   - 리플렉션 기능(java.lang.reflect)을 이용하면 프로그램에서 임의의 클래스에 접근할 수 있습니다.  Class 객체가 주어지면 그 클래스의 생성자, 메서드, 필드에 해당하는   Constructor, Method, Field 인스턴스를 가져올 수 있습니다.   그리고 이 인스턴스들로는 그 클래스의 멤버 이름, 필드 타입, 메서드 시그니처 등을 가져올 수 있습니다.  - 나아가 Constructor, Method, Field 인스턴스를 이용해 각각에 연결된   실제 생성자, 메서드, 필드를 조작할 수도 있습니다.   이 인스턴스들을 통해 해당 클래스의 인스턴스를 생성하거나, 메서드를 호출하거나,  필드에 접근할 수 있다는 뜻입니다.  -  예를 들..
[이펙티브 자바] 아이템69. 예외는 진짜 예외 상황에만 사용하라 1) 잘못된 코드 try { int i = 0; while(true) range[i++].climb();}catch (ArrayIndexOutOfBoundsException e){} - 무슨 일을 하는 코드인지 알겠는가? 전혀 직관적이지 않다는 사실 하나만으로도 코드를 이렇게   작성하면 안 되는 이유는 충분하다.   이 코드는 배열의 원소를 순회하는데, 아주 끔찍한 방식으로 하고 있다.  무한루프를 돌다가 배열의 끝에 도달해 ArrayIndexOutOfBoundsException이 발생하면 끝을 내는 것이다.   2) 개선된 코드.for (Mountain m: range) m.climb();  3) 예외를 사용해 종료하는 반복문의 해악   - 그런데 예외를 써서 루프를 종료한 이유는 도..
[이펙티브 자바] 아이템 44. 표준 함수형 인터페이스를 사용하라 1) 개요- 자바가 람다를 지원하면서 API를 작성하는 모범 사례도 크게 바뀌었다.  예컨대, 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는  템플릿 메서드 패턴의 매력이 크게 줄었다.  이를 대체하는 현대적인 해법은 같은 효과의 함수 객체를 받는 정적 팩터리나 생성자를 제공하는 것이다.   이 내용을 일반화해서 말하면 함수 객체를 매개변수로 받는 생성자와 메서드를 더 많이 만들어야 한다.  이 때, 함수형 매개변수 타입을 올바르게 선택해야 한다. - LinkedHashMap을 생각해보자.  이 클래스의 protected 메서드인 removeEldestEntry를 재정의하면 캐시로 사용할 수 있다.  맵에 새로운 키를 추가하는 put 메서드는 이 메서드를 호출하여 true가 반환되면  맵에..
[이펙티브 자바] 아이템 45. 스트림은 주의해서 사용하라 1) 스트림이란?- 스트림 API는 다량의 데이터 처리 작업(순차적이든 병렬적이든)을 돕고자 자바8에 추가되었다.  이 API가 제공하는 추상 개념 중 핵심은 두 가지다.  그 첫 번째인 스트림(stream)은 데이터 원소의 유한 혹은 무한 시퀀스(sequence)를 뜻한다.  두 번째인 스트림 파이프라인(stream pipeline)은 이 원소들로 수행하는 연산 단계를 표현하는 개념이다.  스트림의 원소들은 어디로부터든 올 수 있다.  대표적으로는 컬렉션, 배열, 파일, 정규표현식 패턴 매처(matcher), 난수 생성기, 혹은 다른 스트림이 있다.  스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값이다.  기본 타입 값으로는 int, long, double 이렇게 세 가지를 지원한다.   2) ..