이팩티브 자바
-
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 2. 생성자에 매개변수가 많다면 빌더를 고려하라백수의 개발/이펙티브 자바 2019. 7. 9. 15:00
점층적 생성자 패턴(Telescoping constructor pattern) 필수 매개변수만 받는 생성자부터 시작하여 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 2개 받는 생성자, ..., 선택 매개변수를 전부 다 받는 생성자까지 모든 생성자를 작성하는 방식이다. 아래와 같이 클래스를 정의할 수 있다. public class NutritionFacts{ private final int servingSize; // 필수 private final int servings; // 필수 private final int calories; // 선택 private final int fat; // 선택 private final int sodium; // 선택 private final int ..