profile
측정할 수 없으면 관리할 수 없고, 관리할 수 없으면 개선시킬 수도 없다

[아이템 31] 한정적 와일드카드를 사용해 API 유연성을 높이라

매개변수화 타입은 불공변임 서로 다른 타입 Type1 과 Type2 가 있을 때 List<Type1> 은 List<Type2> 의 하위 타입도 상위 타입도 아님즉 List<String> 은 List<Object>의 하위 타입이 아니라는 뜻임따지고

2022년 5월 21일
·
0개의 댓글
·

[아이템 30] 이왕이면 제네릭 메서드로 만들라

클래스와 마찬가지로, 메서드도 제네릭으로 만들 수 있음, 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭임(예컨대 Collections의 알고리즘 메서드는 모두 제네릭임)제네릭 메서드 작성법은 제네릭 타입 작성법과 비슷함위 메서드는 컴파일은 되지만 경고가 두

2022년 5월 21일
·
0개의 댓글
·

[아이템 29] 이왕이면 제네릭 타입으로 만들라

위 클래스는 원래 제네릭 타입이어야 마땅함, 여기서 이 클래스를 제네릭으로 바꾼다고 해도 현재 버전을 사용하는 클라이언트에는 해가 없음, 오히려 지금 상태에서의 클라이언트는 스택에서 꺼낸 객체를 형변환해야 하는데 이때 런타임 오류가 날 위험이 있음먼저 일반 클래스를 제

2022년 5월 16일
·
0개의 댓글
·

[아이템 28] 배열보다는 리스트를 사용하라

배열과 제네릭 타입에는 중요한 차이가 두 가지 있음배열은 공변(Covariant)임, Sub 가 Super 의 하위 타입이라면 배열 Sub\[] 는 Super\[] 의 하위 타입이 되고 함께 변함제네릭은 불공변(invariant)임 서로 다른 타입 Type1 과 Typ

2022년 5월 16일
·
0개의 댓글
·

[아이템 27] 비검사 경고를 제거하라

제네릭을 사용하기 시작하면 수많은 컴파일러 경고를 보게 될 것임비검사 형변환 경고, 비검사 메서드 호출 경고, 비검사 매개변수화 가변인수 타입 경고, 비검사 변환 경고 등대부분의 비검사 경고는 쉽게 제거할 수 있음, 아래의 예시를 볼 수 있음이처럼 할 수 있는 한 모든

2022년 5월 8일
·
0개의 댓글
·

[아이템 26] 로 타입은 사용하지 말라

클래스와 인터페이스 선언에 타입 매개변수가 쓰이면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라고 함제네릭 클래스와 제네릭 인터페이스를 통틀어서 제네릭 타입이라고 함각각의 제네릭 타입은 일련의 매개변수화 타입을 정의함먼저 클래스(혹은 인터페이스) 이름이 나오고 이어서

2022년 5월 8일
·
0개의 댓글
·

[아이템 25] 톱레벨 클래스는 한 파일에 하나만 담으라

소스 파일 하나에 톱레벨 클래스를 여러 개 선언하면 위험할 수 있음, 한 클래스를 여러 가지로 정의할 수 있으며 그 중 어느것을 사용할지는 어느 소스 파일을 먼저 컴파일하냐에 따라 달라지기 때문에그리고 Utensil 와 Dessert 가 한 파일에 아래와 같이 각각 정

2022년 4월 30일
·
0개의 댓글
·

[아이템 24] 멤버 클래스는 되도록 static으로 만들라

중첩 클래스란 다른 클래스 안에 정의된 클래스를 말함중첩 클래스는 자신을 감싼 바깥 클래스에서만 쓰여야 하며, 그 외의 쓰임새가 있다면 톱레벨 클래스로 만들어야함중첩 클래스의 종류는 정적 멤버 클래스, (비정적) 멤버 클래스, 익명 클래스, 지역 클래스가 있는데 이 중

2022년 4월 30일
·
0개의 댓글
·

[아이템 23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라

두 가지 이상의 의미를 표현할 수 있으며, 그 중 현재 표현하는 의미를 태그 값으로 알려주는 클래스가 있음, 아래와 같이 예를 볼 수 있음위와 같은 태그 달린 클래스는 열거 타입 선언, 태그 필드, switch문 등 쓸데없는 코드가 많음여러 구현이 섞여서 가독성도 나쁘

2022년 4월 27일
·
0개의 댓글
·

[아이템 22] 인터페이스는 타입을 정의하는 용도로만 사용하라

인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 함달리 말해, 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에 얘기해주는 것임, 인터페이스는 오직 이 용도로만 사용해야함이 지침에 맞지 않는 예로

2022년 4월 27일
·
0개의 댓글
·

[아이템 21] 인터페이스는 구현하는 쪽을 생각해 설계하라

자바 8 전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었음, 인터페이스에 메서드를 추가하면 보통은 컴파일 오류가 나는데 추가된 메서드가 우연히 기존 구현체에 이미 존재할 가능성은 아주 낮기 때문임자바 8에서는 기존 인터페이스에 메서드를 추

2022년 4월 27일
·
0개의 댓글
·

[아이템 20] 추상 클래스보다는 인터페이스를 우선하라

자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스임, 이렇게 두 메커니즘은 모두 인스턴스 메서드를 구현 형태로 제공할 수 있음둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점임자바는 단

2022년 4월 16일
·
0개의 댓글
·

[아이템 19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라

아이템 18에서는 상속을 염두에 두지 않고 설계했고 상속할 때의 주의점도 문서화해놓지 않은 외부 클래스를 상속할 때의 위험을 경고함(외부란, 프로그래머의 통제권 밖에 있어서 언제 어떻게 변경될지 모른다는 뜻임)메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여

2022년 4월 16일
·
0개의 댓글
·

[아이템 18] 상속보다는 컴포지션을 사용하라

상속은 코드를 재사용하는 강력한 수단이지만 최선은 아님, 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 됨이는 만약 패키지 경계를 넘어 다른 패키지의 구체 클래스를 상속하는 일은 위험함(여기서 상속은 클래스가 다른 클래스를 확장하는 구현 상속을 말함, 클래스가 인

2022년 4월 9일
·
0개의 댓글
·

[아이템 17] 변경 가능성을 최소화하라

불변 클래스란 그 인스턴스의 내부 값을 수정할 수 없는 클래스임(자바에 String, 기본 타입의 박싱된 클래스들, BingInteger, BigDecimal이 이에 속함)불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않음불변 클래스는

2022년 4월 9일
·
0개의 댓글
·

[아이템 16] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라

인스턴스 필드들을 모아놓는 일 외에는 아무 목적도 없는 퇴보한 클래스가 있음이런 클래스에선 public 이어선 안됨, 데이터 필드에 직접 접근할 수 있어도 캡슐화의 이점을 제공하지 못함API를 수정하지 않고는 내부 표현을 바꿀 수 없고, 불변식을 보장할 수 없으며, 외

2022년 3월 27일
·
0개의 댓글
·
post-thumbnail

[아이템 15] 클래스와 멤버의 접근 권한을 최소화하라

잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨 구현과 API를 깔끔히 분리함오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전혀 개의치 않음, 정보 은닉 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리임정보은닉은 시스

2022년 3월 27일
·
0개의 댓글
·

[아이템 14] Comparable을 구현할지 고려하라

Comparable 인터페이스의 유일한 메서드 compareTo는 Object 메서드가 아니며 단순 동치성 비교에 더해 순서까지 비교할 수 있으며 제네릭함Comparable을 구현했다는 것은 그 클래스의 인스턴스에는 자연적인 순서가 있음을 뜻함검색, 극단값 계산, 자동

2022년 3월 3일
·
0개의 댓글
·

[아이템 13] clone 재정의는 주의해서 진행하라

cloneable은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스지만, 아쉽게도 의도하나 목적을 제대로 이루지 못했음 왜냐하면 clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이고 그마저도 protected라는데 있음 그래서 Clon

2022년 3월 2일
·
0개의 댓글
·

[아이템 12] toString을 항상 재정의하라

toString메서드가 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없음, 단순히 클래스\_이름@16진수로\_표시한\_해시코드를 반환할 뿐임해당 메서드에 일반 규약은 간결하면서 사람이 읽기 쉬운 형태의 유익한 정보를 반환해야함, 모든 하위 클래스에서 이

2022년 2월 23일
·
0개의 댓글
·