목록Effective Java (19)
개발일기
핵심내용자바가 제공하는 다중 구현 메커니즘 인터페이스, 추상 클래스 두가지 자바 8부터 디폴트 메서드 제공 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공 할 수 있음. Comparable, Iterable, AutoCloseable 인터페이스가 새로 추가 됐을 때, 표준 라이브러리의 수많은 기존 클래스가 인터페이스들을 구현한 채 릴리스 기존 클래스에 추상 클래스를 끼워넣는게 어려움 why? 모든 자손이 추상 클래스를 상속하기 때문임. => 문제되는 이유 필요 없는 기능이라도 상속되기 때문임. 인터페이스는 믹스인(mixin) 정의에 안성맞춤이다. 믹스인이란? 무엇인가? 다른 클래스가 구현해야 하는 메서드 정의하지만, 독립적인 객체 상속 구조와 관계없이 추가적인 기능을 제공하는 데 사용되는 설계 패..
메서드로 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 한다. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용)문서로 남겨야 한다. 메서드 주석에 @implSpec 태그를 붙여주면 자바독 도구가 생성해줌.내부 매커니즘을 문서로 남기는 것만이 상속을 위한 설계의 전부는 아님. 효율적인 하위 클래스를 큰 어려움 없이 만들 수 있게 하려면 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅(hook)을 잘 선별하여 protected 메서드 형태로 공개해야 할 수도 있다. removeRange 메서드 예시) protected the removeRange(int fromIndex, int toIndex) fromIndex(포함) ~ toIndex(미포함)까지의 ..
나는 상속이 객체지향적으로 어느정도 완벽한 개념이라고 생각했었던거 같다. 하지만, 이번장을 읽고 상속에 대해서 다시 생각해보는 계기가 되었다. 상속은 부모타입에 강하게 결합이 생긴다. 이로인해서 부모타입과 자식타입관계의 강한 결합이 생기며, 부모에 있는 코드가 바뀐다면, 자식에 있는 코드들이 정상작동하지 않을 확률이 높아진다. 여기서 말하는 상속은 인터페이스로 확장하는 상속이 아닌 클래스가 다른 클래스를 확장하는 구현 상속을 말함. 핵심 정리- 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있음.- 하위 클래스에 얼마나 영향을 끼칠지 여파를 알 수 없음. public class InstrumentedHashSet extends HashSet { // 추가된 원소의..
핵심 정리불변 클래스란 그 인스턴스 내부 값을 수정할 수 없는 클래스생성~파괴까지 절대 달라지지 않음String, 기본 타입의 박싱 클래스, BigInteger, BigDecimal 불변 클래스이다. 불변 클래스의 장점은 클래스보다 설계하고 구현 및 사용이 쉬움. 오류 가능성도 ⬇ 클래스 불변을 만들기 위한 다섯가지 규칙1. 객체 상태 변경하는 메서드 제공 ❌2. 클래스 확장 할 수 없도록 함. -> 하위 클래스에서 나쁜의도로 객체 상태 변하게 만드는 사태 방지3. 모든 필드를 final 선언 -> 스레드에도 안전함4. 모든 필드를 private 선언 -> 가변 객체를 클라이언트가 직접 수정하는 일을 막아줌️️5. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다. => 가변 객체를 참조하는 필..
이처럼 퇴보한 클래스는 public X class Point { public double x; public double y;} 데이터 필드에 접근할 수 있어 캡슐화 이점 제공 x API 수정하지 않고는 내부 표현 바꿀 수 없음, 불변식을 보장할 수도 없다. 접근자와 변경자(mutator)메서드를 활용해 데이터를 캡슐화class Point { private double x; private double y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x;} public double getY() { ret..
잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐다 - 시스템 개발 속도를 높일 수 있음. 여러 컴포넌트를 병렬로 개발할 수 있기 때문- 시스템 관리 비용 ⬇️ 각 컴포넌트 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적다.- 정보 은닉 자체가 성능을 높여주지는 않지만, 성능 최적화에 도움이된다. -> 해당 컴포넌트에만 집중 할 수 있기 때문이다.- 소프트웨어 재사용성을 높인다. 외부에 거의 의존하지 않고 독자적으로 동작할 수 있는 컴포넌트라면 그 컴포넌트와 함께 개발되지 않은 환경에도 적용될 가능성이 높다.- 큰 시스템을 제작하는 난이도를 낮춰준다. 큰 시스템 제작 난이도를 낮춰준다고 하는데 아무래도 ..
💡핵심 주제comparable 인터페이스의 유일무이한 메서드인 compareToComparable 구현했다는 것은 클래스의 인스턴들에는 자연적인 순서 있음Comparable 구현 객체들의 배열 손쉽게 정렬 Arrays.sort(a); 검색, 극단값 계산, 자동 정렬되는 컬렉션 관리도 쉽게 할 수 있음아래 코드는 종복 제거 후, 알파벳 순으로 출력 why? String이 Comparable 구현 import java.util.Collections;public class WordList { public static void main(String[] args) { Set s = new TreeSet(); Collections.addAll(s, args); Syst..
Object의 기본 toString 메서드는 우리가 작성한 클래스 적절한 문자열 반환 x -> 클래스_이름@16진수로_표시한_해시코드 반환toString 일반 규약에 따라 '간결하면서 사람이 읽기 쉬운 형태의 유익한 정보 반환'equals and hashCode 규약 만큼 중요하지 않지만, toString 잘 구현한 클래스는 디버깅하기 쉽다.toString 메서드는 println, pringf, assert 구문에 넘길 때, 디버거가 객체를 출력할 때 자동으로 호출 실전에서 toString은 그 객체가 가진 주요 정보 모두를 반환하는게 좋음 포맷을 명시하든 아니든 의도를 명확히 밝혀야 한다./** * XXX-YYY-ZZZZ 형태의 12글자로 구성 * XXX 지역 코드 , YYY 프리픽스 , ZZZZ 가입..