Hwanny

Written by@Myunghwan
Nothing changes if nothing changes

GitHub

Effective Java - Item 22

인터페이스는 타입을 정의하는 용도로만 사용하라 인터페이스는 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할을 한다. 클래스가 어떤 인터페이스를 구현한다는 것은 자신의 인스턴스로 무엇을 할 수 있는지를 클라이언트에게 얘기해주는 것이다. 인터페이스는 오직 이 용도로만 사용해야 한다. 맞지 않는 예) 상수 인터페이스 : 메서드 없이, 상수를 뜻하는…

Effective Java - Item 20

추상 클래스보다는 인터페이스를 우선하라 자바가 제공하는 다중 구현 메커니즘 : 인터페이스, 추상 클래스 자바 8부터 인터페이스도 디폴트 메서드(default method)를 제공할 수 있게 되어, 이제는 두 메커니즘 모두 인스턴스 메서드를 구현 형태로 제공할 수 있다. 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스…

Effective Java - Item 21

인터페이스는 구현하는 쪽을 생각해 설계하라 자바 8 전에는 기존 구현체를 깨뜨리지 않고는 인터페이스에 메서드를 추가할 방법이 없었다. 인터페이스에 메서드를 추가하면 보통은 컴파일 오류가 나는데, 추가된 메서드가 우연히 기존 구현체에 이미 존재할 가능성은 아주 낮기 때문이다. 자바 라이브러리의 디폴트 메서드는 코드 품질이 높고 범용적이라 대부분 상황에서 잘…

Effective Java - Item 19

상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야 한다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수도 있다. 그런데 마침 호출되는 메서드가 재정의 가능 메서드라면 그 사실을 호출하는 메서드의 API 설명…

Effective Java - Item 18

상속보다는 컴포지션을 사용하라 상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다. 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다. 일반적인 구체 클래스를 패키지 경계를 넘어, 즉 다른 패키지의 구체 클래스를 상속하는 일은 위험하다. 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 다르게 말하면, 상위 클래스가 어떻게 구현되느냐에 따…

Effective Java - Item 17

변경 가능성을 최소화하라 불변 클래스란 - 그 인스턴스의 내부 값을 수정할 수 없는 클래스다. 불변 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 달라지지 않는다. (String, 기본 타입의 박싱된 클래스들, BigInteger, BigDecimal) 불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도…

Effective Java - Item 16

public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 이런 클래스는 데이터 필드에 직접 접근할 수 있으니 캡슐화의 이점을 제공하지 못한다. -> 필드들을 모두 private으로 바꾸고 public 접근자(getter)를 추가한다. public 클래스에서라면 이 방식이 확실히 맞다. 패키지 바깥에서 접근할 수 있는 클래스라면 접근자를 …

Effective Java - Item 15

클래스와 멤버의 접근 권한을 최소화하라 어설프게 설계된 컴포넌트와 잘 설계된 컴포넌트의 가장 큰 차이는 바로 클래스 내부 데이터와 내부 구현 정보를 외부 컴포넌트로부터 얼마나 잘 숨겼느냐다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통하며 서로의 내부 동작 방식에는 전…

Effective Java - Item 14

Comparable을 구현할지 고려하라 Comparable 인터페이스의 유일무이한 메서드인 compareTo는 Object의 메서드가 아니다. compareTo가 Object의 equals와 다른 점 단순 동치성 비교에 더해 순서까지 비교할 수 있음 제네릭함 Comparable을 구현했다는 것은 그 클래스의 인스턴스들에는 자연적인 순서가 있음을 뜻한다.…

Effective Java - Item 13

clone 재정의는 주의해서 진행하라 clone 메서드가 선언된 곳이 Cloneable이 아닌 Object이고, protected이다. 그래서 Cloneable을 구현하는 것만으로는 외부 객체에서 clone 메서드를 호출할 수 없다. clone 메서드를 잘 동작하게끔 해주는 구현 방법 언제 그렇게 해야하는지 가능한 다른 선택지 메서드 하나 없는 Clone…