백수의 개발/이펙티브 자바
-
Item 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라백수의 개발/이펙티브 자바 2019. 10. 5. 12:03
상속을 위한 문서화 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 남겨야한다. 클래스의 API로 공개된 메서드에서 클래스 자신의 또 다른 메서드를 호출할 수 있다. 이 때 호출하는 메서드가 재정의 가능 메서드라면 그 사실을 호출하는 메서드의 API 설명에 적시해야 한다. 덧붙여 어떤 순서로 호출하는지, 각각의 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담아야 한다. * API 문서의 메서드 설명 끝에 "Implementation Requirements"라고 되어 있다면, 그 메서드의 내부 동작 방식을 설명하는 것이다. 아래는 java.util.AbstactCollection API문서의 remove 메서드이다. 해당 메서드의 기능에 대해 우선 이야기를 하고, implem..
-
Item 18. 상속보다는 컴포지션을 사용하라백수의 개발/이펙티브 자바 2019. 10. 4. 12:42
상속 상속은 코드를 재사용하는 강력한 수단이다. 하지만, 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다. 이 장에서의 상속은 클래스가 다른 클래스를 확장하는 구현 상속을 말하는 것이며, 클래스가 인터페이를 구현하거나 인터페이스가 다른 인터페이스를 확장하는 인터페이스 상속에 대한 이야기는 아니다. 상위 클래스는 릴리스마다 내부 구현이 달라질 수 있으며, 그 여파로 코드 한 줄 건드리지 않은 하위 클래스가 오작동할 수 있다. 오류 가능성이 있는 상속 아래 HashSet을 상속하는 InstrumentedHashSet에 대한 코드를 살펴보자. public class InstrumentedHashSet extends HashSet { private int addCount = 0; public Instr..
-
Item 17. 변경 가능성을 최소화하라백수의 개발/이펙티브 자바 2019. 10. 2. 16:38
불변 클래스 인스턴스의 내부 값을 수정할 수 없는 클래스이다. 불변 클래스의 인스턴스는 객체가 생성되는 시점에 초기화 되고 소멸될 때까지 절대 달라지지 않는다. 불변 클래스는 가변 클래스보다 설계하고 구현하기 쉽다. 불변 클래스는 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다. 불변 클래스를 만드는 5가지 규칙 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. 클래스를 확장할 수 없도록(상속을 막는다) 한다. 클래스를 final로 선언 모든 생성자를 private로 선언, 생성자 정적 팩터리 메서드를 제공 모든 필드를 final로 선언한다. (스레드 안전함) 모든 필드를 private로 선언한다. 자신 외에는 내부의 가변 컴포넌트에 접근 할 수 없도록 한다. 객체의 참조를 얻을 수 없..
-
Item 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라백수의 개발/이펙티브 자바 2019. 10. 1. 12:31
class Point{ public double x; public double y; } 위와 같은 클래스는 데이터 필드에 직접 접근할수 있으니 캡슐화의 이점을 제공하지 못한다.(퇴보한 클래스) API를 수정하지 않고는 내부 표현을 바꿀 수 없다. 불변식을 보장할 수 없다. 외부에서 필드에 접근할 때 부수 작업을 수행할 수 없다. 따라서, 필드들을 모두 private로 바꾸고 public 접근자(getter)를 추가한다. 접근자와 설정자 제공 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; } publi..
-
Item 15. 클래스와 멤버의 접근 권한을 최소화하라백수의 개발/이펙티브 자바 2019. 9. 30. 12:00
잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔히 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통하며, 서로의 내부 동작 방식에는 전혀 개의치 않는다. 정보 은닉, 혹은 캡슐화라고 하는 이 개념은 소프트웨어 설계의 근간이 되는 원리다. 정보 은닉의 장점 시스템 개발 속도를 높인다. 여러 컴포넌트를 병렬로 개발할 수 있기 때문이다. 시스템 관리 비용을 낮춘다. 각 컴포넌트를 더 빨리 파악하여 디버깅할 수 있고, 다른 컴포넌트로 교체하는 부담도 적기 때문이다. 정보 은닉 자체가 성능 향상을 시키지는 않지만, 성능 최적화에 도움을 준다. 다른 컴포넌트에 영향을 주지 않고 해당 컴포넌트만 최적화할 수 있도록 하기 때문이다. 소프트웨어의 재사용성을 높인다. 외부에 거의 의존하지 ..
-
Item 14. Comparable을 구현할지 고려하라백수의 개발/이펙티브 자바 2019. 9. 29. 19:45
Comparable의 compareTo()는 단순 동치성 비교뿐만 아니라 순서까지 비교할 수 있으며, 제네릭하다. 따라서 Comparable을 구현했다는 것은 해당 클래스의 순서가 있음을 의미한다. 그로 인해 아래와 같이 간단하게 정렬을 사용할 수 있는 객체가 된다. Arrays.sort(a); CompareTo 메서드의 일반 규약 이 객체와 주어진 객체의 순서를 비교한다. 이 객체가 주어진 객체보다 작으면 음의 정수(-1)를, 같으면 0을, 크면 양의 정수(1)를 반환한다. 이 객체와 비교할 수 없는 타입이 주어지면 ClassCaseException을 던진다. 1. 대칭성 Comparable을 구현한 클래스는 모든 x, y에 대해 sgn(x.compareTo(y)) == -sgn(y.compareTo(..
-
Item 13. clone 재정의는 주의해서 진행하라백수의 개발/이펙티브 자바 2019. 8. 27. 20:32
Cloneable 인터페이스 Cloneable은 복제해도 되는 클래스임을 명시하는 용도의 믹스인 인터페이스(mixin interface)이다. 그러나 clone 메서드가 Cloneable이 아닌 Object에 protected로 명시되어 있다. 그래서 Cloneable을 구현한다고 해서 clone을 호출할 수 없다. 그럼에도 불구하고 Cloneable 방식은 널리 사용되고 있어 올바르게 사용하는 방법을 알아보자. Cloneable의 역할 메서드 하나 없는 Cloneable 인터페이스는 Object의 protected 메서드인 clone의 동작 방식을 결정한다. Cloneable을 구현한 클래스의 인스턴스에서 clone을 호출하면 그 객체의 필드들을 모두 복사한 객체를 반환하며, 그렇지 않은 클래스의 인스..
-
Item 12. toString을 항상 재정의하라백수의 개발/이펙티브 자바 2019. 8. 22. 17:38
Object의 기본 toString 메서드는 우리가 작성한 클래스에 적합한 문자열을 반환하는 경우는 거의 없다. 일반적으로 TestClass@a7cd(클래스이름@16진수로 표시된 해시코드)와 같이 보여줄 뿐이다. 그래서 toString을 재정의하여 사람이 읽기 쉬운 형태의 유익한 정보를 반환할 필요가 있다. toString를 재정의하는 이유 전화번호를 저장하는 PhoneNumber객체가 있을 때, 이를 출력한다고 가정해보자. PhoneNumber Jeny = new PhoneNumber(707, 867, 5309); System.out.println("Jeny PhoneNumber : " + Jeny); 이와 같이 했을 때, 'Jeny PhoneNumber : PhoneNumber@abcd'와 'Jeny..